{"version":3,"sources":["shared/utils.ts","serviceWorker.ts","notifications/notification.types.ts","notifications/notifications.slice.ts","shared/httpError.class.ts","shared/enums/api-hosts.enum.ts","shared/api-request.ts","companies/companies.slice.ts","shared/api/companiesApi.ts","shared/api/dependentsApi.ts","shared/utils/deep-map.ts","shared/utils/deep-trim.ts","enter-cobra-qe/cobra-qe.slice.ts","shared/api/participantApi.ts","participant-search/participant.thunks.ts","participant-search/participant.slice.ts","plan-enrollment/plan-enrollment.slice.ts","components/app-settings.thunks.ts","shared/api/appSettingsApi.ts","shared/enums/api-fetch-status.enum.ts","components/app-settings.slice.ts","participant-overview/participant-overview.types.ts","shared/api/enrollmentApi.ts","participant-overview/enrollment/enrollments.slice.ts","participant-overview/participant-overview.slice.ts","shared/constants.ts","direct-billing/direct-billing.slice.ts","shared/api/directBillingApi.ts","manage-settings/manage-users/manage-users.slice.ts","shared/api/responsibilitiesApi.ts","shared/api/permissionsApi.ts","shared/api/usersApi.ts","open-enrollment-resources/open-enrollment-resources.slice.ts","shared/api/enrollmentResourcesApi.ts","file-history/file-history.slice.ts","shared/api/fileHistoryApi.ts","marketing-info-tile/slideshow.thunks.ts","shared/api/slideshowApi.ts","marketing-info-tile/slideshow.slice.ts","report-history/report-history.slice.ts","shared/api/reportHistoryApi.ts","cobra-pending-initial/cobra-pending-initial-notices.slice.ts","shared/api/cobraInitialNoticesApi.ts","manage-settings/contact-info/contact-info.slice.ts","shared/api/contactInfoApi.ts","shared/api/cobraQeApi.ts","cobra-pending-qe/cobra-pending-qe-notices.slice.ts","reports/reports.slice.ts","shared/api/contributionsNotForwardedApi.ts","shared/api/annualAllocationAuditApi.ts","shared/api/customReportsByDateRangeApi.ts","reports/custom/custom-reports.slice.ts","shared/utils/get-percentage-from-boolean-array.ts","shared/enums/plan-types-string.enum.ts","re-enrollment-checklist/re-enrollment-utilities.ts","shared/utils/safe-filename.ts","re-enrollment-checklist/re-enrollment-checklist.thunks.ts","shared/api/reEnrollmentChecklistApi.ts","shared/api/cobraPlanTypesApi.ts","shared/api/cobraInsurersApi.ts","shared/api/cobraChecklistDocumentsApi.ts","re-enrollment-checklist/cobra-reenrollment-checklist/cobra-re-enrollment.types.ts","shared/enums/insurers.enum.ts","re-enrollment-checklist/re-enrollment-checklist.slice.ts","rates-history/rates-history.thunk.ts","shared/api/historicalRatesApi.ts","rates-history/rates-history.slice.ts","action-items/action-items.thunks.ts","shared/api/contributionStatusesApi.ts","action-items/action-items.slice.ts","store/slices/dependents/dependents.thunk.ts","store/slices/dependents/dependents.slice.ts","store/slices/direct-debit/direct-debit.thunk.ts","shared/api/directDebitAccountsApi.ts","store/slices/direct-debit/direct-debit.slice.ts","shared/api/fmlaReportsApi.ts","reports/fmla/fmla-reports.thunks.ts","reports/fmla/fmla-reports-slice.ts","leave-records/leave-records.thunk.ts","shared/api/leaveRecordsApi.ts","leave-records/leave-records.slice.ts","store/rootReducer.ts","store/middleware/server-logger.ts","store/middleware/sync-company-local-storage.ts","store/middleware/validators/utils/yupErrorsToObject.ts","re-enrollment-checklist/cobra/cover-letter/cobraOePacket.validators.ts","re-enrollment-checklist/cobra/cover-letter/cobraOePacket.middleware.ts","store/middleware/validators/re-enrollment/cobraOePackets.ts","re-enrollment-checklist/cobra-reenrollment-checklist/cobra-checklist-plan.validators.ts","store/middleware/validators/re-enrollment/cobraPlanOnDeck.ts","re-enrollment-checklist/cobra-reenrollment-checklist/cobra-checklist-plan.middleware.ts","re-enrollment-checklist/direct-bill-reenrollment-checklist/direct-bill-checklist.validators.ts","re-enrollment-checklist/direct-bill-reenrollment-checklist/direct-bill-checklist.middleware.ts","store/middleware/validators/re-enrollment/directBillChecklist.ts","store/middleware/validators/errors/handleErrorsMiddleware.ts","store/middleware/dependents/dependents.ts","store/slices/dependents/dependents.middleware.ts","store/index.ts","components/shared/avatar-color-palette.ts","components/shared/ParticipantSubHeader.tsx","authentication/Logout.tsx","components/layout/Header/UserMenuButton.tsx","companies/CompanyAvatar.tsx","components/layout/Header/UserMenu.tsx","participant-search/ParticipantResultsRow.tsx","participant-search/AddParticipantItem.tsx","participant-search/ParticipantSearchResults.tsx","components/shared/SearchInput.tsx","components/shared/HOC/WithDebounce.tsx","participant-search/ParticipantSearch.tsx","images/dash-logo.svg","components/layout/Header/FloresHeaderLogo.tsx","components/layout/Header/AppToolbar.tsx","components/layout/WizardLayout.tsx","navigation/NavItem.tsx","navigation/Navigation.tsx","components/layout/make-nav.ts","components/layout/sidebar-nav-config.ts","authorization/authorization.ts","components/layout/Sidebar.tsx","components/layout/DefaultLayout.tsx","routing/AppRoute.tsx","companies/CompanyTile.tsx","companies/CompanyList.tsx","components/shared/Loading.tsx","components/layout/PageContentPaper.tsx","shared/custom-hooks/usePageTitle.ts","components/pages/CompanySelect.tsx","account-manager-tile/AgentAvatar.tsx","account-manager-tile/AccountManagerTile.tsx","shared/custom-hooks/useNotifiers.ts","reports-tile/PlanYearSelect.tsx","reports-tile/non-plan-year/ParticipantCountSummary.tsx","components/shared/MonthSelect.tsx","shared/api/reportsApi.ts","shared/api/validateDate.ts","shared/api/reportQueryStringTag.ts","shared/api/activeParticipantsApi.ts","reports-tile/non-plan-year/NonPlanYearServiceSummary.tsx","shared/api/nonPlanYearServicesApi.ts","shared/custom-hooks/useDownloading.tsx","reports-tile/non-plan-year/FmlaSummaryTile.tsx","reports-tile/non-plan-year/FmlaSummary.tsx","reports-tile/non-plan-year/NonPlanYearServices.tsx","components/shared/CenterLabelDonutChart.tsx","reports-tile/plan-year/ReimbursementPlanSummary.tsx","reports-tile/ReportsTile.tsx","shared/api/planYearsApi.ts","action-items/action-item-cards/HsaContributionsNotForwardedCard.tsx","action-items/ActionItems.tsx","marketing-info-tile/EmblaCarouselSlide.tsx","marketing-info-tile/EmblaCarousel.tsx","components/pages/Dashboard.tsx","components/shared/WizardStepper.tsx","components/shared/PayrollIdParticipantLookupInput.tsx","shared/utils/omit-nil.ts","shared/common-validators.ts","enter-cobra-qe/personal-details/cobra-qe-personal-details.validators.ts","components/shared/LocationSelect.tsx","shared/custom-hooks/useLocationOptions.ts","components/shared/StateSelect.tsx","shared/form-helpers.ts","components/shared/ParticipantDetails.tsx","enter-cobra-qe/personal-details/CobraQePersonalDetails.tsx","components/shared/qe/ParticipantSummary.tsx","components/shared/qe/DependentsSummary.tsx","components/shared/qe/EventInfoSummary.tsx","enter-cobra-qe/summary/CobraQeSummary.tsx","enter-cobra-qe/event-info/event-info.validators.ts","components/shared/FormErrorText.tsx","enter-cobra-qe/event-info/EventTypeSelect.tsx","components/shared/HOC/WithLoopIcon.tsx","enter-cobra-qe/event-info/StateContinuationContent.model.ts","components/shared/HOC/WithModal.tsx","enter-cobra-qe/event-info/StateContinuation.tsx","enter-cobra-qe/event-info/EventInfoForm.tsx","shared/custom-hooks/useEventTypes.ts","enter-cobra-qe/event-info/EventInfo.tsx","components/shared/CancelModal.tsx","enter-cobra-qe/benefits/benefit-state-helpers.ts","enter-cobra-qe/benefits/BenefitSubsidyFields.tsx","enter-cobra-qe/benefits/BenefitDependents.tsx","enter-cobra-qe/benefits/BenefitsForm.tsx","enter-cobra-qe/benefits/cobra-benefits.validators.ts","enter-cobra-qe/benefits/BenefitsFormContainer.tsx","enter-cobra-qe/benefits/CobraQeBenefits.tsx","enter-cobra-qe/benefits/useCobraPlans.ts","components/shared/dependents/DependentsTableRow.tsx","components/shared/dependents/DependentsTable.tsx","components/shared/dependents/add-new-dependent/add-new-dependent.validators.ts","components/shared/dependents/add-new-dependent/AddNewDependent.tsx","components/shared/dependents/Dependents.tsx","enter-cobra-qe/dependents/CobraQeDependents.tsx","shared/custom-hooks/useHistoryBlock.ts","images/404.svg","components/pages/NotFound.tsx","enter-cobra-qe/enter-cobra-qe-steps.ts","enter-cobra-qe/EnterCobraQePage.tsx","reports/shared/ContributionsNotForwardedTable/ContributionsNotForwardedTable.tsx","components/pages/Scratchpad.tsx","fileupload/FileTypeSelect.tsx","fileupload/FileUpload.tsx","fileupload/useFileTypes.ts","components/shared/HistoryMonthSelect.tsx","report-history/ReportHistoryTableRow.tsx","report-history/ReportHistoryTable.tsx","components/shared/HistoryReportTypeFilter.tsx","report-history/ReportHistory.tsx","file-history/FileHistoryTableRow.tsx","file-history/FileHistoryTable.tsx","file-history/FileHistory.tsx","components/shared/TabPanel.tsx","shared/participant-info.validators.ts","participant-overview/general-info.validators.ts","components/shared/form/CommonSelect.tsx","components/shared/PayFreqSelect.tsx","shared/custom-hooks/usePayFrequencies.ts","participant-overview/GeneralInfo.tsx","participant-overview/enrollment/cancel-billing-event.validators.ts","participant-overview/enrollment/CancelBillingEvent.tsx","participant-overview/enrollment/DisplayCobRetLoaEnrollmentRow.tsx","participant-overview/enrollment/view-invoices/InvoiceDetailTableRow.tsx","participant-overview/enrollment/view-invoices/InvoiceDetailsTable.tsx","participant-overview/enrollment/view-invoices/useInvoiceDetails.ts","shared/api/invoicesApi.ts","participant-overview/enrollment/view-invoices/ViewInvoiceDetails.tsx","participant-overview/enrollment/view-invoices/InvoiceTableRow.tsx","participant-overview/enrollment/view-invoices/InvoicesTable.tsx","participant-overview/enrollment/view-invoices/useInvoices.ts","participant-overview/enrollment/view-invoices/ViewInvoices.tsx","participant-overview/enrollment/view-checks/CheckTableRow.tsx","participant-overview/enrollment/view-checks/CheckTable.tsx","participant-overview/enrollment/view-checks/ViewChecks.tsx","participant-overview/enrollment/view-checks/useChecks.ts","participant-overview/enrollment/view-documents/DocumentTableRow.tsx","participant-overview/enrollment/view-documents/DocumentsTable.tsx","participant-overview/enrollment/view-documents/ViewDocuments.tsx","participant-overview/enrollment/view-documents/useDocuments.ts","participant-overview/enrollment/DisplayCobRetLoaEnrollment.tsx","participant-overview/enrollment/PayDeductionValue.tsx","participant-overview/enrollment/PayPeriodDeductions.tsx","participant-overview/enrollment/PlanValue.tsx","participant-overview/enrollment/view-transactions/WithTransactionModal.tsx","participant-overview/enrollment/view-transactions/TransactionRow.tsx","participant-overview/enrollment/view-transactions/TransactionExportButton.tsx","shared/pdf-data-table/utils.ts","shared/pdf-data-table/PdfTableCell.tsx","shared/pdf-data-table/PdfDataTableCell.tsx","shared/pdf-data-table/PdfTableRow.tsx","shared/pdf-data-table/PdfTableHeader.tsx","shared/pdf-data-table/PdfTableBody.tsx","shared/pdf-data-table/PdfTable.tsx","participant-overview/enrollment/view-transactions/MraPdf.tsx","participant-overview/enrollment/view-transactions/TransactionPaginator.tsx","participant-overview/enrollment/view-transactions/MraTransactions.tsx","participant-overview/enrollment/view-transactions/HsaPdf.tsx","participant-overview/enrollment/view-transactions/HsaTransactions.tsx","participant-overview/enrollment/CoveredDependents.tsx","components/shared/GlobalConstants.ts","participant-overview/enrollment/view-transactions/ViewTransactionButton.tsx","components/shared/DataTable.tsx","components/shared/PdfDataTableGenerator.tsx","participant-overview/enrollment/custom-transactions/ViewCustomTransactions.tsx","participant-overview/enrollment/custom-transactions/useCustomTransactions.ts","participant-overview/enrollment/EnrolledPlan.tsx","participant-overview/enrollment/ListEnrollments.tsx","participant-overview/PlanEnrollmentTab.tsx","participant-overview/ParticipantOverview.tsx","plan-enrollment/plan-selection/plan-selection.validators.ts","shared/custom-hooks/useOpenPlans.ts","shared/api/openPlansApi.ts","plan-enrollment/plan-selection/PlanSelect.tsx","plan-enrollment/plan-selection/EnrollmentPlanSelection.tsx","plan-enrollment/plan-enrollment-hsa/plan-enrollment-hsa.validators.ts","plan-enrollment/plan-enrollment-hsa/PlanEnrollmentHsa.tsx","plan-enrollment/plan-enrollment.types.ts","plan-enrollment/plan-enrollment-summary/PlanEnrollmentSummary.tsx","plan-enrollment/plan-enrollment-mra/plan-enrollment-mra.validators.ts","plan-enrollment/plan-enrollment-mra/PayDateSelect.tsx","plan-enrollment/plan-enrollment-mra/LFSAFields.tsx","shared/custom-hooks/usePayDates.ts","plan-enrollment/plan-enrollment-mra/PlanEnrollmentMra.tsx","plan-enrollment/plan-enrollment-custom/plan-enrollment-custom.validators.ts","components/shared/DependentSelect.tsx","plan-enrollment/plan-enrollment-custom/PlanEnrollmentCustom.tsx","plan-enrollment/plan-enrollment-steps.ts","plan-enrollment/PlanEnrollmentWizard.tsx","shared/api/qualifyingEventsApi.ts","components/shared/notice-list/NoticeTableRow.tsx","shared/custom-hooks/useParticipantService.ts","components/shared/notice-list/NoticesTable.tsx","cobra-pending-qe/CobraPendingQENotices.tsx","cobra-pending-initial/CobraPendingInitialNotices.tsx","manage-settings/settings-nav-config.ts","manage-settings/SettingsSidebar.tsx","manage-settings/contact-info/contact-info.validators.ts","manage-settings/contact-info/ContactInfo.tsx","components/shared/PasswordInput.tsx","manage-settings/change-password/change-password.validators.ts","manage-settings/change-password/ChangePassword.tsx","shared/api/multiFactorApi.ts","manage-settings/multi-factor-settings/MultiFactorSettings.tsx","manage-settings/manage-users/UserCard.tsx","manage-settings/manage-users/ManageUsers.tsx","manage-settings/ManageSettings.tsx","plan-enrollment-update/update-plan-enrollment-steps.ts","plan-enrollment-update/UpdatePlanEnrollmentWizard.tsx","plan-enrollment-update/useEnrollmentDetails.ts","add-participant/add-participant.validators.ts","add-participant/AddParticipant.tsx","enter-cobra-initial-notice/cobra-initial-notice.validators.ts","enter-cobra-initial-notice/EnterCobraInitialNotice.tsx","terminate-participant/LastDeductionSelect.tsx","terminate-participant/terminate-participant.validators.ts","terminate-participant/TerminateParticipantForm.tsx","terminate-participant/TerminateParticipantRow.tsx","terminate-participant/TerminateParticipant.tsx","update-cobra-qe/CobraQeDetails.tsx","update-cobra-qe/update-cobra-qe.validators.ts","components/shared/FormikErrorFocus.tsx","update-cobra-qe/UpdateCobraQeForm.tsx","update-cobra-qe/useCobraQe.ts","update-cobra-qe/UpdateCobraQe.tsx","reports/balance/hooks/useBalanceReportPlans.ts","shared/api/balanceReportsByDateRangeApi.ts","reports/shared/GraySummaryTile.tsx","reports/shared/ReportExportButton.tsx","reports/balance/EnrollmentRosterTile.tsx","reports/shared/ReportsTile.tsx","reports/shared/ReportDateRangeFilter.tsx","reports/balance/ReportsByDateRange.tsx","reports/useDeductionDateOptions.ts","reports/balance/ReductionListTile.tsx","reports/balance/DebitCardWarnings.tsx","reports/balance/UnsubstantiatedDebitCard.tsx","reports/balance/ContributionsNotForwarded.tsx","reports/balance/AnnualAllocationAudit.tsx","reports/balance/BalanceAccountReports.tsx","reports/custom/CustomReportsByDateRange.tsx","reports/custom/hooks/useCustomEnrollmentCount.ts","shared/api/customEnrollmentApi.ts","reports/custom/CustomEnrollment.tsx","reports/custom/hooks/useCustomEnrollmentWithDepsCount.ts","shared/api/customEnrollmentWithDepsApi.ts","reports/custom/CustomEnrollmentWithDeps.tsx","reports/custom/CustomReports.tsx","reports/cobra/hooks/useCobraReportCounts.ts","shared/api/cobraDateRangeReportsApi.ts","reports/cobra/tiles/InitialNoticeSent.tsx","shared/api/initialNoticeSentApi.ts","reports/cobra/hooks/useNoResponseWithAddressCount.ts","shared/api/noResponseWithAddressApi.ts","reports/cobra/tiles/NoResponseWithAddress.tsx","reports/nonPlanYearServices/hooks/usePendingResponseCount.ts","shared/api/pendingResponsesApi.ts","reports/nonPlanYearServices/tiles/PendingResponses.tsx","reports/nonPlanYearServices/tiles/ActiveParticipants.tsx","reports/nonPlanYearServices/hooks/useActiveParticipantCount.ts","reports/nonPlanYearServices/hooks/usePendingNoticeCount.ts","shared/api/pendingNoticesApi.ts","reports/nonPlanYearServices/tiles/PendingNotices.tsx","reports/nonPlanYearServices/tiles/CurrentActive.tsx","shared/api/currentActiveApi.ts","reports/nonPlanYearServices/tiles/NoticesMailed.tsx","shared/api/noticesMailedApi.ts","reports/nonPlanYearServices/tiles/PaymentsReceived.tsx","shared/api/paymentsReceivedApi.ts","reports/nonPlanYearServices/tiles/MonthlyRecap.tsx","shared/api/monthlyRecapApi.ts","reports/nonPlanYearServices/tiles/AcceptanceReceived.tsx","shared/api/acceptanceReceivedApi.ts","reports/nonPlanYearServices/tiles/InvoiceStatus.tsx","shared/api/invoiceStatusApi.ts","reports/nonPlanYearServices/tiles/ActiveWithAddress.tsx","shared/api/activeWithAddressApi.ts","reports/nonPlanYearServices/tiles/TerminatedParticipants.tsx","shared/api/terminatedParticipantsApi.ts","reports/nonPlanYearServices/tiles/Ten95CData.tsx","shared/api/ten95CApi.ts","reports/retiree/hooks/useRetireeReportCounts.ts","shared/api/retireeDateRangeReportsApi.ts","reports/nonPlanYearServices/tiles/TurningSixtyFive.tsx","shared/api/turningSixtyFiveApi.ts","reports/nonPlanYearServices/tiles/NewEnrollments.tsx","shared/api/newEnrollmentsApi.ts","reports/nonPlanYearServices/tiles/OverDueInvoices.tsx","shared/api/overDueInvoicesApi.ts","reports/loa/hooks/useLoaReportCounts.ts","shared/api/loaDateRangeReportsApi.ts","reports/nonPlanYearServices/tiles/GenericFMLAReportTile.tsx","reports/ReportsTabPanels.tsx","reports/cobra/COBRAReports.tsx","reports/retiree/RetireeBillingReports.tsx","reports/loa/LoaBillingReports.tsx","reports/fmla/FMLAReports.tsx","reports/fmla/FMLAMarketingTabPanel.tsx","reports/global/tiles/GlobalReimbursements.tsx","shared/api/globalReimbursementsApi.ts","reports/global/GlobalReports.tsx","reports/ReportsTabs.tsx","reports/useReportTypes.ts","reports/Reports.tsx","components/pages/OpenEnrollment.tsx","direct-billing/direct-billing-steps.ts","direct-billing/personal-details/DirectBillingPersonalDetails.tsx","direct-billing/event-info/DirectBillingEventInfoForm.tsx","direct-billing/event-info/DirectBillingEventInfo.tsx","direct-billing/dependents/DirectBillingQeDependents.tsx","direct-billing/benefits/dbbenefits.validators.ts","components/shared/qe/BenefitDependents.tsx","components/shared/qe/BenefitSubsidyFields.tsx","components/shared/qe/BenefitsFormSection.tsx","components/shared/qe/BenefitsForm.tsx","direct-billing/benefits/hash-covered-dependents.ts","direct-billing/benefits/unhash-covered-dependents.ts","direct-billing/benefits/DirectBillBenefits.tsx","components/shared/qe/BenefitsSummary.tsx","direct-billing/summary/DirectBillingSummary.tsx","direct-billing/DirectBillingWizard.tsx","update-direct-bill-event/DirectBillingQeDetails.tsx","update-direct-bill-event/update-direct-billing-qe.validators.ts","update-direct-bill-event/UpdateDirectBillingForm.tsx","update-direct-bill-event/UpdateDirectBilling.tsx","images/disable-popup.svg","open-enrollment-resources/usePlanDisplayNames.ts","images/health-care-fsa-guide.svg","images/hra-guide.svg","images/flores-benefits-mastercard.svg","images/flores-mobile.svg","images/dependent-care-fsa-guide.svg","images/no-wait-dependent-care-fsa.svg","images/commuter-benefit-account-guide.svg","images/limited-purpose-fsa-guide.svg","images/reenroll-fsa-checklist.svg","images/reenroll-commuter-checklist.svg","images/reenroll-hra-checklist.svg","images/reenroll-cobra-checklist.svg","images/reenroll-hsa-checklist.svg","images/reenroll-direct-bill-checklist.svg","images/hsa-guide.svg","images/hsa-faq.svg","components/shared/GridCard.tsx","open-enrollment-resources/FsaEnrollmentTemplateCard.tsx","images/custom-checklist.svg","open-enrollment-resources/CustomEnrollmentCard.tsx","open-enrollment-resources/EnrollmentSection.tsx","open-enrollment-resources/OpenEnrollmentResources.tsx","components/shared/DirectDebitAccountSelect.tsx","administrative-billing/pay-invoice.validators.ts","administrative-billing/PayInvoice.tsx","administrative-billing/AdministrativeBillingRow.tsx","shared/api/administrativeBillingApi.ts","administrative-billing/AdministrativeBillingTable.tsx","administrative-billing/hooks/useAdministrativeBillingInvoices.ts","administrative-billing/AdministrativeBilling.tsx","multi-factor-authentication/multi-factor-authentication.validators.ts","multi-factor-authentication/MultiFactorAuth.tsx","document-library/hooks/useDocumentLibraryForms.ts","shared/api/documentLibraryApi.ts","images/allowable-dependent-care-expenses.svg","images/calendar-of-events.svg","images/claim-process-flow-chart.svg","images/fed-form-2441-child-and-dependent-care-expenses.svg","images/fsa-store-eligibility-list.svg","images/guidee-to-allowable-status-changes.svg","images/guide-to-allowable-otc-expenses.svg","images/guide-to-reimbursable-dependent-care-expenses.svg","images/hipaa-privacy-standards.svg","images/90-merchant-list.svg","images/direct-deposit.svg","images/allowable-medical-expenses.svg","images/iias-approved.svg","images/reimbursable-medical-expenses.svg","images/default.svg","images/dash-training-manual.svg","document-library/imageMap.ts","document-library/hooks/useLegalDocuments.tsx","document-library/education/hooks/useDocumentLibraryEducation.ts","document-library/DocumentLibraryTabPanels.tsx","document-library/forms/FormsDocumentLibrary.tsx","document-library/legal/LegalDocumentLibrary.tsx","shared/api/filesApi.ts","document-library/education/EducationDocumentLibrary.tsx","document-library/DocumentLibraryTabs.tsx","document-library/DocumentLibrary.tsx","direct-debit/perform-direct-debit.validators.ts","direct-debit/DirectDebitConfirmation.tsx","shared/api/directDebitApi.ts","direct-debit/DirectDebitRow.tsx","direct-debit/DirectDebitTable.tsx","direct-debit/hooks/useDirectDebits.ts","direct-debit/DirectDebit.tsx","manage-settings/add-user/add-user-steps.ts","manage-settings/add-user/add-user-details.validators.ts","components/shared/ContactDetails.tsx","manage-settings/add-user/AddUserStepOne.tsx","manage-settings/add-user/AddUserStepTwo.tsx","manage-settings/add-user/AddUser.tsx","components/shared/BorderLinearProgress.tsx","re-enrollment-checklist/ChecklistCard.tsx","re-enrollment-checklist/cobra-checklist/CobraOePacketCard.tsx","re-enrollment-checklist/cobra-reenrollment-checklist/CobraPlanCard.tsx","shared/utils/set-legacy-checklist-completion-progress.ts","re-enrollment-checklist/hsa-reenrollment-checklist/HsaPlanCard.tsx","re-enrollment-checklist/custom-reenrollment-checklist/CustomPlanCard.tsx","re-enrollment-checklist/fsa-reenrollment-checklist/FsaPlanCard.tsx","images/hra-round.svg","re-enrollment-checklist/hra-reenrollment-checklist/HraPlanCard.tsx","re-enrollment-checklist/qte-reenrollment-checklist/QtePlanCard.tsx","re-enrollment-checklist/direct-bill-reenrollment-checklist/DirectBillPlanCard.tsx","re-enrollment-checklist/cobra-checklist/CobraLegacyCard.tsx","re-enrollment-checklist/ReEnrollmentChecklist.tsx","re-enrollment-checklist/cobra/cover-letter/CoverLetterInfoTab.tsx","shared/utils/download-document.ts","re-enrollment-checklist/cobra/oe-packets/OeFiles.tsx","shared/enums/plan-codes.enum.ts","re-enrollment-checklist/cobra/summary/SummaryInfo.tsx","re-enrollment-checklist/cobra/summary/SummaryTab.tsx","components/shared/DragAndDropUpload.tsx","images/confirm-cover-letter.png","re-enrollment-checklist/cobra/oe-packets/OeGeneratedFile.tsx","re-enrollment-checklist/cobra/oe-packets/OePacketsTab.tsx","re-enrollment-checklist/cobra/CobraReEnrollmentChecklist.tsx","re-enrollment-checklist/cobra-reenrollment-checklist/oe-packets-options/OePacketsOptions.tsx","re-enrollment-checklist/cobra-reenrollment-checklist/cobra-eligibility-count/CobraEligibilityCount.tsx","shared/enums/generic.enum.ts","re-enrollment-checklist/cobra-reenrollment-checklist/plan-rates/StepOne.tsx","shared/utils/mask-phone-number.ts","re-enrollment-checklist/cobra-reenrollment-checklist/plan-rates/StepTwo.tsx","re-enrollment-checklist/cobra-reenrollment-checklist/plan-rates/step-three/RateInformationSelection.tsx","re-enrollment-checklist/cobra-reenrollment-checklist/plan-rates/step-three/RatesTable.tsx","re-enrollment-checklist/cobra-reenrollment-checklist/plan-rates/step-three/NewRateSelect.tsx","re-enrollment-checklist/cobra-reenrollment-checklist/plan-rates/step-three/RatesFileUploadSection.tsx","re-enrollment-checklist/cobra-reenrollment-checklist/plan-rates/StepThree.tsx","re-enrollment-checklist/cobra-reenrollment-checklist/plan-rates/AddRateWizardContainer.tsx","re-enrollment-checklist/cobra-reenrollment-checklist/plan-rates/RatesStatus.tsx","re-enrollment-checklist/cobra-reenrollment-checklist/plan-rates/PlanRatesCard.tsx","re-enrollment-checklist/cobra-reenrollment-checklist/plan-rates/PlanRates.tsx","re-enrollment-checklist/cobra-reenrollment-checklist/summary/SummaryAccordion.tsx","re-enrollment-checklist/cobra-reenrollment-checklist/summary/Summary.tsx","re-enrollment-checklist/cobra-reenrollment-checklist/CobraPlanReEnrollmentChecklist.tsx","re-enrollment-checklist/LegacyChecklists.tsx","rates-history/PlanRow.tsx","rates-history/HistoryTable.tsx","rates-history/RatesHistory.tsx","action-items/pages/contributions-not-forwarded/ContributionsNotForwarded.tsx","re-enrollment-checklist/direct-bill-reenrollment-checklist/general/DirectBillGeneral.tsx","re-enrollment-checklist/direct-bill-reenrollment-checklist/DirectBillReEnrollmentChecklist.tsx","components/shared/form/SubmissionError.tsx","enter-leave-request/enter-leave-request-steps.ts","enter-leave-request/enter-leave-request-fields.ts","enter-leave-request/enter-leave-request.validators.ts","enter-leave-request/personal-details/EnterLeaveRequestPersonalDetails.tsx","components/shared/form/formik/FormikMuiDatePicker.tsx","enter-leave-request/employment-details/EnterLeaveRequestEmploymentDetails.tsx","enter-leave-request/event-info/EnterLeaveRequestEventInfo.tsx","shared/consts/date-time.consts.ts","enter-leave-request/summary/EnterLeaveRequestSummary.tsx","enter-leave-request/EnterLeaveRequestConfirmation.tsx","enter-leave-request/EnterLeaveRequestPage.tsx","shared/api/fmlaFormsApi.ts","leave-records/leave-record-details/LeaveRecordCaseInfoTab.tsx","leave-records/leave-record-details/LeaveRecordPaperworkDatesTab.tsx","leave-records/leave-record-details/LeaveRecordEmployeeInfoTab.tsx","leave-records/leave-record-details/LeaveRecordCurrentApprovalsTab.tsx","leave-records/leave-record-details/LeaveRecordTabPanels.tsx","leave-records/components/LeaveRecordsEmployeeHeader.tsx","leave-records/components/LeaveRecordsPageHeader.tsx","leave-records/leave-record-details/LeaveRecordDetails.tsx","leave-records/components/LeaveRecordsSearchResultRow.tsx","leave-records/components/LeaveRecordsSearchResultsContainer.tsx","leave-records/components/LeaveRecordsSearchInput.tsx","leave-records/components/LeaveRecordsTableRow.tsx","leave-records/participant-leave-records/ParticipantLeaveRecords.tsx","leave-records/components/LeaveRecordsTable.tsx","leave-records/leave-records-by-employee/LeaveRecordsByEmployee.tsx","report-an-absence/report-an-absence-fields.ts","report-an-absence/report-an-absence-steps.ts","report-an-absence/report-an-absence.validation.ts","report-an-absence/personal-details/ReportAnAbsencePersonalDetails.tsx","report-an-absence/event-info/ReportAnAbsenceEventInfo.tsx","report-an-absence/summary/ReportAnAbsenceSummary.tsx","report-an-absence/ReportAnAbsenceConfirmation.tsx","report-an-absence/ReportAnAbsence.tsx","absence-report/AbsenceReport.tsx","components/App.tsx","components/shared/MuiTheme.tsx","server/routes/companies.js","server/routes/utils.js","server/routes/users.js","server/routes/plan-years.js","server/routes/reports.js","server/routes/qe-notices.js","server/routes/init-notices.js","server/routes/file-history.js","server/routes/report-history.js","server/routes/marketing-slides.js","server/routes/fileupload.js","server/routes/participants.js","server/routes/cobra-qe.js","server/routes/plan-enrollment.js","server/routes/qualifying-events.js","server/routes/pending-responses.js","server/routes/cobra-date-range.js","server/routes/direct-bill.js","server/routes/administrative-billing.js","server/routes/multi-factor-authentication.js","server/routes/document-library.js","server/routes/direct-debit.js","server/routes/responsibilities.js","server/routes/permissions.js","server/routes/enrollment-resources.js","server/routes/re-enrollment.js","server/index.js","notifications/SnackPanel.tsx","shared/telemetry/appInsights.ts","index.tsx","reports-tile/non-plan-year/NonPlanYearServiceSummary.module.css","enter-cobra-qe/summary/CobraQeSummary.module.css","direct-billing/summary/DirectBillingSummary.module.css","enter-leave-request/summary/EnterLeaveRequestSummary.module.css","direct-billing/event-info/DirectBillingEventInfoForm.module.css","components/layout/DefaultLayout.module.css","components/shared/qe/Benefits.module.css","companies/CompanyTile.module.css","report-an-absence/summary/ReportAnAbsenceSummary.module.css","components/shared/Loading.module.css","account-manager-tile/AccountManagerTile.module.css","shared/asserts.ts","components/layout/Header/FloresHeaderLogo.module.css","navigation/NavItem.module.css","authentication/authentication.ts","components/layout/Header/AppToolbar.module.css","companies/CompanyAvatar.module.css","account-manager-tile/AgentAvatar.module.css","enter-cobra-qe/event-info/EventInfoForm.module.css","components/shared/CancelModel.module.css","components/shared/dependents/Dependents.module.css","components/pages/NotFound.module.css","reports/ReportsTabs.module.css","document-library/DocumentLibraryTabs.module.css"],"names":["parseQueryString","search","length","Map","s","charAt","slice","split","reduce","mp","token","key","val","set","debounce","fn","timeSpan","timeout","args","window","clearTimeout","setTimeout","apply","upperFirst","compose","join","adjust","toUpper","nameCase","map","toLower","currencyFormatter","Intl","NumberFormat","style","currency","noop","always","undefined","pipe","replace","isWithinDateRange","yearBeginning","yearEnd","date","both","dayjs","add","isAfter","subtract","isBefore","createAndSubmitForm","form","fieldValue","method","action","target","hiddenField","document","createElement","type","name","value","appendChild","body","submit","Promise","r","leafPath","obj","keys","shift","valueType","toLowerCase","includes","toString","planCodeToPlanType","planCode","subName","cond","equals","T","getYearAndMonth","monthYear","parsed","year","month","toNumber","parseInt","valueOrPlaceholder","placeholder","dateOrPlaceholder","format","Boolean","location","hostname","match","NotificationType","initialState","notifications","notificationSlice","createSlice","reducers","addNotification","state","payload","performance","now","unshift","pop","removeNotification","idx","findIndex","n","splice","actions","addHttpErrorNotification","error","message","ERROR","area","addHttpSuccessNotification","SUCCESS","selectSnacks","filter","HttpError","Error","constructor","status","statusText","super","this","ApiHostsMap","FMLA_HOST","process","REACT_APP_FMLA_HOST","ApiHostsEnum","ContentType","defaultOptions","headers","accept","JSON","async","getBody","res","get","has","data","contentType","DEFAULT","tokens","trim","getContentType","json","CSS","HTML","TEXT","XML","text","FORM_DATA","formData","arrayBuffer","handleAPIResponse","startsWith","filename","defaultName","disposition","test","fileParts","filenameFromResponse","blob","download","downloadFile","ok","request","path","options","queryParams","signal","externalUrl","url","apiUrl","assertIsDefined","localStorage","getItem","getAuthorizationToken","authorization","fullUrl","queryString","appendQueryString","params","Object","k","encodeURIComponent","queryParamsToString","requestBody","stringify","fetch","savedCompany","companies","selectedCompany","parse","loading","companySlice","loadCompaniesStart","loadCompaniesSuccess","loadCompaniesFailed","setSelectedCompany","getCompaniesForUser","user","dispatch","userId","conuserid","reject","ex","selectUserCompanies","selectSelectedCompany","selectLoadingCompanies","selectSelectedCompanyId","compid","getDependents","companyId","employeeNumber","resolve","deepMap","or","is","Array","deepTrim","entry","participant","empno","socsec","payrollid","birthdate","lname","fname","sex","hphone","hstreet1","hstreet2","hcity","hstate","hzip","payfreq","payfreq2","email","eventDate","eventType","coverageBegins","initialDependents","addedDependents","benefits","eventTypes","loadingQe","cobraQeSlice","loadQeStart","loadInitialDependentsStart","loadQeSuccess","loadQeFail","resetEntry","updatePersonalDetails","pidLens","lensPath","formattedPayload","view","updateEventInfo","paidThrough","updateDependents","updateBenefits","setEventTypes","selectCobraQeEntry","cobraQe","selectQePersonalDetails","rootState","selectQeEventInfo","selectQeDependents","selectQeBenefits","selectEventTypes","selectInitialDependents","selectAllDependents","getParticipant","payrollId","fetchParticipant","createAsyncThunk","thunkAPI","getState","company","selected","recentSelections","searchText","searchResults","fetchParticipantStatus","participantSlice","loadParticipantStart","loadParticipantEnd","setSelectedParticipant","some","resetRecentSearches","setSearchResults","setSearchText","resetSearchResults","setFetchParticipantStatus","extraReducers","builder","addCase","pending","rejected","fulfilled","loadParticipant","err","abortController","searchParticipants","abort","AbortController","participants","searchForParticipant","selectParticipant","selectSearchResults","selectSearchText","selectFetchParticipantStatus","plan","planDetails","planEnrollmentSlice","setPlan","setPlanDetails","resetPlanEnrollment","selectPlanEnrollmentPlan","planEnrollment","selectPlanEnrollmentDetails","selectPlanEnrollmentPayload","pyrid","plcid","partStart","partEnd","yearend","partAnn","firstPayDateOfChange","payPeriodDeduction","planLevel","currentContributions","additionalContributions","coveredDependents","plccode","lfsa","medplancd","fetchFeatureFlags","_","getFeatureFlags","ApiFetchStatus","defaultChecklistFlagsState","showDirectBillV2","showCustomPlanV2","showHsaPlanV2","showFsaPlanV2","showHraPlanV2","showQtePlanV2","pageTitle","fetchFeatureFlagsStatus","reEnrollmentChecklist","appSlice","setPageTitle","selectPageTitle","appSettings","selectFetchFeatureFlagsStatus","EnrollmentType","uriMap","strings","subpath","COBRA","Retiree","LOA","Regular","getEnrollmentByType","uri","regular","deleting","enrollmentsSlice","loadRegularEnrollmentsStart","setRegularEnrollments","startDeleting","doneDeleting","removeEnrollment","e","loadEnrollments","enrollments","getEnrollments","deleteRegularEnrollment","enrollment","planYearId","customPlanId","deleteEnrollment","selectRegularEnrollments","selectDeletingEnrollment","cobraEnrollments","retireeEnrollments","loaEnrollments","participantOverviewSlice","loadCobraEnrollmentsStart","setCobraEnrollments","loadRetireeEnrollmentsStart","setRetireeEnrollments","loadLoaEnrollmentsStart","setLoaEnrollments","loadRetireeEnrollments","loadLoaEnrollments","selectCobraEnrollments","participantOverview","selectRetireeEnrollments","selectLoaEnrollments","defaultParticipant","dependents","freeze","defaultContact","conlname","confname","conphone","confax","contitle","condept","conaddr1","conaddr2","concity","constate","conzip","conemail","eventInfo","initial","added","availableBenefits","directBillingQeSlice","setAvailableBenefits","setBenefits","benefit","isNil","selectedPlan","setAddedDependents","setInitialDependents","setEntry","setEventInfo","setParticipant","loadAvailableBenefits","coverageDate","benefitPlans","effectiveDate","isValid","getAvailableBenefits","benefitsWithLifeAndOther","acc","plans","find","p","planType","clamp","fill","clone","loadEventTypes","types","getDirectBillEventTypes","loadDirectBillingEvent","rQualId","getDirectBillingEvent","bennies","selectDirectBillingQeEntry","directBillingQe","selectDirectBillingEventTypes","selectDirectBillingEventInfo","selectDirectBillingDetails","details","selectAvailableBenefits","selectedBenefits","available","planTypeName","omit","pick","selectDirectBillingDependents","concat","selectDirectBillSavePayload","r_qualid","cost","subsidy","defaultSelectedUser","responsibilities","locations","payFrequencies","permissions","users","selectedUser","manageUsersSlice","setResponsibilities","setPermissions","setLocations","setPayFrequencies","setUsers","setSelectedUser","resetSelectedUser","loadResponsibilities","loadPermissions","loadLocations","loadPayFrequencies","loadUsers","then","result","u","loadSelectedUser","conid","getContactUser","selectResponsibilities","manageUsers","selectPermissions","selectLocations","selectPayFrequencies","selectUsers","selectSelectedUser","openEnrollmentResourcesSlice","setEnrollmentResourcePlans","loadEnrollmentResourcePlans","selectEnrollmentResourcePlans","enrollmentResources","monthYears","webFiles","selectedMonthYear","selectedReportType","fileHistorySlice","setMonthYears","setWebFiles","setSelectedMonthYear","setSelectedReportType","loadMonthYears","loadWebFiles","getFileHistoryFiles","selectMonthYears","fileHistory","selectWebFiles","selectSelectedMonthYear","selectSelectedReportType","fetchSlides","slides","fetchSlidesStatus","slideshowSlice","setSlides","selectSlides","slideshow","selectFetchSlidesStatus","reports","reportHistorySlice","setReportMonthYears","setReports","loadReportMonthYears","loadReports","getReportHistories","selectReportMonthYears","reportHistory","selectReports","notices","cobraPendingInitialNoticesSlice","setPendingInitialNotices","loadPendingInitialNotices","selectPendingInitialNotices","cobraPendingInitialNotices","contactInfoSlice","loadContactInfoStart","setDetails","loadContactInfo","getContactInfo","selectContactInfo","contactInfo","planMapper","getCobraAvailablePlans","getNoBenefitsMessage","coverageStart","cobraPendingQeNoticesSlice","setPendingQeNotices","loadPendingQeNotices","selectPendingQeNotices","cobraPendingQeNotices","contributionsNotForwardedCount","annualAllocationAuditCount","reportsSlice","loadContributionsNotForwardedCountStart","setContributionsNotForwardedCount","loadAnnualAllocationAuditCountStart","setAnnualAllocationAuditCount","loadContributionsNotForwardedCount","count","getContributionsNotForwardedCount","loadAnnualAllocationAuditCount","getAnnualAllocationAuditCount","selectContributionsNotForwardedCount","selectAnnualAllocationAuditCount","validateParams","startDate","endDate","start","end","customReportsSlice","setCustomReportPlans","setSelectedCustomReportPlan","loadCustomReportPlans","selectCustomReportPlans","customReports","selectSelectedCustomReportPlan","getPercentageFromBooleanArray","arr","truthy","x","Math","round","PlanTypesString","applyPlanTypeDiscriminator","pathEq","assoc","HSA","CUSTOM","DIRECTBILL","FSA","HRA","QTE","sanitizeFilename","sanitize","fetchReEnrollmentChecklistPlan","getReEnrollmentChecklistPlans","saveCobraOePacketInfo","updateCobraOePacketInfo","selectCobraPlan","completeChecklist","updateChecklistComplete","selectPlanByPlanCode","saveCobraPlan","updateCobraPlan","selectCobraPlanOnDeck","finalizeCobraPlans","cobraPlanIds","selectCobraPlanIds","finalizeCobraChecklistPlans","fetchCobraChecklistPlans","getCobraChecklistPlans","fetchCobraPlanTypes","getCobraPlanTypes","fetchCobraInsurers","getCobraInsurers","fetchCustomPlans","deleteOeDocument","fileName","generateOeDocuments","fetchCoverageTypes","coverageTypes","deleteCobraInProgressPlan","planInProgressId","deleteInProgressPlan","saveDirectBillChecklist","updateDirectBillChecklist","selectDirectBillPlan","fetchPlanLevelDescriptions","InsurerUpdateMethod","ActivateAccountType","fetchPlansStatus","saveOePacketInfoStatus","submitFileStatus","completeChecklistRequestStatus","saveCobraPlanStatus","fetchCobraChecklistPlansStatus","generateOeDocumentsStatus","cancelModalStatus","redirectModalStatus","cobraReEnrollmentChecklistPlans","cobraPlanOnDeck","validations","planRateWizardStepIndex","cobraPlanTypes","cobraPlanTypesStatus","cobraInsurers","cobraInsurersStatus","cobraPlanOnDeckValidations","fetchCustomPlanStatus","customPlans","planLevelDescriptions","fetchCoverageTypesRequestStatus","fetchPlanLevelDescriptionsStatus","deleteCobraInProgressPlanStatus","saveDirectBillChecklistStatus","reEnrollmentChecklistState","setPlans","setCobraOeHandler","index","lens","setCobraOeTemplateCoverLetter","setCobraOeElectionFormApproved","setCobraOeCoverLetterApproved","setCobraOePrintOptionsBlackAndWhite","setCobraOePrintOptionsTwoSided","setCobraOePacketFiles","makeUpdatedCobraPlan","clearOePacketFiles","addOePacketFiles","filesToAdd","files","removeOePacketFileByName","file","fullName","setCobraOeSendPackets","setCobraOeResponseDeadline","setCobraOeResponseRequired","setValidations","setCobraOeValidations","setCobraOeSubmitFileStatus","cancelModalOpened","cancelModalClosed","setCobraPlanNewEligibilityCount","planRateWizardStepIndexChanged","setNewCobraPlanOnDeck","setExistingCobraPlanOnDeck","planId","setCobraPlanOnDeckPlanName","setCobraPlanOnDeckInsurer","setCobraPlanOnDeckPlanTypeId","pathOr","propEq","setCobraPlanOnDeckPlanTypeName","setCobraPlanOnDeckPolicyNumber","setCobraPlanOnDeckActivateAccountType","setCobraPlanOnDeckUpdatePaidThrough","setCobraInsurers","setCobraPlanOnDeckPlanTypeDescription","setCobraPlanOnDeckHasLevels","setCobraPlanOnDeckNewCarrierName","setCobraPlanOnDeckCarrierContactName","setCobraPlanOnDeckCarrierContactEmail","newArr","setCobraPlanOnDeckCarrierContactEmailTemp","setCobraPlanOnDeckCarrierContactEmailArray","setCobraPlanOnDeckCarrierContactPhone","setCobraPlanOnDeckCarrierId","setCobraPlanOnDeckCarrierNameAndId","carrierLens","insurers","insurerId","idLens","setCobraPlanOnDeckCarrierUpdateMethod","methodLens","Other","notesLens","setCobraPlanOnDeckCarrierUpdateMethodNotes","setCobraPlanOnDeckCarrierNotes","setCobraPlanOnDeckInit","setCobraPlanOnDeckValidations","setCobraPlanOnDeckNewPlanLevel","planLevels","append","levelCoverageTier","levelName","levelDescriptionId","levelId","resetCobraPlanOnDeckNewPlanLevels","setCobraPlanOnDeckConfirmRates","setCobraPlanOnDeckPlanLevelEffectiveTo","level","levelCostEndDate","setCobraPlanOnDeckPlanLevelEffectiveFrom","levelCostBeginDate","setCobraPlanOnDeckPlanRate","levelCost","removeCobraPlanOnDeckPlanLevel","setCobraPlanOnDeckRatesDocuments","planIndex","setCobraPlanOnDeckPlanInProgressId","setRedirectModalStatus","resetCobraPlanOnDeckRatesDocuments","reenrollmentRatesDocs","setCobraPlanTerminating","terminating","setOeValidationsByPlanType","setDirectBillOeBegins","updatePlanByType","setDirectBillOeEnds","setDirectBillResponseDeadline","saveOePacketInfo","activateAccountType","viewLens","newLens","selectFetchPlansStatus","selectReEnrollmentChecklistPlans","selectReEnrollmentPlansByPlanYearId","selectReEnrollmentChecklistRenewalDate","sortedDates","renewalDate","sort","a","b","unix","closestFutureDate","head","dates","d","closestPastDate","last","selectCobraOeProgress","cobraPlan","coverLetterSectionComplete","oePacketsSectionComplete","oePacketsChecklistComplete","statuses","optionalStatuses","steps","values","optionalSteps","cobraHandler","selectCobraOeHandler","templateCoverLetter","selectCobraOeTemplateCoverLetter","selectCobraChecklistProgress","isPlanRatesInvalid","selectPlanRatesContinueIsDisabled","eligibilitySectionComplete","oeOptionsSectionComplete","checklistComplete","planRatesSectionComplete","selectCobraOeElectionFormApproved","selectCobraOeCoverLetterApproved","selectCobraOePrintOptionBlackAndWhite","selectCobraOePrintOptionTwoSided","oeFileNamePrefixes","coverLetterPrefix","electionFormPrefix","selectOePacketFiles","selectCobraOeCoverLetter","selectCobraOeElectionForm","selectCobraOeValidations","t","selectSaveCobraOePacketInfoStatus","selectCobraOeSubmitDocStatus","selectCompleteChecklistRequestStatus","selectCompanyId","selectCancelModalStatus","selectCobraPlanNewEligibleCount","selectEligibilityCountDifference","previous","selectPreviousYearCobraPlanNewEligibleCount","current","abs","selectSaveCobraPlanStatus","selectFetchCobraChecklistPlansStatus","selectUniqueCobraReEnrollmentChecklistPlans","hasDocs","hasRates","every","ratesStatus","ifElse","allPass","either","assign","selectDiscontinuedCobraChecklistPlans","selectCobraReEnrollmentChecklistPlansByType","groupBy","selectPlanRateWizardStepIndex","selectCobraPlanTypesStatus","selectCobraInsurers","selectCobraInsurersStatus","selectCobraPlanLevelsAllPositive","selectCobraPlanOnDeckValidations","selectCobraPlanOnDeckConfirmRates","confirmRates","selectLevelCoverageTiersOnDeck","selectCustomPlanNames","planName","selectCustomPlanNamesFetchStatus","selectOnDeckPlanHasLevels","hasLevels","selectIsOnDeckPlanNew","selectOnDeckPlanRatesDocuments","selectDoesRedirectToOePackets","cobraOeHandler","cobraOeTemplateCoverLetter","selectRedirectModalStatus","selectCanShowOePackets","selectCoverageTypesRequestStatus","selectCoverageTypes","selectPlanLevelDescriptionsStatus","selectPlanLevelDescriptions","selectDeleteCobraInProgressPlanStatus","selectSaveDirectBillChecklistStatus","selectIsFinalizeCobraChecklistDisabled","planRatesContinueIsDisabled","anyPass","selectDirectBillOeValidations","fetchRateHistory","planYears","getHistoricalCobraPlans","fetchDirectBillRateHistory","getHistoricalDirectBillPlans","fetchCobraRatesHistoryStatus","cobraPlans","cobraPlanYears","filteredCobraPlanYearId","fetchDirectBillRatesHistoryStatus","directBillPlans","directBillPlanYears","filteredDirectBillPlanYearId","ratesHistorySlice","cobraPlanYearFilterChanged","directBillPlanYearFilterChanged","selectFetchCobraRatesHistoryStatus","historicalRates","selectFetchDirectBillRatesHistoryStatus","selectCobraHistoricalPlanYears","selectDirectBillHistoricalPlanYears","removeNonMatchingPlanYears","filteredPlanYear","cur","coverageTiers","tierRates","rateBeginDate","planYearEnd","rateEndDate","planYearStart","selectHistoricalCobraPlans","planYear","selectFilteredCobraPlanYear","selectHistoricalDirectBillPlans","selectFilteredDirectBillPlanYear","fetchHsaContributionsNotForwarded","getHsaContributionNotForwardedStatuses","fetchContributionsStatus","hsaContributionsNotForwarded","actionItemsSlice","setHsaContributionsNotForwarded","setContributionsStatus","actionItems","curr","contributions","selectContributionsNotForwarded","selectContributionsNotForwardedFetchStatus","fetchDependentsForParticipant","participantNumber","fetchDependentsForParticipantStatus","dependentsSlice","resetDependents","selectDependents","fetchDirectDebitAccount","getDirectDebitAccounts","directDebitAccounts","fetchDirectDebitAccountStatus","directDebitSlice","resetDirectDebit","selectDirectDebitAccounts","directDebit","selectFetchDirectDebitAccountStatus","downloadFmlaExcel","reportType","XLSX","getReportCount","allSettledUnwrap","fetchFMLAReportCountsForDashboard","reportData","allSettled","allOpenLeaveCaseListCount","intermittentLeaveCaseListCount","pendingInfoCount","returnToWorkConfirmationCount","fetchDateFilterableFmlaReports","allAbsencesListCount","usageTotalsCount","allLeaveCases","dateRangeStart","dateRangeEnd","fmlaReportCounts","nonFilterableFmlaReportCountsStatus","filterableFmlaReportCountsStatus","FMLAReportsSlice","setFMLADateRange","selectStartAndEndDateRange","fmlaReports","selectReportsCounts","selectNonFilterableFetchFmlaReportCountsStatus","fetchEmployeeDetails","eeId","fetchCasesSummary","fetchCaseDetails","caseId","fetchEmployeeAbsences","fetchEmployeeSearchResultsByCriteria","criteria","rows","offset","employeeDetailsStatus","casesSummaryStatus","caseDetailsStatus","employeeAbsencesStatus","employeeSearchStatus","employeeDetails","caseDetails","casesSummary","employeeAbsences","employeeSearchResults","recentlyViewedEmployeeAbsences","LeaveRequestsSlice","resetLeaveRecordsApiStatus","getRecentlyViewedFromLocalStorage","updateRecentlyViewed","updated","gt","__","dropLast","identity","insert","without","setItem","meta","aborted","selectEmployeeDetailsStatus","leaveRecords","selectCasesSummaryStatus","selectCaseDetailsStatus","selectEmployeeAbsencesStatus","selectEmployeeDetails","selectCasesSummary","selectCaseDetails","selectEmployeeAbsences","selectEmployeeSearchResultsStatus","selectEmployeeSearchResults","selectRecentlyViewedEmployeeAbsences","rootReducer","combineReducers","companyReducer","notificationReducer","cobraQeReducer","participantReducer","planEnrollmentReducer","appSettingsReducer","enrollmentsReducer","directBillingQeReducer","manageUsersReducer","enrollmentResourcesReducer","participantOverviewReducer","fileHistoryReducer","slideshowReducer","reportHistoryReducer","cobraPendingInitialNoticesReducer","contactInfoReducer","cobraPendingQeNoticesReducer","reportsReducer","customReportsReducer","reEnrollmentReducer","ratesHistoryReducer","actionItemsReducer","dependentsReducer","directDebitReducer","fmlaReportsReducer","leaveRecordReducer","serverLogger","next","syncCompanyLocalStorage","stringified","yupErrorsToObject","errors","property","yup","cobraOeSendPackets","typeError","required","when","sch","diff","cobraOeResponseDeadline","validate","appStore","validationSchema","stripUnknown","abortEarly","catch","validation","selectCobraOePlanYearStart","validateCobraPlans","store","cobraChecklistPlanErrorMessages","max","invalid","duplicate","min","cobraChecklistPlanValidationSchema","nullable","carrier","newCarrierName","schema","not","isEmpty","planTypeId","num","planTypeDescription","carrierUpdateMethod","oneOf","carrierUpdateMethodNotes","planPolicyNumber","CarrierByTuesdayFile","carrierContactName","carrierContactEmail","carrierContactEmailTemp","complement","carrierContactPhone","phone","validateCobraPlanOnDeck","endsWith","planOnDeck","directBillChecklistErrors","afterStartDate","directBillChecklistValidationSchema","directBillOeBegins","directBillOeEnds","directBillResponseDeadline","directBillPlan","selectDirectBillOePlanYearStart","validateDirectBillChecklist","handleErrorsMiddleware","handleErrors","dependentsMiddleware","dependentsReset","configureStore","reducer","middleware","REACT_APP_LOG_LEVEL","getDefaultMiddleware","logger","colorFromLetters","letters","code","char","charCodeAt","avatarColorPalette","getInitials","firstName","lastName","toUpperCase","avatarColor","ParticipantSubHeader","iddesc","useSelector","className","Avatar","Logout","onClick","logout","to","UserMenuButton","page","history","useHistory","data-testid","variant","navToPage","push","size","CompanyAvatar","alt","compname","classes","img","styles","src","filepath","UserMenu","anchorEl","setAnchorEl","React","useState","handleOpen","event","currentTarget","handleClose","handleViewAllCompanies","reload","Button","aria-controls","aria-haspopup","Typography","component","htmlColor","anchorOrigin","vertical","horizontal","transformOrigin","keepMounted","open","onClose","list","Divider","id","MenuItem","href","rel","ParticipantResultsRow","onParticipantSelected","highlightMatch","str","field","lowerStr","toLocaleLowerCase","lowerSearch","indexOf","AddParticipantItem","color","popperLoadingIndicator","width","minWidth","ParticipantSearchResults","anchorRef","ref","setWidth","prevOpen","useRef","handleParticipantSelect","contains","handleListKeyDown","preventDefault","useEffect","offsetWidth","focus","Popper","role","transition","disablePortal","placement","TransitionProps","Grow","Paper","ClickAwayListener","onClickAway","MenuList","autoFocusItem","onKeyDown","disabled","forwardRef","SearchInput","label","onChange","onFocus","rest","inputRef","handleChanged","blur","TextField","fullWidth","inputProps","onPaste","InputProps","startAdornment","InputAdornment","position","withDebounce","WrappedComponent","WithDebounce","onDebouncedChange","props","debouncedHandler","wrappedComponentName","displayName","DebouncedSearch","ParticipantSearch","setOpen","openList","searchChange","closeList","F","listRef","useDispatch","handleBlur","relatedTarget","from","children","handleSelect","handleKeyUp","placeHolderText","hidden","isFmlaOnly","onBlur","onKeyUp","content","FloresHeaderLogo","logoContainer","dashLogo","logo","AppToolbar","onToggleDrawer","showSearch","Toolbar","toolbar","Hidden","lgUp","IconButton","aria-label","WizardLayout","showBackButton","stepSlug","useParams","getCurrentStep","AppBar","currentStep","prev","shouldShowBack","newPath","pathname","fontSize","defaultStyles","contentContainer","NavItem","icon","activeClassName","active","navItem","Icon","getIcon","navItemMapper","nav","Navigation","navConfig","makeNav","predicate","sidebarNav","DesktopWindowsIcon","WebOutlinedIcon","CheckBoxOutlinedIcon","BookIcon","PublishOutlinedIcon","DocumentLibraryIcon","AdministrativeBillingIcon","PersonAddIcon","DeleteIcon","BarChartIcon","AccessTimeOutlinedIcon","CreditCardIcon","WorkHistoryOutlinedIcon","EditOutlinedIcon","ManageSearchIcon","hasPermission","permissionDescription","jwt","getJWT","jwtDecoded","jwt_decode","UserPermissions","description","item","hasRetiree","hasCobra","hasFmla","isOpenEnrollmentPeriod","isCobraOnly","Sidebar","collapsed","modalContainer","querySelector","setNav","drawerContent","showLegacy","Drawer","anchor","ModalProps","container","paper","lgDown","DefaultLayout","toggleDrawer","header","mainContainer","Route","_Route","unprotected","AppRoute","exact","title","authRequired","layout","loginUrl","renderChildren","showButton","isLoggedIn","render","CompanyTile","onSelected","Card","tile","elevation","square","CardMedia","media","image","CardContent","root","CompanyList","c","Loading","Backdrop","backdrop","imageContainer","logoImage","PageContentPaper","usePageTitle","CompanySelect","setFilter","switchCompany","useCallback","response","setJWT","getUserPermissions","handleFilter","handleCompanySelect","companyFilter","AgentAvatar","agentName","agentAvatar","AccountManagerTile","accountManagerTile","gradient","tileFooter","useSuccessNotifier","msg","successNotifier","useErrorNotifier","errorNotifier","PlanYearSelect","FormControl","InputLabel","shrink","Select","labelId","native","py","planYearName","ParticipantCountSummary","exportUri","detailsPath","handleExport","handleDetails","MonthSelect","onMonthChanged","setOptions","makeOpt","labelStart","startOf","labelEnd","endOf","opts","monthDiff","option","opt","downloadReimbursementReport","custom","validateDate","dateObj","reportQueryStringTag","serviceType","base","downloadActiveParticipantsReport","queryStringTag","defaultSummaryReportResponse","activeParticipants","noticesMailed","paymentsProcessed","NonPlanYearServiceSummary","apiUri","exportType","onLoaded","setMonth","setLoading","summary","setSummary","handleError","getData","day","getNonPlanYearServiceSummaryReport","handleMonthChange","m","newMonth","promise","downloadNonPlanYearParticipantReport","summaryContainer","Skeleton","dataSection","useDownloading","downloadApi","downloading","setDownloading","doneDownloading","startDownloading","tap","FmlaSummaryTile","FmlaSummary","fetchFmlaCountsStatus","reportCounts","loaded","height","NonPlanYearServices","nypsStart","setNypsStart","nypsEnd","setNypsEnd","areChildrenLoading","setAreChildrenLoading","setData","mountedRef","onChildrenLoaded","getNonPlanYearServicesSummary","getServices","services","summaries","cobra","cobraSummary","qeParticipants","initialNotices","retiree","retireeSummary","hasLOA","loa","loaSummary","defaultColors","CenterLabelDonutChart","chartData","centerItem","radius","innerRadius","colorScale","formatter","y","labelRadius","labelPlacement","labelPosition","labels","labelComponent","renderInPortal","fontFamily","centerHighlightFill","fontWeight","backgroundStyle","opacity","padAngle","padding","ReimbursementPlanSummary","showExport","annualTotals","reimbursements","setChartData","ReportsTile","startLoading","doneLoading","setPlanYears","selectedPlanYearId","setSelectedPlanYearId","serviceSummaries","setServiceSummaries","finally","HsaContributionsNotForwardedCard","isBlue","isYellow","lte","isRed","borderColor","countColor","ActionItems","fetchStatus","hsaContributionsCount","showCardLoading","showActionItems","showNothing","maybeShowCard","EmblaCarouselSlide","slide","backgroundColor","textColor","headline","paragraph","action1Link","action1Label","unqid","action2Link","action2Label","backgroundImage","EmblaCarousel","delay","emblaRef","emblaApi","useEmblaCarousel","loop","Autoplay","playOnInit","stopOnMouseEnter","stopOnInteraction","selectedIndex","setSelectedIndex","handleClick","selectedScrollSnap","autoplay","plugins","reset","scrollNext","scrollPrev","onSlideChange","on","MobileStepper","activeStep","nextButton","backButton","Dashboard","fullname","emailaddress","fmlaConsultant","WizardStepper","allowClick","handleStepClick","step","iconColors","isComplete","slug","CheckIcon","Stepper","alternativeLabel","connector","StepConnector","stepIterator","rendered","canClick","Step","StepLabel","renderSteps","setParticipantValues","setter","forEachObjIndexed","PayrollIdParticipantLookupInput","initialValue","onSearchStarted","onParticipantFound","onTextChanged","searchOn","previousPayrollId","setPreviousPayrollId","setPayrollId","searching","setSearching","debouncedSearch","mounted","handlePayrollIdChanged","transormed","padPayrollId","deHyphenate","pid","padStart","mergeLeft","entries","paddedPayrollId","InputLabelProps","maxLength","endAdornment","requiredText","errorMessages","matches","regexPatterns","transform","originalvalue","ssn","displayErrorText","showError","FormHelperText","LocationSelectForm","onLocationChanged","labelRef","loc","loccode","LocationSelect","abortCtrl","setDefault","apiOpts","useLocationOptions","StateSelect","onStateChanged","onStateBlur","states","abbreviation","handleDateChange","setFieldValue","handleSelectChange","handleCustomFieldChange","mapToSelectOption","labelProp","valueProp","formikFieldHasError","formikFieldErrorText","getIn","touched","ParticipantDetails","onHasChanged","genderLabelRef","helperText","handleChange","LocalizationProvider","dateAdapter","AdapterDayJS","DatePicker","renderInput","CobraQePersonalDetails","onNextStep","onCancel","useFormik","initialValues","onSubmit","setParticipantDetails","handleSearchStarted","submitForm","ParticipantSummary","DependentsSummary","dep","EventInfoSummary","hasOwnProperty","r_qualevid","desc","c_qualevid","eventDescription","CobraQeSummary","onSave","handleSubmit","doAnother","sectionHeader","link","plansId","ed","cb","isSame","pt","FormErrorText","show","EventTypeSelect","onSelectChange","tabIndex","withLoopIcon","loadingMessage","isLoading","WithLoopIcon","animationDirection","ModalContent","defaultClasses","titleText","footerContainer","withModal","WithModal","isOpen","footer","otherProps","Modal","StateContinuation","eventTypeState","StateContinuationModal","EventInfoForm","letterSent","respPostmark","useFormikContext","events","useEventTypes","EventSelectWithLoading","EventSelect","eventChangeModal","setEventChangeModal","setEventTypeState","eventTypeTest","substr","EventInfo","twoCol","CancelModal","prompt","closeText","cancelText","handleCancel","aria-labelledby","aria-describedby","modal","hashCoveredDependents","fromEntries","v","conformToForm","foundBenefit","plvlid","conformToSlice","availablePlans","allPlans","flatten","cd","parseFloat","subsidyEnd","benefitErrorMessage","fieldName","benErrors","BenefitSubsidyFields","BenefitDependents","ii","FormControlLabel","control","Checkbox","checked","BenefitsForm","planSelectLabelRef","hasCobraErsubsidy","costConfirmationModal","setConfirmationModal","hasTriggeredModal","setHasTriggeredModal","displayErSubsidy","showDependents","of","shape","otherwise","BenefitsFormContainer","alert","CobraQeBenefits","useCobraPlans","DependentsTableRow","dependent","dateFormat","onDependentDeleted","showModal","setShowModal","dependentInitials","TableRow","TableCell","dateOfBirth","relation","formatRelation","gender","formatGender","Tooltip","DependentsTable","handleDelete","Table","TableHead","TableBody","colSpan","originalValue","toDate","onSaveDependent","relationLabelRef","inputFormat","Dependents","initialAddedDependents","submitText","saving","openAddDependentModal","setOpenAddDependentModal","handleCancelAddDependent","canAddDependents","newDependents","CobraQeDependents","useHistoryBlock","regex","unMountCallback","addedCondition","navUnblock","setNavUnblock","unblock","block","NotFoundPage","notFoundImg","oops","goBack","wizardSteps","PersonOutlineIcon","EventIcon","PeopleOutlineIcon","LocalHospitalIcon","DescriptionIcon","CobraQeWizard","allDependents","NotFound","EnterCobraQePage","unmountCallback","blockRegex","activeStepSlug","setSaving","createData","amount","missingInfo","StatusWarning","Alert","severity","Row","row","resetFetchStatus","navigateToOverview","doUnwrap","unwrap","sx","borderBottom","scope","align","paddingBottom","paddingTop","Collapse","in","unmountOnExit","Box","margin","andThen","makeStatusWarning","contributionRow","i","deductionDate","ContributionsNotForwardedTable","TableContainer","Scratchpad","FileTypeSelect","fileTypes","fileType","FileUpload","uploading","setUploading","selectedFileType","setSelectedFileType","setFormData","fileInputKey","setFileInputKey","availableFileTypes","setFileTypes","useFileTypes","isValidInputs","dispatchMessage","notificationType","FileSelect","FormData","forEach","safeFilename","WARNING","random","formatOption","HistoryMonthSelect","onMonthYearChanged","ReportHistoryTableRow","rptHistory","rundate","unqId","file_name","FileHistoryTable","rh","HistoryReportTypeSelect","reportTypes","onReportTypeChanged","ReportHistory","setReportTypes","uniqueReportTypes","uniq","report","substring","lastIndexOf","ReportTypes","ReportHistoryFiles","yearAndMonth","ReportHistoryTable","FileHistoryTableRow","webfile","dateadded","fileId","fileid","wf","FileHistory","historyFiles","FileHistories","TabPanel","requirePayFreq","piSchema","CommonSelect","onSelectBlur","errorMessage","emptyOption","select","PayFreqSelect","payFreqs","onPayFreqChanged","isRequired","usePayFrequencies","GeneralInfo","enableReinitialize","PayFrequencies","handleReset","covend","CancelDirectBillingEvent","selectedParticipant","handleSuccess","cQualId","CancelDirectBillingEventModal","DisplayCobRetLoaEnrollmentRow","onPrintNotice","setIsOpen","reason","arpaEnrolled","lastPaymentDate","docNumber","InvoiceDetailTableRow","invoiceDetail","levelDescription","detailAmount","InvoicesTable","invoiceDetails","isExpanded","setPage","collapsedSize","detailNumber","TableFooter","TablePagination","rowsPerPage","rowsPerPageOptions","onPageChange","nthArg","SelectProps","useInvoiceDetails","isCobra","invoiceNumber","setInvoiceDetails","getInvoiceDetails","ViewInvoiceDetails","InvoiceDetails","InvoiceDetailsTable","InvoiceTableRow","invoice","invoiceDetailsOpen","setInvoiceDetailsOpen","generated","periodStart","periodEnd","paid","invoices","useInvoices","setInvoices","getInvoices","ViewInvoices","Invoices","InvoicesModal","CheckTableRow","check","setIsExpanded","checkNumber","checkAmount","postDate","appliedAmount","creditRemaining","Link","underline","invoiceAmount","payAmount","CheckTable","checks","ViewChecks","setChecks","useChecks","Checks","ChecksModal","onDownloadDocument","receivedDate","documentNumber","DocumentsTable","documents","handleDownloadDocument","DocumentTableRow","ViewDocuments","setDocuments","useDocuments","Documents","DocumentsModal","invoiceModalTitles","l","DisplayCobRetLoaEnrollment","invoicesOpen","setInvoicesOpen","documentsOpen","setDocumentsOpen","checksOpen","setChecksOpen","handlePrintNotice","PayDeductionValue","beginning","PayPeriodDeductions","deductions","deduction","defaultValueClass","PlanValue","labelClassName","valueClassName","makeUri","withTransactionModal","WithTransactionModal","transactions","setTransactions","TransactionsList","assocPath","TransactionRow","cells","TransactionExportButton","getDefaultBorderIncludes","border","includeBottomBorder","includeTopBorder","includeLeftBorder","includeRightBorder","PdfTableCell","mergedStyles","flex","weighting","justifyContent","textAlign","isHeader","borderRight","wordWrap","whiteSpace","items","isArray","wrap","PdfDataTableCell","getContent","PdfTableRow","rowCells","toArray","remainingWeighting","numberOfWeightingsDefined","weightingsPerNotSpecified","ceil","borderLeft","borderTop","display","flexDirection","rc","columnIndex","_PdfTableRow","PdfTableHeader","PdfTableBody","rowIndex","PdfTable","tableHeader","tableBody","Document","_Document","Page","_Page","Text","_Text","StyleSheet","_StyleSheet","_PdfTable","_PdfTableHeader","_PdfTableCell","_PdfTableBody","_PdfDataTableCell","create","MraPdf","incurredDate","referenceNumber","TransactionPaginator","pageSize","pageSizeOptions","onChangePage","onChangePageSize","newPage","onRowsPerPageChange","setPageSize","HsaPdf","CoveredDependentBox","CUSTOM_PLCCODE","ViewTransactionButton","setIsModalOpen","setIsPending","DataTable","initialPage","isPaginated","addIndex","nonIndexedMap","sliceWhenPaginated","th","PdfDataTableGenerator","h","paidTableHeaders","pendingTableHeaders","CustomTransactionsTable","isPending","useCustomTransactions","formattedTransactions","participantName","serviceDate","submittedAmount","rejectionReason","paidDate","CustomTransactions","EnrolledPlan","showCancelModal","setShowCancelModal","isModalOpen","formatDateRange","formatValue","valueClass","statusColor","isRollIn","enrollmentStart","enrollmentEnd","annualAllocation","totalContributions","totalReimbursements","totalForfeitures","totalRolledIn","totalRolledOut","remainingAllocation","balance","processed","firstIndexOfSpace","debitCardStatus","payPeriodDeductions","makeTransactionButton","ListEnrollments","divider","PlanDivider","PlanEnrollmentTab","cobEnrollment","retEnrollment","loaEnrollment","planEnrollments","loadCobraEnrollments","CobraEnrollments","RetireeEnrollments","LOAEnrollments","PlanEnrollments","ParticipantOverview","tab","nextTab","setNextTab","tabHasChanges","setTabHasChanges","setDependents","Subheader","Tabs","indicatorColor","newValue","Tab","updateParticipant","saveDependents","moreThan","useOpenPlans","openPlans","setOpenPlans","PlanSelect","onPlanSelected","showSubPlan","EnrollmentPlanSelection","found","PlanSelectWithLoader","isEdit","yearBeg","PlanEnrollmentHsa","validateSync","setWholeFormErrors","wholeFormErrors","planLevelMap","buttonText","Definition","dd","dt","MakeMRAMarkup","doc","MakeCustomMarkup","isBalance","PlanEnrollmentSummary","plcdesc","yearbeg","yearStart","isHra","positive","exclusive","parent","allocationMax","Number","MAX_SAFE_INTEGER","payDates","limitedPurpose","PayDateSelect","onPayDateSelected","pd","LFSAFields","showLFSA","floresAdministered","handleLevelChange","FormGroup","levelSelect","usePayDates","payFreq","setPayDates","qs","payDateQueryString","getAllocationMax","medmax","depmax","PlanEnrollmentMra","calculatedDeduction","setCalculatedDeduction","calculateAllocation","formikForm","allocation","firstDate","incomingField","dofc","alloc","toFixed","getAnnualAllocationMax","payDate","hasFloresHSA","hasOtherHSA","fields","allFilled","disableNextButton","DependentSelect","namespace","applyNamespace","PlanEnrollmentCustom","selectedDependents","PlanEnrollmentWizardStep","PlanEnrollmentWizard","savePayload","goToParticipantOverview","clickedStep","saveEnrollment","printQualifyingEvent","NoticeTableRow","notice","onNoticeDeleted","_getParticipant","useParticipantService","setDeleting","printing","setPrinting","loadingParticipant","setLoadingParticipant","startLoadingParticipant","doneLoadingParticipant","handleEditClick","qualid","formatDate","rowClasses","curry","dateToSend","qeNotice","qualdate","covstart","paidthru","initNotice","destinationName","columns","confirm","c_initid","hasPath","thunkify","noticeCompare","NoticesTable","allNotices","setAllNotices","filteredNotices","setFilteredNotices","foundIdx","comp","noticeFilter","CobraPendingQENotices","CobraPendingInitialNotices","settingsNav","PermContactCalendarIcon","ChangePasswordIcon","LockIcon","ContactsIcon","SettingsSidebar","settingsNavConfig","ContactInfo","saveSuccess","getUser","info","apiOptions","saveContactInfo","username","setUser","handleStateChange","contactInfoHTML","PasswordInput","onPasswordChanged","showPassword","setShowPassword","handleShowPassword","evt","newVal","onMouseDown","currentPassword","newPassword","confirmNewPassword","p1","p2","ChangePassword","cpOptions","UserName","OldPassword","NewPassword","changeSuccess","changeFailed","resendCode","multiFactorRequestBody","userName","MultiFactorSettings","enableTfa","setEnableTfa","requireMfa","Switch","enableTwoFactor","initials","contact","UserCard","pf","resp","ManageUsers","Grid","spacing","xs","_Switch","Redirect","_Redirect","ManageSettings","UpdatePlanEnrollmentWizardStep","UpdatePlanEnrollmentWizard","useEnrollmentDetails","UpdateStep","updateEnrollment","AddParticipant","doneSaving","hasFormChanged","sendToEmployee","sendToSpouse","spouseName","spouseGender","spouseBirthDate","participantFields","noticeFields","EnterCobraInitialNotice","formRef","hideModal","resetForm","saveInitialNotice","makeNoticePayload","scrollIntoView","behavior","inline","dirty","PayFreqs","part","spouse","LastDeductionSelect","onDateChange","LastDeduction","terminateBenefits","numDeductionDates","lastDeduction","TerminateParticipantForm","onAdd","lastDeductionSelect","TerminateParticipantRow","onRemove","TerminateParticipant","terminateParticipants","setTerminateParticipants","setTerminating","confirmModalIsOpen","setConfirmModalIsOpen","showConfirmModal","hideConfirmModal","cancelModalIsOpen","setCancelModalIsOpen","hideCancelModal","modalIsOpen","setModalIsOpen","showAddModal","hideAddModal","handleRemove","hasMaxParticipants","AddParticipantModal","detail","term","def","defClass","CobraQeDetails","statusMessage","letterDoc","postmark","responseDoc","coverageEnds","coverageTermSent","arpaEligible","eventSchema","benefitsSchema","FormikErrorFocus","isSubmitting","isValidating","selector","errorElement","UpdateCobraQeForm","setAvailablePlans","conformBenefits","conformed","useCobraQe","getCobraQe","UpdateCobraQe","startSaving","handleSave","useBalanceReportPlans","GraySummaryTile","ReportExportButton","onExport","textClasses","titleAccess","EnrollmentRosterTile","setDate","dateHasError","setDateHasError","setEnrollment","Enrollment","planCodeId","isCustom","newDate","variantMap","background","descriptionText","exportDisabled","variantClasses","CountWithLoader","ReportDateRangeFilter","onFilterChange","applyOnInit","setStartDate","setEndDate","handleApply","input","adornedEnd","InputAdornmentProps","positionEnd","ReportsByDateRange","counts","setCounts","downloadingBalance","setDownloadingBalance","downloadingReimbursement","setDownloadingReimbursement","downloadingBalanceByLocation","setDownloadingBalanceByLocation","downloadingBalanceByPayFrequency","setDownloadingBalanceByPayFrequency","Counts","reimbursement","handleReimbursementRecapExport","handleBalanceExport","handleBalanceByLocationExport","handleBalanceByPayFrequencyExport","downloadBalanceByLocationReport","downloadBalanceByPayFrequencyReport","downloadReimbursementRecapReport","getBalanceReportCounts","useDeductionDateOptions","deductionOptions","setDeductionOptions","ReductionListTile","setPayDate","total","setTotal","handlePayDateChange","getReductionListTotal","DeductionDateSelect","ReductionTotal","downloadReductionList","DebitCardWarnings","setCount","UnsubstantiatedDebitCard","ContributionsNotForwarded","AnnualAllocationAudit","allowedPlanCodes","BalanceAccountReports","setSelectedPlan","CustomReportsByDateRange","handleReimbursementExport","downloadCustomBalanceReport","downloadCustomReimbursementRecapReport","getCustomBalanceReportCounts","useCustomEnrollmentCount","CustomEnrollment","downloadCustomEnrollmentReport","useCustomEnrollmentWithDepsCount","CustomEnrollmentWithDeps","downloadCustomEnrollmentWithDepsReport","CustomReports","defaultCounts","pendingNotices","paymentsReceived","currentActive","monthlyRecap","acceptancesReceived","invoiceStatus","initialNoticesSent","activeWithAddress","noResponseWithAddress","termsFromCobra","ten95cData","useCobraReportCounts","setReportCounts","getCobraCountsByDateRange","InitialNoticeSent","downloadInitialNoticeSentReport","useNoResponseWithAddressCount","NoResponseWithAddress","usePendingResponseCount","getPendingResponseCount","PendingResponses","Downloading","useActiveParticipantCount","ActiveParticipants","AP","AP_ONE_LINE","AP_FULL_DATA","downloadActiveParticipantsOneLineReport","downloadActiveParticipantsFullDataReport","usePendingNoticeCount","getPendingNoticeCount","downloadPendingNoticeReport","CurrentActive","downloadCurrentActiveReport","NoticesMailed","downloadNoticesMailedReport","PaymentsReceived","downloadPaymentsReceivedReport","MonthlyRecap","downloadMonthlyRecapReport","AcceptanceReceived","downloadAcceptanceReceivedReport","InvoiceStatus","downloadInvoiceStatusReport","ActiveWithAddress","downloadActiveWithAddressReport","TerminatedParticipants","downloadTerminatedParticipantsReport","Ten95CData","download1095CReport","termsFromRetiree","turningSixtyFive","newEnrollments","overDueInvoices","useRetireeReportCounts","getRetireeCountsByDateRange","TurningSixtyFive","downloadTurningSixtyFiveReport","NewEnrollments","downloadNewEnrollmentsReport","OverDueInvoices","downloadOverDueInvoicesReport","termsFromLoa","useLoaReportCounts","getLoaCountsByDateRange","GenericFMLAReportTile","tabTypeMap","PendingNotices","CustomReimbursementReports","data-testId","ReportsTabPanels","activeTab","renderComp","Comp","GlobalReimbursements","downloadGlobalReimbursementsReport","GlobalReports","ReportsTabs","setActiveTab","newTab","flexContainer","tabsBottomBoder","useReportTypes","Reports","OpenEnrollment","DirectBillingPersonalDetails","DirectBillingEventInfoForm","updatingEvent","bind","mapEventTypesToOptions","eventInfoFormField","DirectBillingEventInfo","useMemo","mapToForm","mapToStore","DirectBillingQeDependents","planLevelId","DBBenefitDependents","selectClasses","BenefitsFormSection","covered","all","coveredDep","unhashCoveredDependents","strIdx","errorMap","DirectBillBenefits","BenefitsSummary","DirectBillingSummary","setBlockRegex","saveDirectBillingEvent","cancel","DirectBillingWizard","modalOpen","setModalOpen","goToDashboard","onWizardCancel","renderStep","DirectBillingQeDetails","valuesFromBenefits","UpdateDirectBillingForm","benefitsFromValues","eventInfoFromValues","BenefitsWithLoading","UpdateDirectBilling","usePlanDisplayNames","hasDirectBill","planAbbreviations","setPlanAbbreviations","planDisplayNames","setPlanDisplayNames","mappedPlans","setMappedPlans","abbreviations","mapPlanTypeToAbbreviation","uniqueAbbreviations","Set","displayNames","mapAbbreviationToDisplayName","GridCard","col","makeCard","CardActionArea","FsaEnrollmentTemplateCard","exists","setExists","fsaChecklist","CustomEnrollmentCard","subPlanIndex","customChecklist","subPlanId","downloadCustomChecklist","EnrollmentSection","healthCareFSAGuide","floresBenefitsMastercard","floresMobile","noWaitDependentCareFSA","dependentCareFSAGuide","commuterChecklist","commuterBenefitAccountGuide","limitedPurposeFSAGuide","hraChecklist","hraGuide","customPlan","subPlans","subPlan","pyrPlansId","cobraChecklist","directBillChecklist","hsaChecklist","hsaGuide","hsaFAQ","OpenEnrollmentResources","setActive","Chip","disablePopup","DirectDebitAccount","accounts","onAccountChanged","cddid","PayInvoice","directDebitFetchStatus","paying","setPaying","cddId","payAdminInvoice","AccountSelectWithLoading","DirectDebitAccountSelect","invoiceDate","dueDate","PayInvoiceModal","AdministrativeBillingRow","adminInvoice","stableSort","array","comparator","stabilizedThis","el","order","getComparator","orderBy","descendingComparator","Date","valueOf","AdministrativeBillingTable","adminInvoices","selectedOrder","setSelectedOrder","selectedOrderBy","setSelectedOrderBy","sortedAdminInvoices","setSortedAdminInvoices","createSortHandler","newOrder","handleRequestSort","numeric","sortable","headCell","sortDirection","TableSortLabel","direction","useAdministrativeBillingInvoices","AdministrativeBilling","MultiFactorAuth","setUserName","getCompanies","setErrors","passCode","setLogin","parseLoginToken","removeItem","useDocumentLibraryForms","formDocuments","setFormDocuments","getForms","imageMap","ninetyPercentMerchantList","allowableDependentCareExpenses","calendarOfEvents","claimProcessFlowChart","fedForm2441ChildAndDependentCareExpenses","fsaStoreEligibilityList","guideToAllowableOTCExpenses","guideToAllowableStatusChanges","guideToReimbursableDependentCareExpenses","hipaaPrivacyStandards","directDeposit","allowableMedicalExpenses","iiasApproved","reimbursableMedicalExpenses","defaultImage","dashTraining","getDocImage","useLegalDocuments","legalDocs","setLegalDocs","getLegalDocuments","useDocumentLibraryEducation","educationDocuments","setEducationDocuments","forms","titles","f","downloadLegalDoc","section","downloadCloudFile","fileSection","urlFragments","DocumentLibraryTabPanels","documentLibraryTypes","DocumentLibraryTabs","documentLibraryTabs","DocumentLibrary","DirectDebitConfirmation","debit","performDirectDebit","cddcomment","getCddComment","paydate","DirectDebitAccountSelectWithLoading","DirectDebitConfirmationModal","DirectDebitRow","frequencies","isPayable","DirectDebitTable","debits","useDirectDebits","setDebits","DirectDebit","directDebits","ContactDetails","AddUserStepOne","mergeDeepLeft","AddUserStepTwo","selections","setSelections","selectAll","allSelectedIdentifier","newSelections","selectOne","modified","pfqid","pfqdesc","ctpid","prmid","prmdesc","AddUser","handleApiError","handleApiSuccess","onExit","goToManageUsers","newUser","mergeDeepRight","saveUser","BorderLinearProgress","withStyles","theme","createStyles","colorPrimary","palette","grey","bar","borderRadius","LinearProgress","ChecklistCard","buttons","progress","CobraOePacketCard","summaryDisabled","CobraPlanCard","percentComplete","setLegacyChecklistCompletionProgress","HsaPlanCard","legacyChecklistComplete","CustomPlanCard","planNames","FsaPlanCard","HraPlanCard","hraIcon","QtePlanCard","DirectBillPlanCard","CobraLegacyPlanCard","ReEnrollmentChecklist","daysLeft","checklistPlans","directBill","hsa","fsa","hra","qte","populateChecklistPlans","fetchPlanStatus","fetchCustomPlanNameStatus","canShowOePackets","fetchStatuses","any","CoverLetterInfoTab","cobraOeResponseRequired","isFormValid","setIsFormValid","changeRoute","handleValidate","handleContinue","isContinueDisabled","displayDate","RadioGroup","Radio","downloadDocument","URL","createObjectURL","Blob","setAttribute","click","OeFiles","showDelete","showDownload","oePacketFiles","extension","PlanCodes","SummaryInfo","onComplete","blackAndWhite","twoSided","generalSectionComplete","SummaryTab","DragAndDropUpload","onDrop","dragActive","setDragActive","handleDrag","stopPropagation","onDragEnter","multiple","htmlFor","onDragLeave","onDragOver","dataTransfer","OeGeneratedFile","reviewStatus","approvalStatus","onChangeReviewStatus","onChangeApprovalStatus","onDownload","inputsDisabled","buttonBaseClasses","buttonApprovedClasses","buttonDisabledClasses","coverLetterBanner","classNamesArray","isDocApproved","isDocReviewed","setApproveButtonClass","OePacketsTab","isCoverLetterApproved","isElectionApproved","isCoverLetterReviewed","setIsCoverLetterReviewed","isElectionFormReviewed","setIsElectionFormReviewed","submitFile","uploadCobraOePacketDoc","coverLetter","electionForm","handleDownload","handleCoverLetterChangeReviewStatus","handleElectionFormChangeReviewStatus","handleCoverLetterChangeApprovalStatus","handleElectionFormChangeApprovalStatus","CobraReEnrollmentChecklist","saveStatus","submitDocStatus","completeChecklistStatus","centered","OePacketsOptions","cobraOeCoverLetter","handleOeHandlerChange","handleOeTemplatesChange","CobraEligibilityCount","warningModalStatus","setWarningModalStatus","eligibilityCount","hasError","onCountChange","handleNavigation","setEligibilityCount","YesNoChar","SelectOptions","StepOne","isChecklistComplete","isNewPlan","updatePaidThrough","carrierFieldsDisabled","hasPlanNameError","setHasPlanNameError","hasCarrierError","setHasCarrierError","hasNewCarrierNameError","setHasNewCarrierNameError","hasPlanTypeIdError","setHasPlanTypeIdError","hasPlanTypeDescriptionError","setHasPlanTypeDescriptionError","popoverOpen","popoverId","handlePlanName","handleCarrier","handleNewCarrierName","handlePlanTypeIdChange","handlePlanTypeDescription","handleActivateAccountType","handleUpdatePaidThrough","orderedInsurers","move","insurer","ct","ButtonBase","onMouseOver","onMouseOut","disableTouchRipple","Popover","pointerEvents","disableRestoreFocus","PaperProps","maskPhoneNumber","sanitized","newStr","StepTwo","carrierContactEmailArray","hasNotesError","setHasNotesError","hasPolicyNumberError","setHasPolicyNumberError","hasNameError","setHasNameError","hasEmailError","setHasEmailError","hasPhoneError","setHasPhoneError","contactEmailArray","handleContactEmailChange","joinAndSetEmailAddressString","resetTempEmail","handleAddCarrierContactEmail","removeCarrierContactEmail","handleCarrierUpdateMethod","ClientViaFridayReport","handleNotes","setPolicyNumberLabel","handlePolicyNumber","handleContactName","handleContactPhone","emailArray","RateInformationSelection","hasFiles","setRateInformationNow","setRateInformationUpload","RatesTable","handleOnChange","alignSelf","NewRateSelect","levelToAdd","setLevelToAdd","addedLevels","planLevelOptions","conflictingUnqIds","strIds","RatesFileUploadSection","ratesDocuments","onDeckPlan","upload","uploadPlanRatesDocuments","StepThree","hasConfirmRatesError","setHasConfirmRatesError","handleConfirmPlanRatesChange","componentsProps","typography","AddRateWizardContainer","planLevelsValid","isAddNewPlan","and","setEffectiveDates","notLastStep","notFirstStep","lt","prevHandler","dec","handleSaveCobraPlan","nextHandler","inc","empty","isStepOne","isStepTwo","isStepThree","stepOneValidation","stepTwoValidation","levels","hasEmptyRates","stepThreeValidation","setContinueButtonText","RatesStatus","handleUpdateRates","handleChangeActiveStatus","discontinuedClasses","deleteButtonText","planRatesStatus","planActiveStatus","PlanRatesCard","uniqueId","handleClickUpdateRates","resetCobraOnDeckPlan","toggleModalState","setExistingPlanTerminating","handleDeletePlan","terminatingClasses","modalContent","modalButtonText","PlanRates","cobraPlanYear","uniqueCobraPlans","discontinuedCobraPlans","drawerStatus","setDrawerStatus","fetchCobraPlansStatus","fetchCobraPlanTypesStatus","fetchCobraInsurersStatus","isDisabled","openHandler","handleClosePlanOnDeck","getUniqueId","SummaryAccordion","hasUploadedFiles","AccordionDetails","cobraOePacketPlan","isFinalizeDisabled","oeCoverLetterAnswer","setOeHandlerAnswer","setCoverLetterAnswer","skipOePackets","changeRedirectModalStatus","isPlanRatesIncomplete","cobraOeNewEligibleCount","Accordion","AccordionSummary","expandIcon","CobraPlanReEnrollmentChecklist","plansRequestStatus","coverageTypeRequestStatus","planLevelDescriptionsStatus","updateCobraPlanStatus","updatePlanYearStatus","Summary","LegacyChecklists","medPlanCode","sandbox","PlanRow","getRateAsCurrencyString","rate","toLocaleString","add2Percent","coverageTier","tierId","tierName","rateId","HistoryTable","marginBottom","RatesHistory","setTab","cobraFetchStatus","directBillFetchStatus","companyHasCobra","companyHasRetiree","contributionsNotForwarded","DirectBillGeneral","DirectBillReEnrollmentChecklist","SubmissionError","defaultLeaveRequestValues","employee","nameFirst","nameLast","addr1","addr2","city","stateProvCd","postalCd","employment","supervisorName","supervisorEmail","hireDate","totalHoursWorked","dateStart","dateEnd","kinRelation","duration","explanation","confirmationEmail","faxHealthProvider","providerName","providerFax","kinName","employmentTypeOptions","absenceOrAccommodationRequestReasons","leaveDurationOptions","personalDetailsSchema","employmentDetailsSchema","eventDetailsSchema","leaveRequestSchema","EnterLeaveRequestPersonalDetails","validateForm","FormikMuiDatePicker","minDate","maxDate","EnterLeaveRequestEmploymentDetails","EnterLeaveRequestEventInfo","setMaxStartDate","setMinEndDate","multiline","DateFormat_M_D_YYYY","EnterLeaveRequestSummary","onNewLeaveRequest","onGoToDash","EnterLeaveRequestPage","setIsSubmitting","hasSubmissionError","setHasSubmissionError","validateOnMount","submitLeaveRequestForm","setModalState","headerText","LeaveRecordCaseInfoTab","caseStatus","workState","durationOfLeave","regulationPolicyType","returnToWorkDate","relationship","relationshipDetails","LeaveRecordPaperworkDatesTab","paperworkSentDate","paperworkSentMethod","paperworkDueDate","paperworkDueDateExtension","paperworkReceivedDate","touchpointNotes","LeaveRecordEmployeeInfoTab","employeeType","jobTitle","hoursWorked","phone1","phone2","email1","email2","address1","address2","originalHireDate","recentHireDate","hrContactNames","hasSTDCoverage","LeaveRecordCurrentApprovalsTab","federalStartEndDates","stateLeaveRegulation1Name","stateLeaveRegulation1StartEndDates","stateLeaveRegulation2Name","stateLeaveRegulation2StartEndDates","stateLeaveRegulation3Name","stateLeaveRegulation3StartEndDates","reducedScheduledStartEndDates","reducedScheduleDetails","intTreatmentStartEndDates","intTreatmentDetails","intEpisodeStartEndDates","intEpisodeDetails","accommodationStartEndDates","accommodationDetails","denialStartEndDates","denialReason","personalLoAStartEndDates","medicalLoAStartEndDates","LeaveRecordTabPanels","LeaveRecordsEmployeeHeader","employeeSummary","taxIdLast4","LeaveRecordsPageHeader","currentRoute","previousRoute","LeaveRecordDetails","LeaveRecordsSearchResultRow","employeeSearchResult","LeaveRecordsSearchResultsContainer","searchStatus","zIndex","LeaveRecordsSearchInput","searchPromise","LeaveRecordsTableRow","caseSummary","onViewEdit","showFullName","caseListId","reasonForLeaveNrR","startIcon","ParticipantLeaveRecords","recentlyViewed","LeaveRecordsTable","cases","LeaveRecordsByEmployee","defaultPersonalDetailsFields","dob","defaultEventInfoFields","absenceDate","hours","minutes","headerTextEnum","submitTextEnum","eventInfoSchema","reportAbsenceSchema","ReportAnAbsencePersonalDetails","ReportAnAbsenceEventInfo","ReportAnAbsenceSummary","hasPersonalDetailsErrors","hasEventDetailsErrors","absenceTime","hour","minute","onNewAbsence","ReportAnAbsence","useLocation","URLSearchParams","submitReportAnAbsenceForm","AbsenceReport","absencesStatus","absences","maxHeight","overflowY","msOverflowY","stickyHeader","absenceId","absenceType","absenceDuration","App","companyLoadingStatus","enterQeSteps","planEnrollmentSteps","updateEnrollmentSteps","MuiTheme","responsiveFontSizes","createTheme","primary","light","main","dark","secondary","breakpoints","sm","md","lg","xl","components","MuiButton","styleOverrides","containedPrimary","containedSecondary","StyledEngineProvider","injectFirst","ThemeProvider","routing","server","models","attrs","Response","findBy","nonPlanYearServices","where","payfreqs","deductionDates","post","noContentResponse","createdResponse","okResponse","summaryUsers","contactUsers","contactInfos","first","put","getBalanceCounts","balanceReportCounts","new","planYearServiceSummaries","qeNotices","delete","initNotices","cInitId","fhMonthYears","fhWebFiles","reportHistoryMonthYears","reportHistoryClientFiles","marketingSlides","localeCompare","save","update","cobraQeTypes","c_qualid","statusCode","planObject","getNonPlanYearEnrollments","getCobraEnrollments","model","objOf","enrolledPlans","enrollmentTransactions","customPendingTransactions","customPaidTransactions","cobraDateRangeCounts","directBillEventTypes","requiremfa","eduDocs","legal","enrollmentResourcePlans","reEnrollmentPlans","makeServer","environment","Server","urlPrefix","Model","extend","hasMany","service","planYearServiceSummary","fhMonthYear","fhWebFile","marketingSlide","nonPlanYearService","reportHistoryClientFile","reportHistoryMonthYear","Location","cobraQeType","openPlan","cobraEnrollment","enrolledPlan","documentLibraryForms","fixtures","seeds","loadFixtures","routes","passthrough","companyRoutes","userRoutes","planYearRoutes","reportRoutes","qeNoticeRoutes","initNoticeRoutes","fileHistoryRoutes","marketingSlideRoutes","fileUploadRoutes","participantRoutes","reportHistoryRoutes","cobraQeRoutes","planEnrollmentRoutes","qualifyingEventRoutes","pendingResponsesRoutes","cobraDateRangeRoutes","directBillRoutes","adminBillingRoutes","multiFactorAuthenticationRoutes","documentLibraryRoutes","directDebitRoutes","responsibilitiesRoutes","permissionsRoutes","enrollmentResourcesRoutes","reEnrollmentPlansRoutes","TransitionRight","Slide","SnackPanel","snacks","snack","inner","Snackbar","autoHideDuration","TransitionComponent","browserHistory","createBrowserHistory","basename","reactPlugin","ReactPlugin","ApplicationInsights","config","instrumentationKey","extensions","extensionConfig","identifier","enableAutoRouteTracking","disableTelemetry","loadAppInsights","loginInit","REACT_APP_USE_MIRAGE","logging","Provider","_Provider","BrowserRouter","_BrowserRouter","getElementById","ReactDOM","StrictMode","AppInsightsContext","navigator","serviceWorker","ready","registration","unregister","console","module","exports","queryMap","unescaped","decoded","Buffer"],"mappings":"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CxBW,SAAUX,KACV1nD,UAAW0nD,KACXY,YAAaZ,KACbhnF,UAAWgnF,KACXlD,SAAUkD,KACVa,SAAUb,KACVjpC,QAASipC,KACTc,gBAAiBd,KACjBe,aAAcf,KACdd,uBAAwBc,KACxBZ,uBAAwBY,KACxBb,0BAA2Ba,KAC3B96C,QAAS86C,KACTn1G,SAAUm1G,KACV/5C,MAAO+5C,KACP5/C,YAAa4/C,KACbtC,oBAAqBsC,KACrBjD,eAAgBiD,KAChBX,qBAAsBW,KACtBV,qBAAsBU,KACtB9gF,gBAAiB8gF,KACjBrqB,cAAeqqB,KACfj+E,oBAAqBi+E,KACrBrlB,OAAQqlB,KACRgB,qBAAsBhB,KACtBhnB,mBAAoBgnB,KACpB5C,aAAc4C,KACd3C,aAAc2C,KACd36F,iBAAkB26F,KAClBx6F,YAAaw6F,KACbN,wBAAyBM,KACzBL,kBAAmBK,MAIrBiB,SAAU,CACRvtG,aACA+R,SACAgZ,aACAwmB,YACA44D,aACAE,eACAH,4BACAK,gBACAC,cACAG,mBACAf,gBACAn/C,aACAy+C,uBACA9hG,gBACAqjG,2BACAC,4BACA94F,aACAxE,cACA29F,gBACA3/E,cACAg+E,YACAhqC,aACAkC,YACAn1D,oBACAo/F,iBACAC,0BACAE,0BACAD,6BACA15C,YACA8B,aACAV,UACAzG,eACAs9C,uBACAX,kBACAsC,wBACAC,wBACApgF,mBACAy2D,iBACA5zD,uBACA44D,UACAqmB,wBACAhoB,sBACAokB,gBACAC,gBACA73F,eACAH,oBACAq6F,2BACAC,sBAGFuB,MAAM3E,GAEJA,EAAO4E,gBAGTC,SACE9xG,KAAK+xG,cAGLC,GAAchyG,MACdiyG,GAAWjyG,MACXkyG,GAAelyG,MACfmyG,GAAanyG,MACboyG,GAAepyG,MACfqyG,GAAiBryG,MACjBsyG,GAAkBtyG,MAClBuyG,GAAqBvyG,MACrBwyG,GAAiBxyG,MACjByyG,GAAkBzyG,MAClB0yG,GAAoB1yG,MACpB2yG,GAAc3yG,MACd4yG,GAAqB5yG,MACrB6yG,GAAsB7yG,MACtB8yG,GAAuB9yG,MACvB+yG,GAAqB/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","file":"static/js/main.52d079e8.chunk.js","sourcesContent":["import {\n adjust,\n always,\n both,\n compose,\n cond,\n equals,\n join,\n map,\n pipe,\n replace,\n split,\n toLower,\n toUpper,\n keys,\n type,\n T,\n} from 'ramda';\nimport dayjs from 'dayjs';\nimport { MonthAndYear } from 'shared/types/file-report-history.types';\n\n/*\n * Create a new object composed of properties picked from another object by\n * omitting the given properties. The inverse of {@link pick}.\n *\n * @param {object} obj The object to pick properties from\n * @param {string[]} props An array of properties to omit\n * @return {Object} The new object\n * @deprecated use import { omit } from 'ramda'\n */\nexport function omit<\n T extends Record<string, unknown>,\n K extends keyof T\n>\n(obj: T, props: Array<K>): Record<string, unknown> {\n if (props.length === 0) {\n return { ...obj };\n }\n\n const picked = {} as Record<string, unknown>;\n\n Object.keys(obj).forEach((key) => {\n if (!props.includes(key as K)) {\n picked[key] = obj[key];\n }\n });\n\n // Return new bject\n return picked;\n}\n\n/**\n * Parse a query string into a Map of key to value\n *\n * @param search the query string to parse (e.g. \"?key1=val1&key2=val2\")\n * @returns a Map of keys to values\n */\nexport function parseQueryString(search: string): Map<string, string> {\n if (search.length < 4) {\n return new Map();\n }\n\n let s = search;\n\n if (s.charAt(0) === '?') {\n s = s.slice(1);\n }\n\n return s\n .split('&')\n .reduce((mp, token) => {\n const [ key, val ] = token.split('=').slice(0,2);\n mp.set(key, val);\n\n return mp;\n }, new Map());\n}\n\n/**\n * Checks if an object has any owned properties. E.g. is it equivalent to {}\n *\n * @param {object} obj the object to check\n * @returns {boolean}\n */\nexport function objectIsEmpty(obj: object): boolean {\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Debounce functions for better performance\n * (c) 2018 Chris Ferdinandi, MIT License, https://gomakethings.com\n * @param {Function} fn The function to debounce\n * @param {number} timeSpan Time span for which a function needs to be debounced\n */\nexport function debounce(fn: Function, timeSpan: number) {\n // Setup a timer\n let timeout: number;\n\n // Return a function to run debounced\n return function (...args: any[]) {\n if (timeout) {\n window.clearTimeout(timeout);\n }\n // Setup the new requestAnimationFrame()\n timeout = window.setTimeout(() => {\n fn.apply(null, args);\n }, timeSpan);\n };\n}\n\n/**\n * Convert any string from any case to uppercase the first letter and the rest lower case.\n * @param {string}\n * @returns {string}\n */\nexport const upperFirst = compose(join(''), adjust(0, toUpper), split(''));\n\n/**\n * Convert any string from any case to name case, e.f. First Last\n * @param {string}\n * @returns {string}\n */\nexport const nameCase = compose(join(' '), map(upperFirst), split(' '), toLower);\n\nexport const currencyFormatter = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n});\n\n/**\n * Returns an empty function\n * @returns {Function}\n */\nexport const noop = always(undefined);\n\n/**\n * Applies a mask to a number or string. Used for sensitive information such as SSN\n */\nexport function mask(value: string | number, len = 5, char = 'X') {\n if (char.length > 1) {\n throw new Error('The char argument must be exactly one character');\n }\n\n const stringValue = value.toString();\n\n return char.repeat(Math.min(len, stringValue.length)) + stringValue.substring(Math.min(len, stringValue.length));\n}\n\n/**\n * Converts a 'Page Title' to a url usable string\n *\n * @param {string} title\n * @returns {string}\n */\nexport const slugFromTitle = pipe(toLower, replace(/\\s+/g, '-'));\n\n/**\n * Converts an url slug (\"page-title\") to a title (\"Page Title\")\n *\n * @param {string} title\n * @returns {string}\n */\nexport const titleFromSlug = pipe(replace(/-+/g, ' '), nameCase);\n\n/**\n * Determine if date is between two YYYY-MM-DD dates\n */\nexport function isWithinDateRange(\n yearBeginning: string,\n yearEnd: string,\n date?: Date,\n) {\n return both(\n always(dayjs(date)\n .add(1, 'day')\n .isAfter(dayjs(yearBeginning, 'YYYY-MM-DD'))),\n\n always(dayjs(date)\n .subtract(1, 'day')\n .isBefore(dayjs(yearEnd, 'YYYY-MM-DD'))),\n );\n}\n\nexport function setLegacySiteParams(query: string) {\n localStorage.setItem('legacyQueryParams', query.replace('&', '?'));\n}\n\nexport function getLegacySiteParams() {\n return localStorage.getItem('legacyQueryParams') ?? '';\n}\n\n/**\n * @deprecated\n *\n * Utility for navigating user to legacy enrollment site. To be removed once we\n * port enrollment to Dash\n */\nexport function createAndSubmitForm(form: HTMLFormElement, fieldValue: string) {\n form.method = 'post';\n form.action = 'https://www.flores247.com/reenrollment/reenroll.cshtml';\n form.target = '_blank';\n const hiddenField = document.createElement('input');\n hiddenField.type = 'hidden';\n hiddenField.name = 'planid';\n hiddenField.value = fieldValue;\n form.appendChild(hiddenField);\n document.body.appendChild(form);\n form.submit();\n\n // Cannot immediately resolve or post will not redirect\n return new Promise((r) => setTimeout(r, 500));\n}\n\n/**\n * Find the first path to a \"leaf\" in a nested Object.\n * A leaf is defined as a property with a primitive value.\n *\n * For example, leafPath({a: 1}) returns 'a'. leafPath({a: {b: {c: 1}}}) returns 'a.b.c'\n * Works with arrays, too: leafPath({a: {b: [{c: 1, d: 'f'}], x: 2}}) returns 'a.b.0.c'\n *\n * Unfortunately, the same value cannot be guaranteed every time across JS interpreters\n * because `keys` doens't carry that guarantee. In practice, this is probably fine.\n *\n * @param obj {Object} the object to f\n * @returns a string representing the path to the first leaf\n */\nexport function leafPath(obj: Object): string | undefined {\n const key = keys(obj).shift();\n\n if (key) {\n const valueType = type(obj[key]).toLowerCase();\n\n if ([ 'object', 'array' ].includes(valueType)) {\n return `${key}.${leafPath(obj[key])}`;\n }\n }\n\n // got to the end\n return key?.toString();\n}\n\nexport function planCodeToPlanType(planCode: string, subName = '') {\n return cond([\n [ equals('M'), always('MRA') ],\n [ equals('D'), always('DCRA') ],\n [ equals('T'), always('QTE') ],\n [ equals('A'), always('Retiree') ],\n [ equals('H'), always('HRA') ],\n [ equals('P'), always('Premium') ],\n [ equals('S'), always('HSA') ],\n [ equals('-'), always('LFSA') ],\n [ equals('0'), always(subName) ],\n [ T, always(undefined) ],\n ])(planCode as never);\n}\n\nexport function getYearAndMonth(monthYear: string) : MonthAndYear {\n const parsed = dayjs(monthYear, 'YYYY-M');\n const year = parsed.year();\n const month = parsed.month() + 1;\n\n return { year, month };\n}\n\nexport function toNumber(val: any) {\n return val !== '0' ? parseInt(val) : 0;\n}\n\nexport function valueOrPlaceholder(value: string | number | undefined | null, placeholder: string) {\n return !value || value === '' ? placeholder : value;\n}\n\nexport function dateOrPlaceholder(date: string | undefined, format: string, placeholder: string) {\n return !date || date === '' ? placeholder : dayjs(date).format(format);\n}\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/,\n ),\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(\n process.env.PUBLIC_URL,\n window.location.href,\n );\n\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready\n .then(() => {\n console.info(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA',\n );\n })\n .catch(console.error);\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n\n if (installingWorker === null) {\n return;\n }\n\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.info(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.',\n );\n\n // Execute callback\n if (config?.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.info('Content is cached for offline use.');\n\n // Execute callback\n if (config?.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n\n if (\n response.status === 404 ||\n (contentType !== null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister()\n .then(() => {\n window.location.reload();\n })\n .catch(console.error);\n })\n .catch(console.error);\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.info(\n 'No internet connection found. App is running in offline mode.',\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n return registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","export enum NotificationType {\n ERROR='error',\n WARNING='warning',\n INFO='info',\n SUCCESS='success',\n}\n\nexport interface Note {\n area: 'notifications' | 'snackbar' | 'both';\n type: NotificationType;\n message: string;\n key: string;\n}\n\nexport const MAX_NOTIFICATION_LIST_SIZE = 20;\n\nexport const NOTIFICATION_TIMEOUT = 5000; // milliseconds\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { Note, MAX_NOTIFICATION_LIST_SIZE, NotificationType } from './notification.types';\nimport { RootState } from 'store/rootReducer';\n\nexport interface NotificationState {\n notifications: Note[];\n}\n\nexport const initialState: NotificationState = {\n notifications: [],\n};\n\nconst notificationSlice = createSlice({\n name: 'notifications',\n initialState,\n reducers: {\n addNotification(state, { payload }: PayloadAction<Note>) {\n if (!payload.key) {\n payload.key = performance.now().toString();\n }\n\n state.notifications.unshift(payload);\n\n if (state.notifications.length > MAX_NOTIFICATION_LIST_SIZE) {\n state.notifications.pop();\n }\n },\n removeNotification(state, { payload }: PayloadAction<string>) {\n const idx = state.notifications.findIndex((n) => n.key === payload);\n\n if (idx > -1) {\n state.notifications.splice(idx, 1);\n }\n },\n },\n});\n\nexport const {\n addNotification,\n removeNotification,\n} = notificationSlice.actions;\n\n/**\n * A psuedo action to wrap a common pattern I've been using.\n *\n * @param {Error} error\n * @returns notifications/addNotification type action\n */\nexport function addHttpErrorNotification(error: Error) {\n return addNotification({\n message: error.message,\n type: NotificationType.ERROR,\n area: 'snackbar',\n key: performance.now().toString(),\n });\n}\n\n/**\n * A psuedo action to wrap a common pattern I've been using.\n *\n * @param {Message} message\n * @returns notifications/addNotification type action\n */\nexport function addHttpSuccessNotification(message: string) {\n return addNotification({\n message,\n type: NotificationType.SUCCESS,\n area: 'snackbar',\n key: performance.now().toString(),\n });\n}\n\nexport default notificationSlice.reducer;\n\n// selectors\nexport const selectNotifications = (state: RootState): Note[] => state.notifications.notifications;\n\nexport const selectSnacks = (state: RootState): Note[] => {\n return state.notifications.notifications.filter((n) => n.area === 'snackbar' || n.area === 'both');\n};\n\nexport const selectNotes = (state: RootState): Note[] => {\n return state.notifications.notifications.filter((n) => n.area === 'notifications' || n.area === 'both');\n};\n","export class HttpError extends Error {\n constructor(\n public status: number,\n public statusText: string,\n message?: string) {\n super(message);\n this.name = 'HttpError';\n }\n}\n","export type ApiHosts = {\n FMLA_HOST: string;\n};\n\nexport const ApiHostsMap = {\n FMLA_HOST: process.env.REACT_APP_FMLA_HOST,\n};\n\nexport enum ApiHostsEnum {\n FMLA_HOST = 'FMLA_HOST',\n}\n\nexport type ApiHostsType = keyof ApiHosts;\n","import download from 'downloadjs';\nimport 'whatwg-fetch';\nimport 'yet-another-abortcontroller-polyfill';\n\nimport { HttpError } from './httpError.class';\nimport { assertIsDefined } from './asserts';\nimport { ApiHostsMap, ApiHostsType } from './enums/api-hosts.enum';\n\n/**\n * Define some common content types so we don't mistype or have to look them up\n *\n * @enum {string}\n */\nexport enum ContentType {\n CSV = 'text/csv',\n CSS = 'text/css',\n DOC = 'application/msword',\n DOCX = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n FORM_DATA = 'multipart/form-data',\n HTML = 'text/html',\n JSON = 'application/json',\n PDF = 'application/pdf',\n TEXT = 'text/plain',\n XLS = 'application/vnd.ms-excel',\n XLSX = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n XML = 'application/xml',\n DEFAULT = 'application/octet-stream',\n}\n\n/**\n * Format for the options you can pass to (@link request).\n *\n * @interface APIOptions\n */\nexport interface APIOptions {\n /** body: parameters to pass to the API. Make sure the values are able to be\n * JSON stringified. Note that a request with GET or HEAD method cannot have\n * a body */\n body?: Record<string, any>;\n\n /** method: the request method. Default is GET */\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD' | 'PATCH';\n\n /** queryParams: A key-value set of optional query string parameters. If this\n * is present, the request function will build the querystring for you. */\n queryParams?: Record<string, string>;\n\n /** headers: Optional headers to send to the API. Defaults to JSON for Accept\n * and Content-type headers, so you probably don't have to do anything. */\n headers?: Record<string, string>;\n\n /** signal: Optional AbortSignal to pass to fetch to be able to abort an in progress\n * API request. See the [Abort API docs](https://developer.mozilla.org/en-US/docs/Web/API/AbortController) */\n signal?: AbortSignal;\n\n /** externalUrl: defaults to admin api url. can pass a new value in to specify different apis */\n externalUrl?: ApiHostsType;\n}\n\n/*\n * Default options for if you don't pass in an object.\n */\nconst defaultOptions: APIOptions = {\n method: 'GET',\n headers: {\n accept: ContentType.JSON,\n 'content-type': ContentType.JSON,\n },\n};\n\n/**\n * A standardized shape for all API responses.\n *\n * @interface APIResponse\n * @template T the type of the data property. E.g. APIResponse<User> or APIResponse<User[]>\n */\nexport interface APIResponse<T> {\n /** message: a descriptive status message from the API */\n message?: string;\n\n /** data: the data for the response */\n data: T;\n\n /** error: optional extended error information */\n error?: string;\n}\n\n/**\n * Convert an API path to a full API URL. This allows us to use environment\n * variables to configure the API host values.\n *\n * @param path the path to the resource, starting after <host>\n * @returns the path with the host\n */\nfunction apiUrl(path: string, externalUrl?: ApiHostsType): string {\n const host = externalUrl ? ApiHostsMap[externalUrl] : process.env.REACT_APP_API_HOST;\n\n return `//${host}${path[0] === '/' ? '' : '/'}${path}`;\n}\n\n/**\n * Generate a query string (without leading \"?\") for appending to a URL.\n *\n * @param params a key-value paring of parameter to\n * @returns the resulting query string or '' if there are no parameters.\n */\nfunction queryParamsToString(params: Record<string, string>): string {\n const keys = Object.keys(params);\n\n if (keys.length === 0) {\n return '';\n }\n\n return keys\n .map((k) => `${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`)\n .join('&');\n}\n\n/**\n * Intelligently append a query string to a given url by looking for the \"?\"\n *\n * @param url\n * @param queryString\n * @returns the resulting url\n */\nfunction appendQueryString(url: string, queryString: string): string {\n if (!queryString.length) {\n return url;\n }\n\n if (url.includes('?')) {\n return `${url}&${queryString}`;\n }\n\n return `${url}?${queryString}`;\n}\n\n/**\n * Pull a filename out of a Response, or default to defaultName\n *\n * @param {Response} res\n * @param {string} defaultName\n * @returns {string}\n */\nfunction filenameFromResponse(res: Response, defaultName: string): string {\n if (res.headers.has('content-disposition')) {\n const disposition = res.headers.get('content-disposition');\n const tokens = disposition?.split('; ') ?? [];\n\n if (tokens.length > 1 && /^filename=/.test(tokens[1])) {\n const fileParts = tokens[1].split('=');\n\n if (fileParts.length > 1) {\n return fileParts[1];\n }\n }\n }\n\n return defaultName;\n}\n\n/**\n * Downloads a file from a response from the API. Assumes the content type has already been checked.\n *\n * @param {Response} res\n */\nasync function downloadFile(res: Response): Promise<null> {\n const filename = filenameFromResponse(res, 'download');\n const blob = await res.blob();\n download(blob, filename);\n\n return null;\n}\n\n/**\n * Pull the value of the content-type header from the response. There's a little bit of parsing involved.\n *\n * @param {Response} res\n * @returns {string}\n */\nfunction getContentType(res: Response): string {\n let contentType = res.headers.get('content-type') ?? ContentType.DEFAULT;\n\n if (contentType.includes(';')) {\n const tokens = contentType.split(';');\n contentType = tokens[0].trim();\n }\n\n return contentType;\n}\n\n/**\n * Get the body from a response in a hopefully flexible and fault-tolerant way.\n * If the Content-length header is missing or 0, returns an empty string.\n * If the Content-type header is missing, returns an ArrayBuffer of the raw data.\n * The application/json content type triggers Response.json().\n * Other content types typically trigger Response.text().\n *\n * @template T\n * @param {Response} res\n * @returns {(Promise<APIResponse<T> | FormData | ArrayBuffer | string | null>)}\n * @throws if any of the Response's decoding methods throws.\n */\nasync function getBody<T>(res: Response): Promise<APIResponse<T> | null> {\n const contentLength = parseInt(res.headers.get('content-length') ?? '0');\n\n if (contentLength === 0 && res.headers.has('content-length')) {\n return null;\n }\n\n let data = null;\n const contentType = getContentType(res);\n\n switch (contentType) {\n case ContentType.JSON:\n const body = await res.json() as APIResponse<T>;\n\n return body;\n case ContentType.CSS:\n case ContentType.HTML:\n case ContentType.TEXT:\n case ContentType.XML:\n // todo: we're losing some type saftey here because I can't figure out the right typing for the return value that\n // doesn't break functions that call request<SomeType>. This should work just fine, but it's a hacky way to get\n // around the TypeScript compiler and my lack of knowledge around the advanced edges of TypeScript\n data = await res.text() as any as T;\n break;\n case ContentType.FORM_DATA:\n data = await res.formData() as any as T;\n break;\n default:\n data = await res.arrayBuffer() as any as T;\n break;\n }\n\n return { data, message: '' };\n}\n\n/**\n * A generic response handler from any of our own API functions. It is assumed\n * that all response bodies from our API have the form (@link APIReponse) and\n * that the type `T` defines the shape of the data returned from the API.\n *\n * @template T the type of the `data` property in the API\n * @param res the Response from the `fetch` request\n * @returns {Promise<T | null>} rejected with a message if response is not ok (300+ status) or\n * resolved with body data or null on success.\n */\nasync function handleAPIResponse<T>(res: Response): Promise<T | null> {\n if (res.headers.get('content-disposition')?.startsWith('attachment')) {\n return downloadFile(res);\n }\n\n const body = await getBody<T>(res);\n\n if (!res.ok) {\n const message = body?.message ?? '';\n\n if (res.status === 401) {\n window.location.replace(process.env.REACT_APP_LOGIN_URL ?? 'https://flores247.com/');\n } else {\n throw new HttpError(\n res.status,\n res.statusText,\n `API request failed. ${res.status} ${res.statusText}. ${message}`,\n );\n }\n }\n\n if (!body) {\n return null;\n }\n\n if (typeof body.data !== 'undefined') {\n return body.data;\n }\n\n return body as any as T;\n}\n\n/**\n * Get the authorization token.\n *\n * @returns token stored in localStorage\n * @throws if the token is not set or is empty\n */\nfunction getAuthorizationToken(): string {\n assertIsDefined(process.env.REACT_APP_JWT_STORAGE_KEY);\n\n const token = window.localStorage\n .getItem(process.env.REACT_APP_JWT_STORAGE_KEY);\n\n if (!token) {\n throw new Error('Authorization token is empty or not set');\n }\n\n return token;\n}\n\n/**\n * Make an API request.\n *\n * @template T the type of the `data` property in the expected APIResponse.\n * @param {string} path the path, not including the host, to the resource.\n * Make sure to start the path with '/'.\n * @param {APIOptions?} options\n * @returns {Promise<T | null>}\n * @throws if the authorization token is not set or is empty, or if decoding the body throws\n */\nasync function request<T>(\n path: string,\n options: APIOptions = defaultOptions,\n): Promise<T | null> {\n const {\n body,\n method,\n queryParams,\n headers = {},\n signal,\n externalUrl,\n } = { ...defaultOptions, ...options };\n const url = apiUrl(path, externalUrl);\n const token = getAuthorizationToken();\n\n headers.authorization = `Bearer ${token}`;\n\n const queryString = queryParamsToString(queryParams ?? {});\n const fullUrl = appendQueryString(url, queryString);\n\n let requestBody: any;\n\n if ([ 'POST', 'PUT', 'DELETE' ].includes(method) && !!body && headers['content-type'] === ContentType.JSON) {\n requestBody = JSON.stringify(body);\n } else {\n if (headers['content-type'] === ContentType.FORM_DATA) {\n delete headers['content-type'];\n }\n\n requestBody = body;\n }\n\n const res = await fetch(fullUrl, {\n body: requestBody,\n method,\n headers,\n signal,\n });\n\n return handleAPIResponse<T>(res);\n}\n\nexport default request;\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { Company } from './company.types';\nimport { AppThunk } from 'store';\nimport { RootState } from 'store/rootReducer';\nimport { User } from 'authentication/user.types';\nimport { assertIsDefined } from 'shared/asserts';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { getUserCompanies } from 'shared/api/companiesApi';\nimport { ApiStatus } from '../shared/types/api-status.types';\n\nexport interface CompanyState {\n companies: Company[];\n selectedCompany: Company | null;\n loading: ApiStatus;\n}\n\nconst savedCompany = localStorage.getItem('company');\n\nexport const initialState: CompanyState = {\n companies: [],\n selectedCompany: savedCompany ? JSON.parse(savedCompany) : null,\n loading: 'uninitialized',\n};\n\nconst companySlice = createSlice({\n name: 'companies',\n initialState,\n reducers: {\n loadCompaniesStart(state) {\n state.loading = 'pending';\n },\n loadCompaniesSuccess(state, { payload }: PayloadAction<Company[]>) {\n state.companies = payload;\n state.loading = 'fulfilled';\n },\n loadCompaniesFailed(state) {\n state.loading = 'rejected';\n },\n setSelectedCompany(state, { payload }: PayloadAction<Company>) {\n state.selectedCompany = payload;\n },\n },\n});\n\nexport const {\n loadCompaniesStart,\n loadCompaniesSuccess,\n loadCompaniesFailed,\n setSelectedCompany,\n} = companySlice.actions;\n\nexport default companySlice.reducer;\n\nexport function getCompaniesForUser(user: User): AppThunk {\n return async (dispatch) => {\n dispatch(loadCompaniesStart());\n\n try {\n const companies: Company[] | null = await getUserCompanies(user.conuserid);\n assertIsDefined(companies);\n dispatch(loadCompaniesSuccess(companies));\n } catch (ex) {\n dispatch(loadCompaniesFailed());\n dispatch(addHttpErrorNotification(ex));\n }\n };\n}\n\n// selectors\nexport const selectUserCompanies = (state: RootState): Company[] => state.companies.companies;\n\nexport const selectSelectedCompany = (state: RootState): Company | null => state.companies.selectedCompany;\n\nexport const selectLoadingCompanies = (state: RootState): ApiStatus => state.companies.loading;\n\nexport const selectSelectedCompanyId = (state: RootState): number => state.companies.selectedCompany?.compid ?? 0;\n","import { DeductionDate } from 'reports/reports.types';\nimport request from '../api-request';\nimport { CompanyLocation } from 'enter-cobra-qe/cobra-qe.types';\nimport { PayFreqSelectOption } from 'components/shared/PayFreqSelect';\nimport { Company } from 'companies/company.types';\n\nexport function getUserCompanies(userId: number) {\n if (userId <= 0) {\n return Promise.reject(new Error('Cannot get companies for invalid user.'));\n }\n\n return request<Company[]>(`/api/users/${userId}/companies`);\n}\n\nexport function getDeductionDates(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get deduction dates for invalid company.'));\n }\n\n return request<DeductionDate[]>(`/api/companies/${companyId}/deduction-dates`);\n}\n\nexport function logToServer(companyId: number, body: any) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot log for an invalid company.'));\n }\n\n return Promise.resolve();\n}\n\nexport function getLocations(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load locations for an invalid company.'));\n }\n\n return request<CompanyLocation[]>(`/api/companies/${companyId}/locations`);\n}\n\nexport function getPayFrequencies(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load pay frequencies for an invalid company.'));\n }\n\n return request<PayFreqSelectOption[]>(`/api/companies/${companyId}/payfreqs`);\n}\n","import { Dependent } from 'shared/types/non-plan-year.types';\nimport request from 'shared/api-request';\n\nexport function getDependents(companyId: number, employeeNumber: string) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load dependents for invalid company.'));\n }\n\n if (employeeNumber.length === 0) {\n // Resolve gracefully because we legitimately may not have an employeeNumber\n return Promise.resolve([]);\n }\n\n return request<Dependent[]>(`/api/companies/${companyId}/participant/${employeeNumber}/dependents`);\n}\n\nexport function saveDependents(companyId: number, employeeNumber: string, dependents: Dependent[]) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load dependents for invalid company.'));\n }\n\n if (employeeNumber.length === 0) {\n return Promise.reject(new Error('Cannot load dependents for invalid participant.'));\n }\n\n return request<boolean>(\n `/api/companies/${companyId}/participant/${employeeNumber}/dependents`,\n { method: 'POST', body: dependents },\n );\n}\n","import { map, or, is } from 'ramda';\n\n/**\n * Deeply maps values in an object\n */\nexport function deepMap<T extends {}> (fn: Function, obj: T): T {\n return map(\n (val) => {\n return or(is(Array, val), is(Object, val))\n ? deepMap(fn, val)\n : fn(val);\n }, obj);\n}\n","import { deepMap } from './deep-map';\n\n/**\n * Deeply trim whitespace in strings of an object\n */\nexport function deepTrim<T extends {}> (obj: T): T {\n return deepMap((val: any) => {\n if (typeof val === 'string') {\n return val.trim();\n }\n\n return val;\n }, obj);\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { RootState } from 'store/rootReducer';\n\nimport { Benefit, Dependent, QeParticipant, QeDependents } from 'shared/types/non-plan-year.types';\nimport {\n CobraQe,\n QeBenefits,\n QeEventInfo,\n QeEventType,\n} from './cobra-qe.types';\nimport { AppThunk } from 'store';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport request from 'shared/api-request';\nimport { assertIsDefined } from 'shared/asserts';\nimport { getDependents } from 'shared/api/dependentsApi';\nimport { deepTrim } from '../shared/utils/deep-trim';\nimport { lensPath, or, replace, set, view } from 'ramda';\n\nexport interface CobraQeState {\n entry: CobraQe;\n eventTypes: QeEventType[];\n loadingQe: boolean;\n}\n\nexport const initialState: CobraQeState = {\n entry: {\n participant: {\n empno: '',\n socsec: '',\n payrollid: '',\n birthdate: null,\n lname: '',\n fname: '',\n sex: null,\n hphone: null,\n hstreet1: null,\n hstreet2: null,\n hcity: null,\n hstate: null,\n hzip: null,\n location: null,\n payfreq: null,\n payfreq2: null,\n email: null,\n },\n eventDate: '',\n eventType: -1,\n coverageBegins: '',\n initialDependents: [],\n addedDependents: [],\n benefits: [],\n },\n eventTypes: [],\n loadingQe: false,\n};\n\nconst cobraQeSlice = createSlice({\n name: 'cobraQe',\n initialState,\n reducers: {\n loadQeStart(state) {\n state.loadingQe = true;\n },\n loadInitialDependentsStart(state) {\n state.entry.initialDependents = [];\n },\n loadQeSuccess(state, { payload }: PayloadAction<CobraQe>) {\n state.entry = payload;\n state.loadingQe = false;\n },\n loadQeFail(state) {\n state.loadingQe = false;\n },\n resetEntry(state) {\n state.entry = { ...initialState.entry };\n },\n updatePersonalDetails(state, { payload }: PayloadAction<QeParticipant>) {\n let pidLens = lensPath([ 'payrollid' ]);\n let formattedPayload = set(\n pidLens,\n replace(/-+/g, '', or(view(pidLens, payload), '')),\n payload,\n );\n state.entry.participant = deepTrim(formattedPayload);\n },\n updateEventInfo(state, { payload }: PayloadAction<QeEventInfo>) {\n state.entry.eventDate = payload.eventDate;\n state.entry.eventType = payload.eventType;\n state.entry.coverageBegins = payload.coverageBegins;\n state.entry.paidThrough = payload.paidThrough;\n },\n updateDependents(state, { payload }: PayloadAction<QeDependents>) {\n state.entry.initialDependents = payload.initialDependents;\n state.entry.addedDependents = payload.addedDependents;\n },\n updateBenefits(state, { payload }: PayloadAction<QeBenefits>) {\n state.entry.benefits = payload.benefits;\n },\n setEventTypes(state, { payload }: PayloadAction<QeEventType[]>) {\n state.eventTypes = payload;\n },\n },\n});\n\nexport const {\n resetEntry,\n updatePersonalDetails,\n updateEventInfo,\n updateDependents,\n updateBenefits,\n setEventTypes,\n loadQeStart,\n loadQeFail,\n loadQeSuccess,\n loadInitialDependentsStart,\n} = cobraQeSlice.actions;\n\nexport default cobraQeSlice.reducer;\n\n// thunks\nexport function loadCobraQe(compid: number, employeeNumber: string, unqid: number): AppThunk {\n return async (dispatch) => {\n dispatch(loadQeStart());\n\n try {\n const qe = await request<CobraQe>(`/api/companies/${compid}/cobra-qe/${employeeNumber}/${unqid}`);\n assertIsDefined(qe);\n dispatch(loadQeSuccess(qe));\n } catch (ex) {\n dispatch(loadQeFail());\n dispatch(addHttpErrorNotification(ex as Error));\n }\n };\n}\n\nexport function loadInitialDependents(compid: number, employeeNumber: string): AppThunk {\n return async (dispatch) => {\n dispatch(loadInitialDependentsStart());\n\n try {\n const dependents = await getDependents(compid, employeeNumber);\n dispatch(updateDependents({\n initialDependents: dependents ?? [],\n addedDependents: [],\n }));\n } catch (err) {\n dispatch(addHttpErrorNotification(err as Error));\n dispatch(updateDependents({\n initialDependents: [],\n addedDependents: [],\n }));\n }\n };\n}\n\n// selectors\nexport const selectCobraQeEntry = (state: RootState): CobraQe => state.cobraQe.entry;\n\nexport const selectQePersonalDetails = (rootState: RootState): QeParticipant => {\n return rootState.cobraQe.entry.participant;\n};\n\nexport const selectQeEventInfo = (state: RootState): QeEventInfo => {\n const { eventDate, eventType, coverageBegins, paidThrough } = state.cobraQe.entry;\n\n return { eventDate, eventType, coverageBegins, paidThrough };\n};\n\nexport const selectQeDependents = (state: RootState): QeDependents => {\n const { initialDependents, addedDependents } = state.cobraQe.entry;\n\n return { initialDependents, addedDependents };\n};\n\nexport const selectQeBenefits = (state: RootState): Benefit[] => {\n const { benefits } = state.cobraQe.entry;\n\n return benefits;\n};\n\nexport const selectEventTypes = (state: RootState): QeEventType[] => {\n return state.cobraQe.eventTypes;\n};\n\nexport const selectLoadingQe = (state: RootState) => state.cobraQe.loadingQe;\n\nexport const selectInitialDependents = (state: RootState) => state.cobraQe.entry.initialDependents;\n\n/**\n * Select a combined list of dependents for display purposes.\n * If initialDependents and addedDependents need to be updated separately, prefer `selectQeDependents`\n */\nexport const selectAllDependents = (\n { cobraQe: { entry: { initialDependents, addedDependents } } }: RootState,\n): Dependent[] => [ ...initialDependents, ...addedDependents ];\n","import { Participant } from 'participant-search/participant-list.types';\nimport request from 'shared/api-request';\n\nexport async function getParticipant(companyId: number, payrollId: string) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load participant for invalid company.'));\n }\n\n if (!payrollId) {\n return Promise.reject(new Error('Cannot load participant with invalid id.'));\n }\n\n let participant = await request<Participant>(`/api/companies/${companyId}/participant/${payrollId}`);\n\n if (!participant) {\n return Promise.reject(new Error(`Could not load participant with ID# ${ payrollId }`));\n }\n\n return participant;\n}\n\nexport function updateParticipant(companyId: number, participant: Participant) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot update participant for invalid company.'));\n }\n\n if (!participant.empno) {\n return Promise.reject(new Error('Cannot update participant with invalid id.'));\n }\n\n return request(`/api/companies/${companyId}/participant/${participant.empno}`, { method: 'PUT', body: participant });\n}\n\nexport function searchForParticipant(companyId: number, searchText: string, abortController?: AbortController) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot search for a participant for invalid company.'));\n }\n\n const search = searchText.trim();\n\n if (search === '') {\n return Promise.reject(new Error('Cannot search for a participant without a search string'));\n }\n\n const uri = `/api/companies/${companyId}/participants?searchText=${search}`;\n\n return request<Participant[]>(uri, { method: 'GET', signal: abortController?.signal });\n}\n","import { createAsyncThunk } from '@reduxjs/toolkit';\n\nimport { RootState } from 'store/rootReducer';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { getParticipant } from 'shared/api/participantApi';\n\nexport let fetchParticipant = createAsyncThunk(\n 'participant/fetchParticipant',\n (payrollId: string, thunkAPI) => {\n const state = thunkAPI.getState() as RootState;\n const company = selectSelectedCompany(state);\n\n return getParticipant(company?.compid ?? -1, payrollId);\n },\n);\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { AppThunk } from 'store';\nimport { RootState } from 'store/rootReducer';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { Participant } from 'participant-search/participant-list.types';\nimport { getParticipant, searchForParticipant } from 'shared/api/participantApi';\nimport { ApiStatus } from 'shared/types/api-status.types';\nimport { fetchParticipant } from 'participant-search/participant.thunks';\n\nexport interface ParticipantState {\n selected: Participant | null;\n loading: boolean;\n recentSelections: Participant[];\n searchText: string;\n searchResults: Participant[] | null; // null indicates searching\n fetchParticipantStatus: ApiStatus;\n}\n\nexport const initialState: ParticipantState = {\n selected: null,\n loading: false,\n recentSelections: [],\n searchText: '',\n searchResults: [],\n fetchParticipantStatus: 'uninitialized',\n};\n\nconst participantSlice = createSlice({\n name: 'participant',\n initialState,\n reducers: {\n loadParticipantStart(state) {\n state.loading = true;\n },\n loadParticipantEnd(state) {\n state.loading = false;\n },\n setSelectedParticipant(state, { payload }: PayloadAction<Participant | null>) {\n state.selected = payload;\n\n if (payload !== null && !state.recentSelections.some((s) => s.empno === payload.empno)) {\n if (state.recentSelections.length === 3) {\n state.recentSelections = [ payload, ...state.recentSelections.slice(0, 2) ];\n } else {\n state.recentSelections.unshift(payload);\n }\n }\n },\n resetRecentSearches(state) {\n state.recentSelections = [];\n },\n setSearchResults(state, { payload }: PayloadAction<Participant[] | null>) {\n state.searchResults = payload;\n },\n setSearchText(state, { payload }: PayloadAction<string>) {\n state.searchText = payload;\n },\n resetSearchResults(state) {\n state.searchResults = [];\n },\n setFetchParticipantStatus(state, { payload }:PayloadAction<ApiStatus>) {\n state.fetchParticipantStatus = payload;\n },\n },\n extraReducers: (builder) => {\n builder\n .addCase(fetchParticipant.pending, (state) => {\n state.fetchParticipantStatus = 'pending';\n })\n .addCase(fetchParticipant.rejected, (state) => {\n state.fetchParticipantStatus = 'rejected';\n })\n .addCase(fetchParticipant.fulfilled, (state, action) => {\n state.selected = action.payload;\n state.fetchParticipantStatus = 'fulfilled';\n });\n },\n});\n\nexport const {\n loadParticipantStart,\n loadParticipantEnd,\n setSelectedParticipant,\n resetRecentSearches,\n setSearchResults,\n setSearchText,\n resetSearchResults,\n setFetchParticipantStatus,\n} = participantSlice.actions;\n\nexport default participantSlice.reducer;\n\n// thunks\nexport function loadParticipant(compid: number, payrollId: string): AppThunk {\n return async (dispatch) => {\n dispatch(loadParticipantStart());\n\n try {\n const participant = await getParticipant(compid, payrollId);\n dispatch(setSelectedParticipant(participant));\n } catch (err) {\n dispatch(addHttpErrorNotification(err));\n } finally {\n dispatch(loadParticipantEnd());\n }\n };\n}\n\nlet abortController: AbortController | null = null;\n\nexport function searchParticipants(): AppThunk {\n return async (dispatch, getState) => {\n dispatch(setSearchResults(null));\n\n const {\n companies: { selectedCompany },\n participant: { searchText },\n } = getState();\n\n try {\n if (abortController !== null) {\n abortController.abort();\n }\n abortController = new AbortController();\n const participants = await searchForParticipant(selectedCompany?.compid ?? 0, searchText, abortController);\n\n dispatch(setSearchResults(participants ?? []));\n } catch (err) {\n if (err.name !== 'AbortError') {\n dispatch(addHttpErrorNotification(err));\n dispatch(setSearchResults([]));\n }\n } finally {\n abortController = null;\n }\n };\n}\n\n// selectors\nexport const selectParticipant = (state: RootState) => state.participant.selected;\n\nexport const selectParticipantLoading = (state: RootState) => state.participant.loading;\n\n/** @deprecated prefer selectRecentSelections */\nexport const selectRecentSearches = (state: RootState) => state.participant.recentSelections;\n\nexport const selectRecentSelections = (state: RootState) => state.participant.recentSelections;\n\nexport const selectSearchResults = ({ participant }: RootState) => {\n return participant.searchText.length ? participant.searchResults : participant.recentSelections;\n};\n\nexport const selectSearchText = (state: RootState) => state.participant.searchText;\n\nexport const selectFetchParticipantStatus = (state: RootState) => state.participant.fetchParticipantStatus;\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { assertIsDefined } from 'shared/asserts';\nimport { RootState } from 'store/rootReducer';\n\nimport { OpenPlan, PlanDetails, PlanEnrollmentPayload, PlanEnrollmentState } from './plan-enrollment.types';\n\nexport const initialState: PlanEnrollmentState = {\n plan: undefined,\n planDetails: undefined,\n};\n\nconst planEnrollmentSlice = createSlice({\n name: 'planEnrollment',\n initialState,\n reducers: {\n setPlan(state, { payload }: PayloadAction<OpenPlan>) {\n state.plan = payload;\n },\n setPlanDetails(state, { payload }: PayloadAction<PlanDetails>) {\n state.planDetails = payload;\n },\n resetPlanEnrollment(state) {\n state.plan = initialState.plan;\n state.planDetails = initialState.planDetails;\n },\n },\n});\n\nexport const {\n setPlan,\n setPlanDetails,\n resetPlanEnrollment,\n} = planEnrollmentSlice.actions;\n\nexport default planEnrollmentSlice.reducer;\n\n// thunks\n\n// selectors\nexport const selectPlanEnrollmentPlan = (state: RootState): OpenPlan | undefined => state.planEnrollment.plan;\n\nexport const selectPlanEnrollmentDetails = (state: RootState): PlanDetails | undefined => {\n return state.planEnrollment.planDetails;\n};\n\nexport const selectPlanEnrollmentPayload = (state: RootState): Partial<PlanEnrollmentPayload> => {\n const {\n companies: { selectedCompany },\n participant: { selected: participant },\n planEnrollment: { plan, planDetails },\n } = state;\n\n assertIsDefined(selectedCompany);\n assertIsDefined(participant);\n\n const { pyrid, plcid } = plan ?? {};\n const {\n partStart,\n partEnd = plan?.yearend,\n } = planDetails ?? {};\n let partAnn,\n firstPayDateOfChange,\n payPeriodDeduction,\n planLevel,\n plccode = plan?.plccode,\n currentContributions,\n additionalContributions,\n coveredDependents;\n\n if (planDetails?.type === 'MRA') {\n partAnn = planDetails.partAnn;\n firstPayDateOfChange = planDetails.firstPayDateOfChange;\n payPeriodDeduction = planDetails.payPeriodDeduction;\n\n if (planDetails.lfsa) {\n planLevel = planDetails.planLevel;\n plccode = '-';\n }\n }\n\n if (planDetails?.type === 'CUSTOM') {\n coveredDependents = planDetails.coveredDependents;\n additionalContributions = planDetails.additionalContributions;\n currentContributions = planDetails.currentContributions;\n }\n\n return {\n medplancd: selectedCompany.medplancd,\n empno: participant.empno,\n pyrid,\n plcid,\n plccode,\n partStart,\n partEnd,\n partAnn,\n firstPayDateOfChange,\n payPeriodDeduction,\n planLevel,\n currentContributions,\n additionalContributions,\n coveredDependents,\n };\n};\n","import { createAsyncThunk } from '@reduxjs/toolkit';\nimport { getFeatureFlags } from 'shared/api/appSettingsApi';\nimport { RootState } from 'store/rootReducer';\n\nexport const fetchFeatureFlags = createAsyncThunk(\n 'settings/fetchFeatureFlags',\n (_, thunkAPI) => {\n const state = thunkAPI.getState() as RootState;\n const { compid: companyId } = state.companies.selectedCompany ?? { compid: 0 };\n\n return getFeatureFlags(companyId);\n },\n);\n","import request from 'shared/api-request';\nimport { FeatureFlags } from 'components/app-settings.types';\n\nexport function getFeatureFlags(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get feature flag settings for invalid company.'));\n }\n\n return request<FeatureFlags>(`/api/companies/${companyId}/features`);\n}\n","export const ApiFetchStatus = {\n UNINITIALIZED: 'uninitialized',\n PENDING: 'pending',\n REJECTED: 'rejected',\n FULFILLED: 'fulfilled',\n};\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { RootState } from 'store/rootReducer';\nimport { fetchFeatureFlags } from './app-settings.thunks';\nimport { ApiStatus } from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport { ApiFetchStatus } from 'shared/enums/api-fetch-status.enum';\nimport { ReEnrollmentChecklistFlags } from './app-settings.types';\n\nexport interface AppSettingsState {\n pageTitle: string;\n fetchFeatureFlagsStatus: ApiStatus;\n reEnrollmentChecklist?: ReEnrollmentChecklistFlags;\n}\n\nexport const defaultChecklistFlagsState: ReEnrollmentChecklistFlags = {\n showDirectBillV2: false,\n showCustomPlanV2: false,\n showHsaPlanV2: false,\n showFsaPlanV2: false,\n showHraPlanV2: false,\n showQtePlanV2: false,\n};\n\nexport const initialState: AppSettingsState = {\n pageTitle: '',\n fetchFeatureFlagsStatus: ApiFetchStatus.UNINITIALIZED as ApiStatus,\n reEnrollmentChecklist: defaultChecklistFlagsState,\n};\n\nconst appSlice = createSlice({\n name: 'appSettings',\n initialState,\n reducers: {\n setPageTitle(state, { payload }:PayloadAction<string>) {\n state.pageTitle = payload;\n },\n },\n extraReducers: (builder) => {\n builder\n .addCase(fetchFeatureFlags.pending, (state) => {\n state.fetchFeatureFlagsStatus = ApiFetchStatus.PENDING as ApiStatus;\n })\n .addCase(fetchFeatureFlags.rejected, (state) => {\n state.fetchFeatureFlagsStatus = ApiFetchStatus.REJECTED as ApiStatus;\n })\n .addCase(fetchFeatureFlags.fulfilled, (state, action) => {\n state.fetchFeatureFlagsStatus = ApiFetchStatus.FULFILLED as ApiStatus;\n state.reEnrollmentChecklist = action.payload?.reEnrollmentChecklist ?? defaultChecklistFlagsState;\n });\n },\n});\n\nexport const {\n setPageTitle,\n} = appSlice.actions;\n\nexport default appSlice.reducer;\n\n// thunk\n\n// selectors\nexport const selectPageTitle = (state: RootState): string => state.appSettings.pageTitle;\n\nexport const selectFetchFeatureFlagsStatus = (state: RootState): string => state.appSettings.fetchFeatureFlagsStatus;\n\nexport const selectReenrollmentFeatureFlags = (state: RootState) => state.appSettings.reEnrollmentChecklist;\n","export type OnSubmit<T> = (values: T) => void;\n\nexport enum EnrollmentType {\n COBRA,\n Retiree,\n LOA,\n Regular,\n}\n","import request from '../api-request';\nimport { PlanEnrollmentPayload } from 'plan-enrollment/plan-enrollment.types';\nimport { CobraEnrollment, Enrollment } from 'participant-overview/enrollment/enrollment.types';\nimport { EnrollmentType } from 'participant-overview/participant-overview.types';\n\nexport function getEnrollments(companyId: number, employeeNumber: string) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load enrollments for invalid company'));\n }\n\n if (employeeNumber.trim().length === 0) {\n return Promise.reject(new Error('Cannot load enrollments for invalid employee'));\n }\n\n const uri = `/api/companies/${companyId}/plan-enrollment/enrollments/${employeeNumber.trim()}`;\n\n return request<Enrollment[]>(uri);\n}\n\nexport function saveEnrollment(companyId: number, savePayload: Partial<PlanEnrollmentPayload>) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot save enrollment for invalid company'));\n }\n\n const uri = `/api/companies/${companyId}/plan-enrollment`;\n\n return request(uri, { method: 'POST', body: savePayload });\n}\n\nexport function updateEnrollment(companyId: number, savePayload: Partial<PlanEnrollmentPayload>) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot update enrollment for invalid company'));\n }\n\n const uri = `/api/companies/${companyId}/plan-enrollment`;\n\n return request(uri, { method: 'PUT', body: savePayload });\n}\n\nexport function deleteEnrollment(\n companyId: number,\n planYearId: number,\n planCode: string,\n employeeNumber: string,\n customPlanId?: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot delete enrollment for invalid company'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot delete enrollment for invalid plan year'));\n }\n\n if (planCode.trim().length === 0) {\n return Promise.reject(new Error('Cannot delete enrollment for invalid plan code'));\n }\n\n if (employeeNumber.trim().length === 0) {\n return Promise.reject(new Error('Cannot delete enrollment for invalid employee'));\n }\n\n const uri = `/api/companies/${companyId}/plan-enrollment/${planYearId}/`\n + `${planCode.trim()}/participant/${employeeNumber.trim()}`\n + (customPlanId ? `/custom/${customPlanId}` : '');\n\n return request(uri, { method: 'DELETE' });\n}\n\nfunction uriMap(strings: TemplateStringsArray, compid: number, type: EnrollmentType, empno: string) {\n let subpath = '';\n\n switch (type) {\n case EnrollmentType.COBRA:\n subpath = 'get-cobra-enrollments';\n break;\n case EnrollmentType.Retiree:\n subpath = 'get-retiree-enrollments';\n break;\n case EnrollmentType.LOA:\n subpath = 'get-loa-enrollments';\n break;\n case EnrollmentType.Regular:\n subpath = 'enrollments';\n break;\n }\n\n return `${strings[0]}${compid}${strings[1]}${subpath}${strings[2]}${empno}`;\n}\n\nexport function getEnrollmentByType(companyId: number, employeeNumber: string, type: EnrollmentType) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load enrollments for invalid company'));\n }\n\n if (employeeNumber.trim().length === 0) {\n return Promise.reject(new Error('Cannot load enrollments for invalid employee'));\n }\n\n const uri = uriMap`/api/companies/${companyId}/plan-enrollment/${type}/${employeeNumber}`;\n\n return request<CobraEnrollment[]>(uri);\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { AppThunk } from 'store';\nimport { RootState } from 'store/rootReducer';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { Enrollment } from './enrollment.types';\nimport { deleteEnrollment, getEnrollments } from 'shared/api/enrollmentApi';\n\nexport interface EnrollmentsState {\n regular: Enrollment[] | null;\n deleting: boolean;\n}\n\nexport const initialState: EnrollmentsState = {\n regular: [],\n deleting: false,\n};\n\nconst enrollmentsSlice = createSlice({\n name: 'enrollments',\n initialState,\n reducers: {\n loadRegularEnrollmentsStart(state) {\n state.regular = null;\n },\n setRegularEnrollments(state, { payload }: PayloadAction<Enrollment[] | null>) {\n state.regular = payload;\n },\n startDeleting(state) {\n state.deleting = true;\n },\n doneDeleting(state) {\n state.deleting = false;\n },\n removeEnrollment(state, { payload }: PayloadAction<Enrollment>) {\n if (state.regular) {\n state.regular = state.regular.filter((e) => e.pyrid !== payload.pyrid || e.planCode !== payload.planCode);\n }\n },\n },\n});\n\nexport const {\n loadRegularEnrollmentsStart,\n setRegularEnrollments,\n startDeleting,\n doneDeleting,\n removeEnrollment,\n} = enrollmentsSlice.actions;\n\nexport default enrollmentsSlice.reducer;\n\n// thunks\nexport function loadEnrollments(companyId: number, employeeNumber: string): AppThunk {\n return async (dispatch) => {\n dispatch(loadRegularEnrollmentsStart());\n\n try {\n const enrollments = await getEnrollments(companyId, employeeNumber);\n dispatch(setRegularEnrollments(enrollments));\n } catch (err) {\n dispatch(addHttpErrorNotification(err));\n dispatch(setRegularEnrollments([]));\n }\n };\n}\n\nexport function deleteRegularEnrollment(companyId: number, employeeNumber: string, enrollment: Enrollment): AppThunk {\n return async (dispatch) => {\n dispatch(startDeleting());\n\n const { pyrid, planCode } = enrollment;\n\n try {\n await deleteEnrollment(companyId, parseInt(pyrid), planCode, employeeNumber, enrollment.customPlanId);\n dispatch(removeEnrollment(enrollment));\n } catch (err) {\n dispatch(addHttpErrorNotification(err));\n } finally {\n dispatch(doneDeleting());\n }\n };\n}\n\n// selectors\nexport const selectRegularEnrollments = (state: RootState) => state.enrollments.regular;\n\nexport const selectDeletingEnrollment = (state: RootState) => state.enrollments.deleting;\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { AppThunk } from 'store';\nimport { RootState } from 'store/rootReducer';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { CobraEnrollment } from './enrollment/enrollment.types';\nimport { getEnrollmentByType } from 'shared/api/enrollmentApi';\nimport { EnrollmentType } from 'participant-overview/participant-overview.types';\n\nexport interface ParticipantOverviewState {\n cobraEnrollments: CobraEnrollment[] | null;\n retireeEnrollments: CobraEnrollment[] | null;\n loaEnrollments: CobraEnrollment[] | null;\n}\n\nexport const initialState: ParticipantOverviewState = {\n cobraEnrollments: [],\n retireeEnrollments: [],\n loaEnrollments: [],\n};\n\nconst participantOverviewSlice = createSlice({\n name: 'participantOverview',\n initialState,\n reducers: {\n loadCobraEnrollmentsStart(state) {\n state.cobraEnrollments = null;\n },\n setCobraEnrollments(state, { payload }: PayloadAction<CobraEnrollment[] | null>) {\n state.cobraEnrollments = payload;\n },\n loadRetireeEnrollmentsStart(state) {\n state.retireeEnrollments = null;\n },\n setRetireeEnrollments(state, { payload }: PayloadAction<CobraEnrollment[] | null>) {\n state.retireeEnrollments = payload;\n },\n loadLoaEnrollmentsStart(state) {\n state.loaEnrollments = null;\n },\n setLoaEnrollments(state, { payload }: PayloadAction<CobraEnrollment[] | null>) {\n state.loaEnrollments = payload;\n },\n },\n});\n\nexport const {\n loadCobraEnrollmentsStart,\n setCobraEnrollments,\n loadRetireeEnrollmentsStart,\n setRetireeEnrollments,\n loadLoaEnrollmentsStart,\n setLoaEnrollments,\n} = participantOverviewSlice.actions;\n\nexport default participantOverviewSlice.reducer;\n\n// thunks\nexport function loadCobraEnrollments(companyId: number, employeeNumber: string): AppThunk {\n return async (dispatch) => {\n dispatch(loadCobraEnrollmentsStart());\n\n try {\n const enrollments = await getEnrollmentByType(companyId, employeeNumber, EnrollmentType.COBRA);\n dispatch(setCobraEnrollments(enrollments));\n } catch (err) {\n dispatch(addHttpErrorNotification(err));\n dispatch(setCobraEnrollments([]));\n }\n };\n}\n\nexport function loadRetireeEnrollments(companyId: number, employeeNumber: string): AppThunk {\n return async (dispatch) => {\n dispatch(loadRetireeEnrollmentsStart());\n\n try {\n const enrollments = await getEnrollmentByType(companyId, employeeNumber, EnrollmentType.Retiree);\n dispatch(setRetireeEnrollments(enrollments));\n } catch (err) {\n dispatch(addHttpErrorNotification(err));\n dispatch(setRetireeEnrollments([]));\n }\n };\n}\n\nexport function loadLoaEnrollments(companyId: number, employeeNumber: string): AppThunk {\n return async (dispatch) => {\n dispatch(loadLoaEnrollmentsStart());\n\n try {\n const enrollments = await getEnrollmentByType(companyId, employeeNumber, EnrollmentType.LOA);\n dispatch(setLoaEnrollments(enrollments));\n } catch (err) {\n dispatch(addHttpErrorNotification(err));\n dispatch(setLoaEnrollments([]));\n }\n };\n}\n\n// selectors\nexport const selectCobraEnrollments = (state: RootState) => state.participantOverview.cobraEnrollments;\n\nexport const selectRetireeEnrollments = (state: RootState) => state.participantOverview.retireeEnrollments;\n\nexport const selectLoaEnrollments = (state: RootState) => state.participantOverview.loaEnrollments;\n","export const defaultParticipant = {\n payrollid: '',\n empno: '',\n socsec: '',\n birthdate: '',\n lname: '',\n fname: '',\n sex: '',\n hphone: '',\n hstreet1: '',\n hstreet2: '',\n hcity: '',\n hstate: '',\n hzip: '',\n location: null,\n payfreq: '',\n payfreq2: '',\n email: '',\n dependents: [],\n};\nObject.freeze(defaultParticipant);\n\nexport const defaultContact = {\n conlname: '',\n confname: '',\n conphone: '',\n confax: '',\n contitle: '',\n condept: '',\n conaddr1: '',\n conaddr2: '',\n concity: '',\n constate: '',\n conzip: '',\n conemail: '',\n};\nObject.freeze(defaultContact);\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { isNil, omit, pick, path, clone, clamp } from 'ramda';\nimport dayjs, { Dayjs } from 'dayjs';\n\nimport { RootState } from 'store/rootReducer';\nimport {\n DBBenefit,\n DBParticipant,\n DirectBillingEventType,\n DirectBillingQe,\n DirectBillSavePayload,\n DBDetails,\n} from './direct-billing.types';\nimport { defaultParticipant } from 'shared/constants';\nimport { AppThunk } from 'store';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { getAvailableBenefits, getDirectBillEventTypes, getDirectBillingEvent } from 'shared/api/directBillingApi';\nimport { Dependent, EventInfo } from 'shared/types/non-plan-year.types';\nimport { getDependents } from 'shared/api/dependentsApi';\n\nexport interface DirectBillingState {\n entry: DirectBillingQe;\n eventTypes: DirectBillingEventType[] | null;\n availableBenefits: DBBenefit[] | null;\n}\n\nexport const initialState: DirectBillingState = {\n entry: {\n participant: defaultParticipant,\n eventInfo: {\n eventDate: '',\n eventType: -1,\n coverageBegins: '',\n },\n dependents: {\n initial: [],\n added: [],\n },\n benefits: [],\n },\n eventTypes: [],\n availableBenefits: [],\n};\n\nconst directBillingQeSlice = createSlice({\n name: 'directBillingQe',\n initialState,\n reducers: {\n resetEntry(state) {\n state.entry = { ...initialState.entry };\n },\n setEventTypes(state, { payload }: PayloadAction<DirectBillingEventType[] | null>) {\n state.eventTypes = payload;\n },\n setAvailableBenefits(state, { payload }: PayloadAction<DBBenefit[] | null>) {\n state.availableBenefits = payload;\n },\n setBenefits(state, { payload }: PayloadAction<DBBenefit[]>) {\n state.entry.benefits = payload.filter(benefit => !isNil(benefit.selectedPlan));\n },\n setAddedDependents(state, { payload }: PayloadAction<Dependent[]>) {\n state.entry.dependents.added = payload;\n },\n setInitialDependents(state, { payload }: PayloadAction<Dependent[] | null>) {\n state.entry.dependents.initial = payload;\n },\n setEntry(state, { payload }) {\n state.entry = payload;\n },\n setEventInfo(state, { payload }: PayloadAction<EventInfo>) {\n state.entry.eventInfo = payload;\n },\n setParticipant(state, { payload }:PayloadAction<DBParticipant>) {\n state.entry.participant = payload;\n },\n },\n});\n\nexport const {\n resetEntry,\n setEventTypes,\n setAddedDependents,\n setInitialDependents,\n setEntry,\n setBenefits,\n setAvailableBenefits,\n setEventInfo,\n setParticipant,\n} = directBillingQeSlice.actions;\n\nexport default directBillingQeSlice.reducer;\n\n// thunks\nexport function loadAvailableBenefits(companyId: number, coverageDate?: string | Dayjs): AppThunk {\n return async (dispatch, getState) => {\n dispatch(setAvailableBenefits(null));\n\n try {\n const coverageBegins: string | Dayjs | undefined = path(\n [ 'directBillingQe', 'entry', 'eventInfo', 'coverageBegins' ],\n getState(),\n );\n const date = dayjs(coverageDate || coverageBegins).format('YYYY-MM-DD');\n const benefitPlans = await getAvailableBenefits(companyId, date);\n\n const benefitsWithLifeAndOther = benefitPlans?.reduce((\n acc: DBBenefit[],\n benefit: DBBenefit,\n ) => {\n const lifeOrOther = benefit.plans.find(p => [ 6, 8 ].includes(p.planType));\n\n return lifeOrOther\n ? [ ...acc, ...new Array(clamp(1, 4, benefit.plans.length)).fill(null).map(() => clone(benefit)) ]\n : [ ...acc, benefit ];\n }, []);\n\n dispatch(setAvailableBenefits(benefitsWithLifeAndOther ?? []));\n } catch (ex) {\n dispatch(setAvailableBenefits([]));\n dispatch(addHttpErrorNotification(ex));\n }\n };\n}\n\nexport function loadInitialDependents(companyId: number): AppThunk {\n return async (dispatch, getState) => {\n dispatch(setInitialDependents(null));\n\n try {\n const { directBillingQe: { entry: { participant: { empno } } } } = getState();\n\n if (empno.length > 0) {\n const dependents = await getDependents(companyId, empno);\n dispatch(setInitialDependents(dependents ?? []));\n }\n } catch (ex) {\n dispatch(setInitialDependents([]));\n dispatch(addHttpErrorNotification(ex));\n }\n };\n}\n\nexport function loadEventTypes(companyId: number): AppThunk {\n return async (dispatch) => {\n dispatch(setEventTypes(null));\n\n try {\n const types = await getDirectBillEventTypes(companyId);\n dispatch(setEventTypes(types));\n } catch (ex) {\n dispatch(setEventTypes(null));\n dispatch(addHttpErrorNotification(ex));\n }\n };\n}\n\nexport function loadDirectBillingEvent(companyId: number, rQualId: number, employeeNumber: string): AppThunk {\n return async (dispatch) => {\n dispatch(resetEntry());\n dispatch(setAvailableBenefits(null));\n\n try {\n const entry = await getDirectBillingEvent(companyId, rQualId, employeeNumber);\n dispatch(setEntry(entry));\n\n const bennies = entry?.benefits ?? [];\n dispatch(setBenefits(bennies));\n dispatch(setAvailableBenefits(bennies));\n } catch (ex) {\n dispatch(setAvailableBenefits([]));\n dispatch(addHttpErrorNotification(ex));\n }\n };\n}\n\n// selectors\nexport const selectDirectBillingQeEntry = (state: RootState): DirectBillingQe => state.directBillingQe.entry;\n\nexport const selectDirectBillingParticipant =\n (state: RootState): DBParticipant => state.directBillingQe.entry.participant;\n\nexport const selectDirectBillingEventTypes =\n (state: RootState): DirectBillingEventType[] | null => state.directBillingQe.eventTypes;\n\nexport const selectDirectBillingEventInfo =\n (state: RootState): EventInfo => state.directBillingQe.entry.eventInfo;\n\nexport const selectDirectBillingDetails =\n (state: RootState): DBDetails | undefined => state.directBillingQe.entry.details;\n\nexport const selectAvailableBenefits = (state: RootState): DBBenefit[] | null => {\n const { availableBenefits, entry: { benefits: selectedBenefits } } = state.directBillingQe;\n\n if (availableBenefits === null) {\n return null;\n }\n\n return availableBenefits.map((available) => {\n const selected = selectedBenefits.find((s) => s.selectedPlan?.planTypeName === available.planTypeName);\n\n if (!selected) {\n return available;\n }\n\n return {\n ...omit([ 'plans', 'planTypeName' ], selected),\n ...pick([ 'plans', 'planTypeName' ], available),\n };\n });\n};\n\nexport const selectDirectBillingBenefits =\n (state: RootState): DBBenefit[] => state.directBillingQe.entry.benefits;\n\nexport const selectDirectBillingDependents = (state: RootState): Dependent[] => {\n const { initial, added } = state.directBillingQe.entry.dependents;\n\n return added.concat(initial ?? []);\n};\n\nexport const selectDirectBillSavePayload = (state: RootState): DirectBillSavePayload => {\n const {\n r_qualid,\n participant,\n eventInfo,\n benefits,\n dependents: { added: addedDependents },\n } = state.directBillingQe.entry;\n\n return {\n r_qualid,\n participant,\n eventInfo,\n addedDependents,\n benefits: benefits.map((benefit) => ({\n ...omit([ 'plans', 'planTypeName' ], benefit),\n cost: benefit.cost ?? 0,\n subsidy: benefit.subsidy ?? 0,\n })),\n };\n};\n\nexport const selectInitialDependents = (state: RootState): Dependent[] | null => {\n const { initial } = state.directBillingQe.entry.dependents;\n\n return initial;\n};\n\nexport const selectAddedDependents = (state: RootState): Dependent[] => {\n const { added } = state.directBillingQe.entry.dependents;\n\n return added;\n};\n","import dayjs from 'dayjs';\nimport {\n CancelDirectBillingPayload,\n DBBenefit,\n DirectBillingEventType,\n DirectBillingQe,\n DirectBillSavePayload,\n} from 'direct-billing/direct-billing.types';\nimport request from '../api-request';\n\nexport function getDirectBillEventTypes(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load direct billing event types for invalid company.'));\n }\n\n const uri = `/api/companies/${companyId}/direct-bill/event-types`;\n\n return request<DirectBillingEventType[]>(uri);\n}\n\nexport function saveDirectBillingEvent(companyId: number, body: DirectBillSavePayload) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot save Retiree/LOA billing event for invalid company.'));\n }\n\n const uri = `/api/companies/${companyId}/direct-billing-events`;\n\n return request(uri, { method: 'POST', body });\n}\n\nexport function getAvailableBenefits(companyId: number, effectiveDate: string) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get available benefits for invalid company.'));\n }\n\n const date = dayjs(effectiveDate);\n\n if (!date.isValid()) {\n return Promise.reject(new Error(`Cannot get available benefits for invalid effective date: ${effectiveDate}`));\n }\n\n const uri = `/api/companies/${companyId}/direct-bill/plans?effectiveDate=${date.format('YYYY-MM-DD')}`;\n\n return request<DBBenefit[]>(uri);\n}\n\nexport function updateDirectBillingEvent(companyId: number, body: DirectBillSavePayload) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot update Retiree/LOA billing event for invalid company.'));\n }\n\n const uri = `/api/companies/${companyId}/direct-billing-events`;\n\n return request<DirectBillSavePayload>(uri, { method: 'PUT', body });\n}\n\nexport function cancelDirectBillingEvent(companyId: number, body: CancelDirectBillingPayload) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot cancel Retiree/LOA billing event for invalid company.'));\n }\n\n const uri = `/api/companies/${companyId}/direct-billing-events/cancel`;\n\n return request(uri, { method: 'DELETE', body });\n}\n\nexport function getDirectBillingEvent(companyId: number, rQualId: number, employeeNumber: string) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load Retiree/LOA billing event for invalid company.'));\n }\n\n if (rQualId <= 0) {\n return Promise.reject(new Error('Cannot load Retiree/LOA billing event for invalid event id.'));\n }\n\n if (!/^\\d{9}$/.test(employeeNumber)) {\n return Promise.reject(\n new Error(`Cannot load Retiree/LOA billing event for invalid employee id ${employeeNumber}.`),\n );\n }\n\n const uri = `/api/companies/${companyId}/direct-billing-events/${rQualId}/employees/${employeeNumber}`;\n\n return request<DirectBillingQe>(uri);\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { ContactUser, Permission, Responsibility, SummaryUser } from 'manage-settings/manage-users/manage-users.types';\nimport { CompanyLocation } from 'enter-cobra-qe/cobra-qe.types';\nimport { PayFreqSelectOption } from 'components/shared/PayFreqSelect';\nimport { RootState } from 'store/rootReducer';\nimport { AppThunk } from 'store';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { getResponsibilities } from 'shared/api/responsibilitiesApi';\nimport { getPermissions } from 'shared/api/permissionsApi';\nimport { assertIsDefined } from 'shared/asserts';\nimport { getLocations, getPayFrequencies } from 'shared/api/companiesApi';\nimport { getSummaryUsers, getContactUser } from 'shared/api/usersApi';\nimport { defaultContact } from 'shared/constants';\n\nexport interface ManageUserState {\n responsibilities: Responsibility[] | null;\n permissions: Permission[] | null;\n locations: CompanyLocation[] | null;\n payFrequencies: PayFreqSelectOption[] | null;\n users: SummaryUser[] | null;\n selectedUser: ContactUser | null;\n}\n\nexport const defaultSelectedUser = {\n ...defaultContact,\n responsibilities: [],\n locations: [],\n payFrequencies: [],\n permissions: [],\n};\n\nexport const initialState: ManageUserState = {\n responsibilities: [],\n permissions: [],\n locations: [],\n payFrequencies: [],\n users: [],\n selectedUser: defaultSelectedUser,\n};\n\nconst manageUsersSlice = createSlice({\n name: 'manageUsers',\n initialState,\n reducers: {\n setResponsibilities(state, { payload }: PayloadAction<Responsibility[] | null>) {\n state.responsibilities = payload;\n },\n setPermissions(state, { payload }: PayloadAction<Permission[] | null>) {\n state.permissions = payload;\n },\n setLocations(state, { payload }: PayloadAction<CompanyLocation[] | null>) {\n state.locations = payload;\n },\n setPayFrequencies(state, { payload }: PayloadAction<PayFreqSelectOption[] | null>) {\n state.payFrequencies = payload;\n },\n setUsers(state, { payload }: PayloadAction<SummaryUser[] | null>) {\n state.users = payload;\n },\n setSelectedUser(state, { payload }: PayloadAction<ContactUser | null>) {\n state.selectedUser = payload;\n },\n resetSelectedUser(state) {\n state.selectedUser = defaultSelectedUser;\n },\n },\n});\n\nexport const {\n setResponsibilities,\n setPermissions,\n setLocations,\n setPayFrequencies,\n setUsers,\n setSelectedUser,\n resetSelectedUser,\n} = manageUsersSlice.actions;\n\nexport default manageUsersSlice.reducer;\n\n// thunk\nexport function loadResponsibilities(): AppThunk {\n return async (dispatch) => {\n dispatch(setResponsibilities(null));\n\n try {\n const responsibilities = await getResponsibilities();\n dispatch(setResponsibilities(responsibilities));\n } catch (ex) {\n dispatch(setResponsibilities([]));\n dispatch(addHttpErrorNotification(ex));\n }\n };\n}\n\nexport function loadPermissions(): AppThunk {\n return async (dispatch) => {\n dispatch(setPermissions(null));\n\n try {\n const permissions = await getPermissions();\n dispatch(setPermissions(permissions));\n } catch (ex) {\n dispatch(setPermissions([]));\n dispatch(addHttpErrorNotification(ex));\n }\n };\n}\n\nexport function loadLocations(): AppThunk {\n return async (dispatch, getState) => {\n dispatch(setLocations(null));\n\n try {\n const { companies: { selectedCompany } } = getState();\n assertIsDefined(selectedCompany?.compid);\n const locations = await getLocations(selectedCompany.compid);\n dispatch(setLocations(locations));\n } catch (ex) {\n dispatch(setLocations([]));\n dispatch(addHttpErrorNotification(ex));\n }\n };\n}\n\nexport function loadPayFrequencies(): AppThunk {\n return async (dispatch, getState) => {\n dispatch(setPayFrequencies(null));\n\n try {\n const { companies: { selectedCompany } } = getState();\n assertIsDefined(selectedCompany?.compid);\n const payFrequencies = await getPayFrequencies(selectedCompany.compid);\n dispatch(setPayFrequencies(payFrequencies));\n } catch (ex) {\n dispatch(setPayFrequencies([]));\n dispatch(addHttpErrorNotification(ex));\n }\n };\n}\n\nexport function loadUsers(): AppThunk {\n return async (dispatch, getState) => {\n dispatch(setUsers(null));\n\n try {\n const { companies: { selectedCompany } } = getState();\n assertIsDefined(selectedCompany?.compid);\n const users = await getSummaryUsers(selectedCompany.compid);\n dispatch(setUsers(users));\n } catch (ex) {\n dispatch(setUsers([]));\n dispatch(addHttpErrorNotification(ex));\n }\n };\n}\n\nexport function loadSelectedUser(conid: number): AppThunk {\n return async (dispatch, getState) => {\n dispatch(setSelectedUser(null));\n\n try {\n const { companies: { selectedCompany } } = getState();\n assertIsDefined(selectedCompany?.compid);\n const user = await getContactUser(selectedCompany.compid, conid);\n dispatch(setSelectedUser(user));\n } catch (ex) {\n dispatch(setSelectedUser(null));\n dispatch(addHttpErrorNotification(ex));\n }\n };\n}\n\n// selectors\nexport const selectResponsibilities = (state: RootState): Responsibility[] | null => state.manageUsers.responsibilities;\n\nexport const selectPermissions = (state: RootState): Permission[] | null => state.manageUsers.permissions;\n\nexport const selectLocations = (state: RootState): CompanyLocation[] | null => state.manageUsers.locations;\n\nexport const selectPayFrequencies =\n (state: RootState): PayFreqSelectOption[] | null => state.manageUsers.payFrequencies;\n\nexport const selectUsers = (state: RootState): SummaryUser[] | null => state.manageUsers.users;\n\nexport const selectSelectedUser = (state: RootState): ContactUser | null => state.manageUsers.selectedUser;\n","import request from '../api-request';\nimport { Responsibility } from 'manage-settings/manage-users/manage-users.types';\n\nexport function getResponsibilities() {\n return request<Responsibility[]>(`/api/responsibilities`);\n}\n","import request from '../api-request';\nimport { Permission } from 'manage-settings/manage-users/manage-users.types';\n\nexport function getPermissions() {\n return request<Permission[]>(`/api/permissions`);\n}\n","import request from '../api-request';\nimport { ContactUser, SummaryUser } from 'manage-settings/manage-users/manage-users.types';\nimport { setJWT } from 'authentication/authentication';\n\nexport function getSummaryUsers(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Unable to get users for invalid company.'));\n }\n\n return request<SummaryUser[]>(`/api/companies/${companyId}/users`)\n .then((result) => result?.map((u) => ({\n ...u,\n responsibilities: (u.responsibilities as string).split('|'),\n locations: (u.locations as string).split('|'),\n payFrequencies: (u.payFrequencies as string).split('|'),\n })) ?? []);\n}\n\nexport async function getUserPermissions(companyId: number) {\n const response = await request<string>(`/api/companies/${companyId}/users/get-user-permissions`);\n setJWT(response ?? '');\n}\n\nexport async function saveUser(companyId: number, body: ContactUser) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Unable to save user for invalid company.'));\n }\n\n if (!!body.conid) {\n return request(`/api/companies/${companyId}/users/${body.conid}`, { method: 'PUT', body });\n }\n\n return request(`/api/companies/${companyId}/users`, { method: 'POST', body });\n}\n\nexport async function getContactUser(companyId: number, conid: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Unable to get user for invalid company.'));\n }\n\n if (conid < 0) {\n return Promise.reject(new Error('Unable to get user for invalid user id.'));\n }\n\n return request<ContactUser>(`/api/companies/${companyId}/users/${conid}`);\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { EnrollmentResourcePlan } from 'open-enrollment-resources/open-enrollment.types';\nimport { RootState } from 'store/rootReducer';\nimport { AppThunk } from 'store';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { getCompanyOpenEnrollment } from 'shared/api/enrollmentResourcesApi';\nimport { assertIsDefined } from 'shared/asserts';\n\nexport interface EnrollmentResourcesState {\n plans: EnrollmentResourcePlan[] | null;\n}\n\nexport const initialState: EnrollmentResourcesState = {\n plans: [],\n};\n\nconst openEnrollmentResourcesSlice = createSlice({\n name: 'enrollmentResources',\n initialState,\n reducers: {\n setEnrollmentResourcePlans(state, { payload }: PayloadAction<EnrollmentResourcePlan[] | null>) {\n state.plans = payload;\n },\n },\n});\n\nexport const {\n setEnrollmentResourcePlans,\n} = openEnrollmentResourcesSlice.actions;\n\nexport default openEnrollmentResourcesSlice.reducer;\n\n// thunk\nexport function loadEnrollmentResourcePlans(): AppThunk {\n return async (dispatch, getState) => {\n dispatch(setEnrollmentResourcePlans(null));\n\n try {\n const { companies: { selectedCompany } } = getState();\n assertIsDefined(selectedCompany?.compid);\n const plans = await getCompanyOpenEnrollment(selectedCompany.compid);\n dispatch(setEnrollmentResourcePlans(plans));\n } catch (ex) {\n dispatch(setEnrollmentResourcePlans([]));\n dispatch(addHttpErrorNotification(ex));\n }\n };\n}\n\n// selectors\nexport const selectEnrollmentResourcePlans = (state: RootState): EnrollmentResourcePlan[] | null => {\n return state.enrollmentResources.plans;\n};\n","import request, { ContentType } from '../api-request';\nimport { EnrollmentResourcePlan } from 'open-enrollment-resources/open-enrollment.types';\n\nexport function doesFsaTemplateExist(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot check for FSA enrollment template for invalid company.'));\n }\n\n return request<boolean>(`/api/companies/${companyId}/enrollment-resources/fsa/template-exists`);\n}\n\nexport function downloadFsaTemplate(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download FSA enrollment template for invalid company.'));\n }\n\n const uri = `/api/companies/${companyId}/enrollment-resources/fsa/download-template`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n}\n\nexport function downloadCustomChecklist(companyId: number, planYearId: number, planId: number, subPlanId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download checklist for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot download checklist for invalid plan year.'));\n }\n\n if (planId <= 0) {\n return Promise.reject(new Error('Cannot download checklist for invalid plan.'));\n }\n\n if (subPlanId <= 0) {\n return Promise.reject(new Error('Cannot download checklist for invalid custom plan.'));\n }\n\n const uri = `/api/companies/${companyId}/enrollment-resources/custom` +\n `/${planYearId}/${planId}/${subPlanId}/download-checklist`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n}\n\nexport function getCompanyOpenEnrollment(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get open enrollment plans for invalid company.'));\n }\n\n return request<EnrollmentResourcePlan[]>(`/api/companies/${companyId}/enrollment-resources/plans`);\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { MonthAndYear } from 'shared/types/file-report-history.types';\nimport { WebFile } from 'file-history/file-history.types';\nimport { AppThunk } from 'store';\nimport { assertIsDefined } from 'shared/asserts';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { getFileHistoryFiles, getFileHistoryMonths } from 'shared/api/fileHistoryApi';\nimport { RootState } from 'store/rootReducer';\n\nexport interface FileHistoryState {\n monthYears: MonthAndYear[] | null;\n webFiles: WebFile[] | null;\n selectedMonthYear: MonthAndYear | null;\n selectedReportType: string | null;\n}\n\nexport const initialState: FileHistoryState = {\n monthYears: [],\n webFiles: [],\n selectedMonthYear: null,\n selectedReportType: null,\n};\n\nconst fileHistorySlice = createSlice({\n name: 'fileHistory',\n initialState,\n reducers: {\n setMonthYears(state, { payload }: PayloadAction<MonthAndYear[] | null>) {\n state.monthYears = payload;\n },\n setWebFiles(state, { payload }: PayloadAction<WebFile[] | null>) {\n state.webFiles = payload;\n },\n setSelectedMonthYear(state, { payload }: PayloadAction<MonthAndYear | null>) {\n state.selectedMonthYear = payload;\n },\n setSelectedReportType(state, { payload }: PayloadAction<string | null>) {\n state.selectedReportType = payload;\n },\n },\n});\n\nexport const {\n setMonthYears,\n setWebFiles,\n setSelectedMonthYear,\n setSelectedReportType,\n} = fileHistorySlice.actions;\n\nexport default fileHistorySlice.reducer;\n\n// thunk\nexport function loadMonthYears(): AppThunk {\n return async (dispatch, getState) => {\n dispatch(setMonthYears(null));\n\n try {\n const { companies: { selectedCompany } } = getState();\n assertIsDefined(selectedCompany?.compid);\n const monthYears = await getFileHistoryMonths(selectedCompany.compid);\n dispatch(setMonthYears(monthYears));\n dispatch(setSelectedMonthYear(monthYears?.length ? monthYears[0] : null));\n } catch (ex) {\n dispatch(setMonthYears([]));\n dispatch(addHttpErrorNotification(ex));\n }\n };\n}\n\nexport function loadWebFiles(year: number, month: number): AppThunk {\n return async (dispatch, getState) => {\n dispatch(setWebFiles(null));\n\n try {\n const { companies: { selectedCompany } } = getState();\n assertIsDefined(selectedCompany?.compid);\n const webFiles = await getFileHistoryFiles(selectedCompany.compid, year, month);\n dispatch(setWebFiles(webFiles));\n } catch (ex) {\n dispatch(setWebFiles([]));\n dispatch(addHttpErrorNotification(ex));\n }\n };\n}\n\n// selectors\nexport const selectMonthYears = (state: RootState): MonthAndYear[] | null => state.fileHistory.monthYears;\n\nexport const selectWebFiles = (state: RootState): WebFile[] | null => state.fileHistory.webFiles;\n\nexport const selectSelectedMonthYear = (state: RootState): MonthAndYear | null => state.fileHistory.selectedMonthYear;\n\nexport const selectSelectedReportType = (state: RootState): string | null => state.fileHistory.selectedReportType;\n","import request, { ContentType } from 'shared/api-request';\nimport { MonthAndYear } from 'shared/types/file-report-history.types';\nimport { WebFile } from 'file-history/file-history.types';\n\nexport function getFileHistoryMonths(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get file history for invalid company.'));\n }\n\n return request<MonthAndYear[]>(`/api/companies/${companyId}/filehistory`);\n}\n\nexport function getFileHistoryFiles(companyId: number, year: number, month: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get file list for invalid company.'));\n }\n\n if (year < 1986) {\n return Promise.reject(new Error('Cannot get file list for invalid year.'));\n }\n\n if (month < 1 || month > 12) {\n return Promise.reject(new Error('Cannot get file list for invalid month.'));\n }\n\n return request<WebFile[]>(`/api/companies/${companyId}/filehistory/${year}/${month}`);\n}\n\nexport function downloadFileHistoryFile(companyId: number, fileId: number, fileName: string) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download file for invalid company.'));\n }\n\n if (fileId <= 0) {\n return Promise.reject(new Error('Cannot download file for invalid file ID.'));\n }\n\n if (fileName.length === 0) {\n return Promise.reject(new Error('Cannot download file for invalid file name.'));\n }\n\n const uri = `/api/companies/${companyId}/filehistory/download/${fileId}/${fileName}`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.DEFAULT } });\n}\n","import { createAsyncThunk } from '@reduxjs/toolkit';\nimport { getSlides } from 'shared/api/slideshowApi';\n\nexport const fetchSlides = createAsyncThunk('slideshow/fetchSlides', getSlides);\n","import request from 'shared/api-request';\nimport { Slide } from 'marketing-info-tile/marketing-info-tile.types';\n\nexport function getSlides() {\n return request<Slide[]>('/api/marketing-slides');\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { Slide } from 'marketing-info-tile/marketing-info-tile.types';\nimport { RootState } from 'store/rootReducer';\nimport { fetchSlides } from 'marketing-info-tile/slideshow.thunks';\nimport { ApiStatus } from 'shared/types/api-status.types';\n\nexport interface SlideShowState {\n slides: Slide[];\n fetchSlidesStatus: ApiStatus;\n}\n\nexport const initialState: SlideShowState = {\n slides: [],\n fetchSlidesStatus: 'uninitialized',\n};\n\nconst slideshowSlice = createSlice({\n name: 'slideshow',\n initialState,\n reducers: {\n setSlides(state, { payload }: PayloadAction<Slide[]>) {\n state.slides = payload;\n },\n },\n extraReducers: (builder) => {\n builder\n .addCase(fetchSlides.pending, (state) => {\n state.fetchSlidesStatus = 'pending';\n })\n .addCase(fetchSlides.rejected, (state) => {\n state.fetchSlidesStatus = 'rejected';\n })\n .addCase(fetchSlides.fulfilled, (state, action) => {\n state.slides = action.payload ?? [];\n state.fetchSlidesStatus = 'fulfilled';\n });\n },\n});\n\nexport const {\n setSlides,\n} = slideshowSlice.actions;\n\nexport default slideshowSlice.reducer;\n\n// selectors\nexport const selectSlides = (state: RootState) => state.slideshow.slides;\n\nexport const selectFetchSlidesStatus = (state: RootState) => state.slideshow.fetchSlidesStatus;\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { MonthAndYear } from 'shared/types/file-report-history.types';\nimport { ReportHistory } from 'report-history/report-history.types';\nimport { RootState } from 'store/rootReducer';\nimport { getReportHistories, getReportHistoryMonths } from 'shared/api/reportHistoryApi';\nimport { AppThunk } from 'store';\nimport { assertIsDefined } from 'shared/asserts';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\n\nexport interface ReportHistoryState {\n monthYears: MonthAndYear[] | null;\n reports: ReportHistory[] | null;\n selectedMonthYear: MonthAndYear | null;\n selectedReportType: string | null;\n}\n\nexport const initialState: ReportHistoryState = {\n monthYears: [],\n reports: [],\n selectedMonthYear: null,\n selectedReportType: null,\n};\n\nconst reportHistorySlice = createSlice({\n name: 'reportHistory',\n initialState,\n reducers: {\n setReportMonthYears(state, { payload }: PayloadAction<MonthAndYear[] | null>) {\n state.monthYears = payload;\n },\n setReports(state, { payload }: PayloadAction<ReportHistory[] | null>) {\n state.reports = payload;\n },\n setSelectedMonthYear(state, { payload }: PayloadAction<MonthAndYear | null>) {\n state.selectedMonthYear = payload;\n },\n setSelectedReportType(state, { payload }: PayloadAction<string | null>) {\n state.selectedReportType = payload;\n },\n },\n});\n\nexport const {\n setReportMonthYears,\n setReports,\n setSelectedMonthYear,\n setSelectedReportType,\n} = reportHistorySlice.actions;\n\nexport default reportHistorySlice.reducer;\n\n// thunk\nexport function loadReportMonthYears(): AppThunk {\n return async (dispatch, getState) => {\n dispatch(setReportMonthYears(null));\n\n try {\n const { companies: { selectedCompany } } = getState();\n assertIsDefined(selectedCompany?.compid);\n const monthYears = await getReportHistoryMonths(selectedCompany.compid);\n dispatch(setReportMonthYears(monthYears));\n dispatch(setSelectedMonthYear(monthYears?.length ? monthYears[0] : null));\n } catch (ex) {\n dispatch(setReportMonthYears([]));\n dispatch(addHttpErrorNotification(ex));\n }\n };\n}\n\nexport function loadReports(year: number, month: number): AppThunk {\n return async (dispatch, getState) => {\n dispatch(setReports(null));\n\n try {\n const { companies: { selectedCompany } } = getState();\n assertIsDefined(selectedCompany?.compid);\n const reports = await getReportHistories(selectedCompany.compid, year, month);\n dispatch(setReports(reports));\n } catch (ex) {\n dispatch(setReports([]));\n dispatch(addHttpErrorNotification(ex));\n }\n };\n}\n\n// selectors\nexport const selectReportMonthYears = (state: RootState): MonthAndYear[] | null => state.reportHistory.monthYears;\n\nexport const selectReports = (state: RootState): ReportHistory[] | null => state.reportHistory.reports;\n\nexport const selectSelectedMonthYear = (state: RootState): MonthAndYear | null => state.reportHistory.selectedMonthYear;\n\nexport const selectSelectedReportType = (state: RootState): string | null => state.reportHistory.selectedReportType;\n","import request, { ContentType } from 'shared/api-request';\nimport { MonthAndYear } from 'shared/types/file-report-history.types';\nimport { ReportHistory } from 'report-history/report-history.types';\n\nexport function getReportHistoryMonths(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get report history months for invalid company.'));\n }\n\n return request<MonthAndYear[]>(`/api/companies/${companyId}/reporthistory/get-available-dates`);\n}\n\nexport function getReportHistories(companyId: number, year: number, month: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get report history for invalid company.'));\n }\n\n if (year < 1986) {\n return Promise.reject(new Error('Cannot get report history for invalid year.'));\n }\n\n if (month < 1 || month > 12) {\n return Promise.reject(new Error('Cannot get report history for invalid month.'));\n }\n\n var uri = `/api/companies/${companyId}/reporthistory/${year}/${month}/get-report-history-by-month-year`;\n\n return request<ReportHistory[]>(uri);\n}\n\nexport function downloadReportHistoryFile(companyId: number, unqId: number, fileName: string) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download report for invalid company.'));\n }\n\n if (unqId <= 0) {\n return Promise.reject(new Error('Cannot download report for invalid ID.'));\n }\n\n if (fileName.length === 0) {\n return Promise.reject(new Error('Cannot download report for invalid file name.'));\n }\n\n const uri = `/api/companies/${companyId}/reporthistory/download/${unqId}/${fileName}`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.DEFAULT } });\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { CobraInitialNotice } from 'components/shared/notice-list/notice-list.types';\nimport { RootState } from 'store/rootReducer';\nimport { getCobraPendingInitialNotices } from 'shared/api/cobraInitialNoticesApi';\nimport { AppThunk } from 'store';\nimport { assertIsDefined } from 'shared/asserts';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\n\nexport interface CobraPendingInitialNoticesState {\n notices: CobraInitialNotice[] | null;\n}\n\nexport const initialState: CobraPendingInitialNoticesState = {\n notices: [],\n};\n\nconst cobraPendingInitialNoticesSlice = createSlice({\n name: 'cobraPendingInitialNotices',\n initialState,\n reducers: {\n setPendingInitialNotices(state, { payload }: PayloadAction<CobraInitialNotice[] | null>) {\n state.notices = payload;\n },\n },\n});\n\nexport const {\n setPendingInitialNotices,\n} = cobraPendingInitialNoticesSlice.actions;\n\nexport default cobraPendingInitialNoticesSlice.reducer;\n\n// thunk\nexport function loadPendingInitialNotices(): AppThunk {\n return async (dispatch, getState) => {\n dispatch(setPendingInitialNotices(null));\n\n try {\n const { companies: { selectedCompany } } = getState();\n assertIsDefined(selectedCompany?.compid);\n const notices = await getCobraPendingInitialNotices(selectedCompany.compid);\n dispatch(setPendingInitialNotices(notices));\n } catch (ex) {\n dispatch(setPendingInitialNotices([]));\n dispatch(addHttpErrorNotification(ex));\n }\n };\n}\n\n// selectors\nexport const selectPendingInitialNotices = (state: RootState): CobraInitialNotice[] | null => {\n return state.cobraPendingInitialNotices.notices;\n};\n","import request from 'shared/api-request';\nimport { CobraInitialNotice } from 'components/shared/notice-list/notice-list.types';\n\nexport function getCobraPendingInitialNotices(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get COBRA pending initial notices for invalid company.'));\n }\n\n return request<CobraInitialNotice[]>(`/api/companies/${companyId}/reports/pending-notices/initial`);\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { AppThunk } from 'store';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { getContactInfo } from 'shared/api/contactInfoApi';\nimport { RootState } from 'store/rootReducer';\nimport { Contact } from 'manage-settings/contact-info/contact.types';\n\nexport interface ContactInfoState {\n details: Contact | null;\n}\n\nexport const defaultContact = {\n confname: '',\n conlname: '',\n conaddr1: '',\n conaddr2: '',\n concity: '',\n constate: '',\n conzip: '',\n conphone: '',\n confax: '',\n conemail: '',\n} as Contact;\n\nexport const initialState: ContactInfoState = {\n details: defaultContact,\n};\n\nconst contactInfoSlice = createSlice({\n name: 'contactInfo',\n initialState,\n reducers: {\n loadContactInfoStart(state) {\n state.details = null;\n },\n setDetails(state, { payload }: PayloadAction<Contact | null>) {\n state.details = payload;\n },\n },\n});\n\nexport const {\n loadContactInfoStart,\n setDetails,\n} = contactInfoSlice.actions;\n\nexport default contactInfoSlice.reducer;\n\n// thunks\nexport function loadContactInfo(companyId: number, userId: number): AppThunk {\n return async (dispatch) => {\n dispatch(loadContactInfoStart());\n\n try {\n const details = await getContactInfo(companyId, userId);\n dispatch(setDetails(details));\n } catch (err) {\n dispatch(addHttpErrorNotification(err));\n dispatch(setDetails(defaultContact));\n }\n };\n}\n\n// selectors\nexport const selectContactInfo = (state: RootState) => state.contactInfo.details;\n","import request, { APIOptions } from 'shared/api-request';\nimport { Contact } from 'manage-settings/contact-info/contact.types';\n\nexport function getContactInfo(companyId: number, userId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get contact info with invalid company'));\n }\n\n if (userId <= 0) {\n return Promise.reject(new Error('Cannot get contact info for invalid user'));\n }\n\n return request<Contact>(`/api/companies/${companyId}/users/${userId}/get-contact-info`);\n}\n\nexport function saveContactInfo(companyId: number, info: Contact) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot save contact info with invalid company'));\n }\n\n const apiOptions: APIOptions = {\n method: 'PUT',\n body: { ...info, compid: companyId },\n };\n\n return request<boolean>(`/api/companies/${companyId}/set-contact-info`, apiOptions);\n}\n","import dayjs from 'dayjs';\n\nimport { CobraQe, CobraQePlusPlans, QeBenefits } from 'enter-cobra-qe/cobra-qe.types';\nimport request from '../api-request';\nimport { CobraQENotice } from 'components/shared/notice-list/notice-list.types';\n\nfunction planMapper(benefits: QeBenefits) {\n return { benefits };\n}\n\nexport function getCobraQe(companyId: number, employeeNumber: string, cQualId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get COBRA QE for invalid company.'));\n }\n\n if (employeeNumber.length !== 9) {\n return Promise.reject(new Error('Cannot get COBRA QE for invalid employee number.'));\n }\n\n if (cQualId <= 0) {\n return Promise.reject(new Error('Cannot get COBRA QE for invalid ID.'));\n }\n\n const uri = `/api/companies/${companyId}/cobra-qe/${employeeNumber}/${cQualId}`;\n\n return request<CobraQePlusPlans>(uri)\n .then((data) => {\n if (data) {\n return {\n ...data,\n availablePlans: data.availablePlans.map(planMapper) as unknown as QeBenefits[],\n };\n }\n\n return data;\n });\n}\n\nexport function updateCobraQe(companyId: number, body: CobraQe) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot update COBRA QEs for invalid company.'));\n }\n\n return request<CobraQe>(`/api/companies/${companyId}/cobra-qe`, { method: 'PUT', body });\n}\n\nexport function getCobraAvailablePlans(companyId: number, effectiveDate: string | dayjs.Dayjs) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get available COBRA plans for invalid company.'));\n }\n\n const date = dayjs(effectiveDate);\n\n if (!date.isValid()) {\n return Promise.reject(new Error('Cannot get available COBRA plans for invalid effective date.'));\n }\n\n const uri = `/api/companies/${companyId}/cobra-qe/cobra-plans?effectiveDate=${date.format('YYYY-MM-DD')}`;\n\n return request<QeBenefits[]>(uri)\n .then((data) => data ? data.map(planMapper) as unknown as QeBenefits[] : []);\n}\n\nexport function getCobraPendingQeList(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get COBRA pending QEs for invalid company.'));\n }\n\n return request<CobraQENotice[]>(`/api/companies/${companyId}/reports/pending-notices/qe`);\n}\n\nexport function getNoBenefitsMessage(coverageStart: string | dayjs.Dayjs) {\n return `No benefits are available as the Coverage Begins date of ` +\n `${dayjs(coverageStart).format('MM/DD/YYYY')}. ` +\n `If that is the wrong date, return to the Personal and Event Information tab and correct the date entry. ` +\n `If that is the correct date, please contact your Flores account manager ` +\n `with the plans that should be available for the specified period.`;\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { CobraQENotice } from 'components/shared/notice-list/notice-list.types';\nimport { RootState } from 'store/rootReducer';\nimport { assertIsDefined } from 'shared/asserts';\nimport { AppThunk } from 'store';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { getCobraPendingQeList } from 'shared/api/cobraQeApi';\n\nexport interface CobraPendingQeNoticesState {\n notices: CobraQENotice[] | null;\n}\n\nexport const initialState: CobraPendingQeNoticesState = {\n notices: [],\n};\n\nconst cobraPendingQeNoticesSlice = createSlice({\n name: 'cobraPendingQeNotices',\n initialState,\n reducers: {\n setPendingQeNotices(state, { payload }: PayloadAction<CobraQENotice[] | null>) {\n state.notices = payload;\n },\n },\n});\n\nexport const {\n setPendingQeNotices,\n} = cobraPendingQeNoticesSlice.actions;\n\nexport default cobraPendingQeNoticesSlice.reducer;\n\n// thunk\nexport function loadPendingQeNotices(): AppThunk {\n return async (dispatch, getState) => {\n dispatch(setPendingQeNotices(null));\n\n try {\n const { companies: { selectedCompany } } = getState();\n assertIsDefined(selectedCompany?.compid);\n const notices = await getCobraPendingQeList(selectedCompany.compid);\n dispatch(setPendingQeNotices(notices));\n } catch (ex) {\n dispatch(setPendingQeNotices([]));\n dispatch(addHttpErrorNotification(ex));\n }\n };\n}\n\n// selectors\nexport const selectPendingQeNotices = (state: RootState): CobraQENotice[] | null => state.cobraPendingQeNotices.notices;\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { AppThunk } from 'store';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { getContributionsNotForwardedCount } from 'shared/api/contributionsNotForwardedApi';\nimport { getAnnualAllocationAuditCount } from 'shared/api/annualAllocationAuditApi';\nimport { RootState } from 'store/rootReducer';\n\nexport interface ReportsState {\n contributionsNotForwardedCount: number | null;\n annualAllocationAuditCount: number | null;\n}\n\nexport const initialState: ReportsState = {\n contributionsNotForwardedCount: 0,\n annualAllocationAuditCount: 0,\n};\n\nconst reportsSlice = createSlice({\n name: 'reports',\n initialState,\n reducers: {\n loadContributionsNotForwardedCountStart(state) {\n state.contributionsNotForwardedCount = null;\n },\n setContributionsNotForwardedCount(state, { payload }: PayloadAction<number | null>) {\n state.contributionsNotForwardedCount = payload;\n },\n loadAnnualAllocationAuditCountStart(state) {\n state.annualAllocationAuditCount = null;\n },\n setAnnualAllocationAuditCount(state, { payload }: PayloadAction<number | null>) {\n state.annualAllocationAuditCount = payload;\n },\n },\n});\n\nexport const {\n loadContributionsNotForwardedCountStart,\n setContributionsNotForwardedCount,\n loadAnnualAllocationAuditCountStart,\n setAnnualAllocationAuditCount,\n} = reportsSlice.actions;\n\nexport default reportsSlice.reducer;\n\n// thunks\nexport function loadContributionsNotForwardedCount(\n companyId: number,\n): AppThunk {\n return async (dispatch) => {\n dispatch(loadContributionsNotForwardedCountStart());\n\n try {\n const count = await getContributionsNotForwardedCount(companyId);\n dispatch(setContributionsNotForwardedCount(count));\n } catch (err) {\n dispatch(addHttpErrorNotification(err));\n dispatch(setContributionsNotForwardedCount(0));\n }\n };\n}\n\n// thunks\nexport function loadAnnualAllocationAuditCount(\n companyId: number, planYearId: number,\n): AppThunk {\n return async (dispatch) => {\n dispatch(loadAnnualAllocationAuditCountStart());\n\n try {\n const count = await getAnnualAllocationAuditCount(companyId, planYearId);\n dispatch(setAnnualAllocationAuditCount(count));\n } catch (err) {\n dispatch(addHttpErrorNotification(err));\n dispatch(setAnnualAllocationAuditCount(0));\n }\n };\n}\n\n// selectors\nexport const selectContributionsNotForwardedCount = (\n state: RootState) => state.reports.contributionsNotForwardedCount;\n\nexport const selectAnnualAllocationAuditCount = (\n state: RootState) => state.reports.annualAllocationAuditCount;\n","import request, { ContentType } from '../api-request';\n\nexport function getContributionsNotForwardedCount(\n companyId: number,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load contributions not forwarded total for invalid company.'));\n }\n\n const uri = `/api/companies/${companyId}/reports/hsa-contributions-not-forwarded`;\n\n return request<number>(uri);\n}\n\nexport function downloadContributionsNotForwarded(\n companyId: number,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download contributions not forwarded report for invalid company.'));\n }\n\n const uri = `/api/companies/${companyId}/reports/hsa-contributions-not-forwarded/export`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n}\n","import request, { ContentType } from '../api-request';\n\nexport function getAnnualAllocationAuditCount(\n companyId: number, planYearId: number,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load annual allocation audit total for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot load annual allocation audit total for invalid plan year.'));\n }\n\n const uri = `/api/companies/${companyId}/reports/annual-allocation/${planYearId}`;\n\n return request<number>(uri);\n}\n\nexport function downloadAnnualAllocationAudit(\n companyId: number, planYearId: number,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download annual allocation audit report for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot download annual allocation audit report for invalid plan year.'));\n }\n\n const uri = `/api/companies/${companyId}/reports/annual-allocation/${planYearId}/export`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n}\n","import dayjs from 'dayjs';\n\nimport request, { ContentType } from '../api-request';\nimport { BalanceAccountCount } from 'reports/balance/balance-account.types';\nimport { OpenPlan } from 'plan-enrollment/plan-enrollment.types';\n\nfunction validateParams(\n message: string,\n companyId: number,\n planYearId: number,\n startDate: string,\n endDate: string,\n) {\n if (companyId <= 0) {\n throw new Error(`Cannot ${message} for invalid company.`);\n }\n\n if (planYearId <= 0) {\n throw new Error(`Cannot ${message} for invalid plan year.`);\n }\n\n const start = startDate ? dayjs(startDate) : dayjs();\n const end = endDate ? dayjs(endDate) : dayjs();\n\n if (!start.isValid()) {\n throw new Error(`Cannot ${message} for invalid start date.`);\n }\n\n if (!end.isValid()) {\n throw new Error(`Cannot ${message} for invalid end date.`);\n }\n\n return [ start, end ];\n}\n\nexport function getCustomBalanceReportCounts(\n companyId: number,\n planYearId: number,\n planCodeId: number,\n startDate: string,\n endDate: string,\n) {\n try {\n const [ start, end ] = validateParams('load balance report data', companyId, planYearId, startDate, endDate);\n\n const uri = `/api/companies/${companyId}/reports/balance-account-custom-counts/${planYearId}/${planCodeId}` +\n `?startDate=${start.format('YYYY-MM-DD')}&endDate=${end.format('YYYY-MM-DD')}`;\n\n return request<BalanceAccountCount>(uri);\n } catch (ex) {\n return Promise.reject(ex);\n }\n}\n\nexport function downloadCustomReimbursementRecapReport\n(\n companyId: number,\n planYearId: number,\n planCode: number,\n startDate: string,\n endDate: string,\n) {\n try {\n const [ start, end ] = validateParams('download report', companyId, planYearId, startDate, endDate);\n\n const exportUri = `/api/companies/${companyId}/reports/reimbursement-report-custom/${planYearId}/${planCode}/`\n + `export?startDate=${start.format('YYYY-MM-DD')}&endDate=${end.format('YYYY-MM-DD')}`;\n\n return request(exportUri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n } catch (ex) {\n return Promise.reject(ex);\n }\n}\n\nexport function downloadCustomBalanceReport\n(\n companyId: number,\n planYearId: number,\n planCode: number,\n startDate: string,\n endDate: string,\n) {\n try {\n const [ start, end ] = validateParams('download custom balance report', companyId, planYearId, startDate, endDate);\n\n const exportUri = `/api/companies/${companyId}/reports/balance-report-custom/${planYearId}/${planCode}/`\n + `export?startDate=${start.format('YYYY-MM-DD')}&endDate=${end.format('YYYY-MM-DD')}`;\n\n return request(exportUri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n } catch (ex) {\n return Promise.reject(ex);\n }\n}\n\nexport function getCustomReportPlans(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get custom plans for invalid company.'));\n }\n\n return request<OpenPlan[]>(`/api/companies/${companyId}/report-custom-plans`);\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { AppThunk } from 'store';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { RootState } from 'store/rootReducer';\nimport { OpenPlan } from 'plan-enrollment/plan-enrollment.types';\nimport { getCustomReportPlans } from 'shared/api/customReportsByDateRangeApi';\nimport { assertIsDefined } from 'shared/asserts';\n\nexport interface CustomReportsState {\n plans: OpenPlan[] | null;\n selectedPlan?: OpenPlan;\n}\n\nexport const initialState: CustomReportsState = {\n plans: [],\n};\n\nconst customReportsSlice = createSlice({\n name: 'customReports',\n initialState,\n reducers: {\n setCustomReportPlans(state, { payload }:PayloadAction<OpenPlan[] | null>) {\n state.plans = payload;\n },\n setSelectedCustomReportPlan(state, { payload }:PayloadAction<OpenPlan | undefined>) {\n state.selectedPlan = payload;\n },\n },\n});\n\nexport const {\n setCustomReportPlans,\n setSelectedCustomReportPlan,\n} = customReportsSlice.actions;\n\nexport default customReportsSlice.reducer;\n\n// thunks\nexport function loadCustomReportPlans(): AppThunk {\n return async (dispatch, getState) => {\n dispatch(setCustomReportPlans(null));\n\n try {\n const { companies: { selectedCompany } } = getState();\n assertIsDefined(selectedCompany?.compid);\n const plans = (await getCustomReportPlans(selectedCompany.compid)) ?? [];\n dispatch(setCustomReportPlans(plans));\n dispatch(setSelectedCustomReportPlan(plans.length > 0 ? plans[0] : undefined));\n } catch (ex) {\n dispatch(setCustomReportPlans([]));\n dispatch(addHttpErrorNotification(ex));\n }\n };\n}\n\n// selectors\nexport const selectCustomReportPlans = (state: RootState): OpenPlan[] | null => state.customReports.plans;\n\nexport const selectSelectedCustomReportPlan =\n (state: RootState): OpenPlan | undefined => state.customReports.selectedPlan;\n","export default function getPercentageFromBooleanArray (arr: boolean[] | undefined): number {\n if (!arr) {\n return 0;\n }\n\n const truthy = arr.filter(x => !!x).length;\n\n return 0 === arr.length ? 0 : Math.round(((100 * truthy) / arr.length));\n}\n","export enum PlanTypesString {\n COBRA = 'cobra',\n DIRECTBILL = 'directBill',\n CUSTOM = 'custom',\n HSA = 'HSA',\n FSA = 'FSA',\n HRA = 'HRA',\n QTE = 'QTE',\n}\n","import { assoc, cond, pathEq, T } from 'ramda';\nimport { PlanTypesString } from 'shared/enums/plan-types-string.enum';\n\nexport const applyPlanTypeDiscriminator = cond([\n [ pathEq([ 'planCode' ], '5'), assoc('type', PlanTypesString.COBRA) ],\n [ pathEq([ 'planCode' ], 'S'), assoc('type', PlanTypesString.HSA) ],\n [ pathEq([ 'planCode' ], '0'), assoc('type', PlanTypesString.CUSTOM) ],\n [ pathEq([ 'planCode' ], '6'), assoc('type', PlanTypesString.DIRECTBILL) ],\n [ pathEq([ 'planCode' ], '7'), assoc('type', PlanTypesString.DIRECTBILL) ],\n [ pathEq([ 'planCode' ], 'D'), assoc('type', PlanTypesString.FSA) ],\n [ pathEq([ 'planCode' ], 'M'), assoc('type', PlanTypesString.FSA) ],\n [ pathEq([ 'planCode' ], '3'), assoc('type', PlanTypesString.HRA) ],\n [ pathEq([ 'planCode' ], 'H'), assoc('type', PlanTypesString.HRA) ],\n [ pathEq([ 'planCode' ], 'T'), assoc('type', PlanTypesString.QTE) ],\n [ T, assoc('type', 'other') ],\n]);\n","import sanitize from 'sanitize-filename';\n\nexport default function sanitizeFilename(filename: string) {\n const sanitized = sanitize(filename);\n\n return sanitized.trim().replace(/#/g, '');\n}\n","import { createAsyncThunk } from '@reduxjs/toolkit';\n\nimport {\n updateChecklistComplete,\n getReEnrollmentChecklistPlans,\n updateCobraOePacketInfo,\n updateCobraPlan,\n getCobraChecklistPlans,\n getCustomPlans,\n finalizeCobraChecklistPlans,\n getCobraCoverageTypes,\n deleteInProgressPlan,\n updateDirectBillChecklist,\n getPlanLevelDescriptions,\n} from 'shared/api/reEnrollmentChecklistApi';\nimport {\n selectCobraPlan,\n selectCobraPlanIds,\n selectCobraPlanOnDeck,\n selectDirectBillPlan,\n selectPlanByPlanCode,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport { RootState } from 'store/rootReducer';\nimport {\n CobraChecklistPlan,\n ReEnrollmentChecklistPlan,\n} from 're-enrollment-checklist/re-enrollment-checklist.types';\nimport { getCobraPlanTypes } from 'shared/api/cobraPlanTypesApi';\nimport { getCobraInsurers } from 'shared/api/cobraInsurersApi';\nimport { createOeDocuments, deleteDocument } from 'shared/api/cobraChecklistDocumentsApi';\n\nexport let fetchReEnrollmentChecklistPlan = createAsyncThunk(\n 'reEnrollment/fetchReEnrollmentPlan',\n (companyId: number) => getReEnrollmentChecklistPlans(companyId),\n);\n\nexport let saveCobraOePacketInfo = createAsyncThunk(\n 'reEnrollment/saveCobraOePacketInfo',\n (_, thunkAPI) => {\n const state = thunkAPI.getState() as RootState;\n const cobraPlan = selectCobraPlan(state);\n\n return updateCobraOePacketInfo(cobraPlan);\n },\n);\n\nexport let completeChecklist = createAsyncThunk(\n 'reEnrollment/completeReEnrollmentPlan',\n (planCode: string, thunkAPI) => {\n const state = thunkAPI.getState() as RootState;\n const plan = selectPlanByPlanCode(planCode)(state);\n\n return updateChecklistComplete(plan);\n },\n);\n\nexport let saveCobraPlan = createAsyncThunk(\n 'reEnrollment/updateCobraPlan',\n (_, thunkAPI) => {\n const state = thunkAPI.getState() as RootState;\n const details = selectCobraPlan(state);\n const cobraPlan = selectCobraPlanOnDeck(state);\n\n return updateCobraPlan(cobraPlan as CobraChecklistPlan, details.companyId, details.planYearId);\n },\n);\n\nexport let finalizeCobraPlans = createAsyncThunk(\n 'reEnrollment/finalizeCobraPlans',\n (_, thunkAPI) => {\n const state = thunkAPI.getState() as RootState;\n const details = selectCobraPlan(state);\n const cobraPlanIds = selectCobraPlanIds(state);\n\n return finalizeCobraChecklistPlans({ companyId: details.companyId, planYearId: details.planYearId, cobraPlanIds });\n },\n);\n\nexport let fetchCobraChecklistPlans = createAsyncThunk(\n 'reEnrollment/fetchCobraChecklistPlans',\n ({ companyId, planYearId }: ReEnrollmentChecklistPlan) => {\n return getCobraChecklistPlans({ companyId, planYearId });\n },\n);\n\nexport const fetchCobraPlanTypes = createAsyncThunk(\n 'reEnrollment/fetchCobraPlanTypes',\n (companyId: number) => {\n return getCobraPlanTypes(companyId);\n },\n);\n\nexport const fetchCobraInsurers = createAsyncThunk(\n 'reEnrollment/fetchCobraInsurers',\n (companyId: number) => {\n return getCobraInsurers(companyId);\n },\n);\n\nexport const fetchCustomPlans = createAsyncThunk(\n 'reEnrollment/fetchCustomPlans',\n getCustomPlans,\n);\n\nexport const deleteOeDocument = createAsyncThunk(\n 'reEnrollment/deleteOeDocument',\n deleteDocument,\n);\n\nexport const generateOeDocuments = createAsyncThunk(\n 'reEnrollment/generateOeDocuments',\n createOeDocuments,\n);\n\nexport const fetchCoverageTypes = createAsyncThunk(\n 'reEnrollment/fetchCoverageTypes',\n getCobraCoverageTypes,\n);\n\nexport const deleteCobraInProgressPlan = createAsyncThunk(\n 'reEnrollment/deleteInProgressPlan',\n (planInProgressId: number, thunkAPI) => {\n const state = thunkAPI.getState() as RootState;\n const { companyId, planYearId } = selectCobraPlan(state);\n\n return deleteInProgressPlan(companyId, planYearId, planInProgressId);\n },\n);\n\nexport const saveDirectBillChecklist = createAsyncThunk(\n 'reEnrollment/updateDirectBillChecklist',\n (_, thunkAPI) => {\n const state = thunkAPI.getState() as RootState;\n const details = selectDirectBillPlan(state);\n\n return updateDirectBillChecklist(details);\n },\n);\n\nexport const fetchPlanLevelDescriptions = createAsyncThunk(\n 'reEnrollment/getPlanLevelDescriptions',\n getPlanLevelDescriptions,\n);\n","import { omit } from 'ramda';\n\nimport request, { ContentType } from '../api-request';\nimport {\n BaseReEnrollmentApiPayload,\n CobraChecklistPlan,\n CobraReEnrollmentChecklistPlan,\n CoverageType,\n CustomReEnrollmentPlanInformation,\n DirectBillReEnrollmentChecklistPlan,\n FileListItem,\n PlanLevelDescription,\n ReEnrollmentChecklistPlan,\n} from 're-enrollment-checklist/re-enrollment-checklist.types';\nimport safeFilename from 'shared/utils/safe-filename';\n\nexport function getReEnrollmentChecklistPlans(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load re-enrollment plans for invalid company'));\n }\n\n const uri = `/api/companies/${companyId}/reenrollment-checklist/plan-years`;\n\n return request<ReEnrollmentChecklistPlan[]>(uri)\n .then(plans => plans ?? []);\n}\n\nexport function updateCobraOePacketInfo(details: CobraReEnrollmentChecklistPlan) {\n if (details.companyId <= 0) {\n return Promise.reject(new Error('Cannot save re-enrollment checklist for invalid company.'));\n }\n\n if (details.planYearId <= 0) {\n return Promise.reject(new Error('Cannot save re-enrollment checklist for invalid plan year.'));\n }\n const planDetails = omit([ 'oePacketFiles' ], details);\n const uri = `/api/companies/${details.companyId}/reenrollment-checklist/plan-year/${details.planYearId}/cobra`;\n\n return request<CobraReEnrollmentChecklistPlan>(uri, {\n method: 'PUT',\n body: planDetails,\n });\n}\n\nexport const uploadCobraOePacketDoc = (companyId: number, planYearId: number) => (files: File[]) => {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot save re-enrollment checklist document for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot save re-enrollment checklist document for invalid plan year.'));\n }\n const formData = new FormData();\n Array.from(files).forEach((file) => formData.append('files', file, safeFilename(file.name)));\n\n const uri = `/api/companies/${companyId}/reenrollment-checklist/plan-year/${planYearId}/cobra/files`;\n\n return request<CobraReEnrollmentChecklistPlan>(uri, {\n headers: { 'content-type': ContentType.FORM_DATA },\n method: 'POST',\n body: formData,\n });\n};\n\nexport const updateChecklistComplete = ({ companyId, planYearId }: ReEnrollmentChecklistPlan) => {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot complete re-enrollment checklist for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot complete re-enrollment checklist for invalid plan year.'));\n }\n const uri =\n `/api/companies/${companyId}/reenrollment-checklist/plan-year/${planYearId}/oe-packets/complete`;\n\n return request<CobraReEnrollmentChecklistPlan>(uri, {\n method: 'PUT',\n });\n};\n\nexport function updateCobraPlan(details: CobraChecklistPlan, companyId: number, planYearId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot save re-enrollment checklist for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot save re-enrollment checklist for invalid plan year.'));\n }\n const uri = `/api/companies/${companyId}/reenrollment-checklist/plan/${planYearId}/cobra-plan`;\n\n return request<CobraChecklistPlan[]>(uri, {\n method: 'PUT',\n body: details,\n })\n .then(plans => plans ?? []);\n}\n\nexport function getCobraChecklistPlans({ companyId, planYearId }: BaseReEnrollmentApiPayload) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load Cobra checklist plans for invalid company'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot get Cobra checklist plans for invalid plan year.'));\n }\n const uri = `/api/companies/${companyId}/reenrollment-checklist/plan/${planYearId}/cobra-plans`;\n\n return request<CobraChecklistPlan[]>(uri)\n .then(plans => plans ?? []);\n}\n\nexport function getCustomPlans(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load Custom plans for invalid company'));\n }\n\n const uri = `/api/companies/${companyId}/reenrollment-checklist/plan-types/custom-plans`;\n\n return request<CustomReEnrollmentPlanInformation[]>(uri)\n .then(plans => plans ?? []);\n}\n\nexport function deleteInProgressPlan(companyId: number, planYearId: number, planInProgressId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot delete in progress plan for invalid company'));\n }\n\n const uri = `/api/companies/${companyId}/reenrollment-checklist/plan/${planYearId}/cobra-plans/${planInProgressId}`;\n\n return request<CobraChecklistPlan[]>(uri, { method: 'DELETE' })\n .then(plans => plans ?? []);\n}\n\nexport const uploadPlanRatesDocuments = (\n companyId: number,\n planYearId: number,\n planId?: number | null,\n planInProgressId?: number | null,\n isNewPlan = false,\n) => (files: File[]) => {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot save plan rates documents for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot save plan rates documents for invalid plan year.'));\n }\n const formData = new FormData();\n Array.from(files).forEach((file) => formData.append('files', file, safeFilename(file.name)));\n\n const uri = `/api/companies/${companyId}/reenrollment-checklist/plan/${planYearId}/cobra/upload-rates-documents`;\n\n return request<FileListItem[]>(uri, {\n headers: { 'content-type': ContentType.FORM_DATA },\n method: 'POST',\n body: formData,\n queryParams: {\n planId: planId?.toString() ?? '',\n planInProgressId: planInProgressId?.toString() ?? '',\n isNewPlan: isNewPlan.toString(),\n },\n });\n};\n\nexport function finalizeCobraChecklistPlans(\n { companyId, planYearId, cobraPlanIds } : {companyId: number; planYearId: number; cobraPlanIds: number[];},\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot finalize Cobra checklist plans for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot finalize Cobra checklist plans for invalid plan year.'));\n }\n const uri = `/api/companies/${companyId}/reenrollment-checklist/plan/${planYearId}/finalize`;\n\n return request<CobraChecklistPlan[]>(uri, {\n method: 'POST',\n body: cobraPlanIds,\n })\n .then(plans => plans ?? []);\n}\n\nexport function getCobraCoverageTypes({ companyId, planYearId } : BaseReEnrollmentApiPayload) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get coverage types for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot get coverage types for invalid plan year.'));\n }\n const uri = `/api/companies/${companyId}/reenrollment-checklist/plan/${planYearId}/cobra/coverage-types`;\n\n return request<CoverageType[]>(uri)\n .then(coverageTypes => coverageTypes ?? []);\n}\n\nexport function updateDirectBillChecklist(details: DirectBillReEnrollmentChecklistPlan) {\n if (details.companyId <= 0) {\n return Promise.reject(new Error('Cannot save re-enrollment checklist for invalid company.'));\n }\n\n if (details.planYearId <= 0) {\n return Promise.reject(new Error('Cannot save re-enrollment checklist for invalid plan year.'));\n }\n\n const uri = `/api/companies/${details.companyId}/reenrollment-checklist/plan-year/${details.planYearId}/direct-bill`;\n\n return request<DirectBillReEnrollmentChecklistPlan>(uri, {\n method: 'PUT',\n body: details,\n });\n}\n\nexport function getPlanLevelDescriptions({ companyId, planYearId } : BaseReEnrollmentApiPayload) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get plan level descriptions for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot get plan level descriptions for invalid plan year.'));\n }\n const uri = `/api/companies/${companyId}/reenrollment-checklist/plan/${planYearId}/cobra/plan-level-descriptions`;\n\n return request<PlanLevelDescription[]>(uri)\n .then(data => data ?? []);\n}\n","import request from 'shared/api-request';\nimport { CobraPlanType } from 're-enrollment-checklist/cobra-reenrollment-checklist/cobra-re-enrollment.types';\n\nexport function getCobraPlanTypes(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get COBRA plan types for invalid company.'));\n }\n\n return request<CobraPlanType[]>(`/api/companies/${companyId}/reenrollment-checklist/plan-types/cobra`)\n .then(data => data ?? []);\n}\n","import request from 'shared/api-request';\nimport { CobraInsurer } from 're-enrollment-checklist/cobra-reenrollment-checklist/cobra-re-enrollment.types';\n\nexport function getCobraInsurers(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get COBRA insurers for invalid company.'));\n }\n\n return request<CobraInsurer[]>(`/api/companies/${companyId}/insurers/all`)\n .then(data => data ?? []);\n}\n\nexport function createCobraInsurer(insurer: Partial<CobraInsurer>) {\n if ((insurer.companyId ?? 0) <= 0) {\n return Promise.reject(new Error('Cannot create COBRA insurers for invalid company.'));\n }\n\n return request<CobraInsurer[]>(\n `/api/companies/${insurer.companyId}/insurers/cobra`,\n {\n method: 'POST',\n body: insurer,\n })\n .then(data => data ?? []);\n}\n","import request from 'shared/api-request';\nimport { CobraReEnrollmentChecklistPlan } from 're-enrollment-checklist/re-enrollment-checklist.types';\n\nexport function downloadDocument(companyId: number, planYearId: string, fileName: string) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download document for invalid company.'));\n }\n\n return request(`/api/companies/${companyId}/reenrollment-checklist/plan-year/${planYearId}/cobra/file/${fileName}`);\n}\n\nexport function deleteDocument(\n { companyId, planYearId, fileName }: {companyId: number; planYearId: string; fileName: string;},\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot delete document for invalid company.'));\n }\n\n return request<CobraReEnrollmentChecklistPlan>(\n `/api/companies/${companyId}/reenrollment-checklist/plan-year/${planYearId}/cobra/file/${fileName}`,\n { method: 'DELETE' },\n );\n}\n\nexport function createOeDocuments({ companyId, planYearId }: {companyId: number; planYearId: string;}) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot generate OE documents for invalid company.'));\n }\n\n if (+planYearId <= 0) {\n return Promise.reject(new Error('Cannot generate OE documents for invalid plan year.'));\n }\n\n return request<CobraReEnrollmentChecklistPlan>(\n `/api/companies/${companyId}/reenrollment-checklist/plan/${planYearId}/generate/oe-forms`,\n { method: 'POST' },\n );\n}\n","export interface CobraPlanType {\n unqid: number;\n cobraPlanTypeId: number;\n name: string;\n usage: string;\n}\n\nexport enum InsurerUpdateMethod\n{\n NoneSelected,\n ClientViaFridayReport,\n CarrierByTuesdayFile,\n FloresManually,\n CustomFileTransfer,\n Other,\n}\n\nexport interface CobraInsurer {\n companyId: number;\n unqid: number;\n cobraInsurerId: number;\n insurer: string;\n address1: string;\n address2: string;\n city: string;\n state: string;\n zip: string;\n phone: string;\n agent: string;\n contact: string;\n contactPhone: string;\n contactEmail: string;\n updateMethod?: InsurerUpdateMethod;\n updateMethodNotes?: string;\n notes?: string;\n}\n","export const ActivateAccountType = {\n PAYMENT: 1,\n ELECTION: 2,\n};\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport dayjs from 'dayjs';\nimport {\n allPass,\n always,\n anyPass,\n append,\n compose,\n concat,\n either,\n equals,\n find,\n groupBy,\n head,\n ifElse,\n last,\n lensPath,\n map,\n pathOr,\n pick,\n propEq,\n set,\n view,\n} from 'ramda';\nimport getPercentageFromBooleanArray from 'shared/utils/get-percentage-from-boolean-array';\n\nimport { RootState } from 'store/rootReducer';\nimport {\n CobraChecklistPlan,\n CobraReEnrollmentChecklistPlan,\n CoverageType,\n CustomReEnrollmentPlanInformation,\n DirectBillReEnrollmentChecklistPlan,\n FileListItem,\n OnDeckCobraPlan,\n PlanLevelDescription,\n ReEnrollmentChecklistPlan,\n} from './re-enrollment-checklist.types';\nimport { applyPlanTypeDiscriminator } from './re-enrollment-utilities';\nimport {\n completeChecklist,\n deleteOeDocument,\n fetchCobraChecklistPlans,\n fetchCobraInsurers,\n fetchCobraPlanTypes,\n fetchCoverageTypes,\n fetchCustomPlans,\n fetchReEnrollmentChecklistPlan,\n finalizeCobraPlans,\n generateOeDocuments,\n saveCobraOePacketInfo,\n saveCobraPlan,\n deleteCobraInProgressPlan,\n saveDirectBillChecklist,\n fetchPlanLevelDescriptions,\n} from './re-enrollment-checklist.thunks';\nimport {\n CobraInsurer,\n CobraPlanType,\n InsurerUpdateMethod,\n} from './cobra-reenrollment-checklist/cobra-re-enrollment.types';\nimport { ActivateAccountType } from 'shared/enums/insurers.enum';\n\nexport type ApiStatus = 'uninitialized' | 'pending' | 'rejected' | 'fulfilled';\n\nexport type CancelModalStatus = 'open' | 'closed';\n\nexport type PlanValidation = Record<string, any>;\n\nexport interface ReEnrollmentChecklistState {\n fetchPlansStatus: ApiStatus;\n saveOePacketInfoStatus: ApiStatus;\n submitFileStatus: ApiStatus;\n completeChecklistRequestStatus: ApiStatus;\n cancelModalStatus: CancelModalStatus;\n redirectModalStatus: CancelModalStatus;\n saveCobraPlanStatus: ApiStatus;\n fetchCobraChecklistPlansStatus: ApiStatus;\n generateOeDocumentsStatus: ApiStatus;\n plans: ReEnrollmentChecklistPlan[];\n cobraReEnrollmentChecklistPlans: CobraChecklistPlan[];\n cobraPlanOnDeck: OnDeckCobraPlan;\n validations: PlanValidation[];\n planRateWizardStepIndex: number;\n cobraPlanTypes: CobraPlanType[];\n cobraPlanTypesStatus: ApiStatus;\n cobraInsurers: CobraInsurer[];\n cobraInsurersStatus: ApiStatus;\n cobraPlanOnDeckValidations: Record<string, string>;\n fetchCustomPlanStatus: ApiStatus;\n customPlans: CustomReEnrollmentPlanInformation[];\n coverageTypes: CoverageType[];\n planLevelDescriptions: PlanLevelDescription[];\n fetchCoverageTypesRequestStatus: ApiStatus;\n fetchPlanLevelDescriptionsStatus: ApiStatus;\n deleteCobraInProgressPlanStatus: ApiStatus;\n saveDirectBillChecklistStatus: ApiStatus;\n}\n\nexport const initialState: ReEnrollmentChecklistState = {\n fetchPlansStatus: 'uninitialized',\n saveOePacketInfoStatus: 'uninitialized',\n submitFileStatus: 'uninitialized',\n completeChecklistRequestStatus: 'uninitialized',\n saveCobraPlanStatus: 'uninitialized',\n fetchCobraChecklistPlansStatus: 'uninitialized',\n generateOeDocumentsStatus: 'uninitialized',\n cancelModalStatus: 'closed',\n redirectModalStatus: 'closed',\n plans: [],\n cobraReEnrollmentChecklistPlans: [],\n cobraPlanOnDeck: {},\n validations: [],\n planRateWizardStepIndex: 0,\n cobraPlanTypes: [],\n cobraPlanTypesStatus: 'uninitialized',\n cobraInsurers: [],\n cobraInsurersStatus: 'uninitialized',\n cobraPlanOnDeckValidations: {},\n fetchCustomPlanStatus: 'uninitialized',\n customPlans: [],\n coverageTypes: [],\n planLevelDescriptions: [],\n fetchCoverageTypesRequestStatus: 'uninitialized',\n fetchPlanLevelDescriptionsStatus: 'uninitialized',\n deleteCobraInProgressPlanStatus: 'uninitialized',\n saveDirectBillChecklistStatus: 'uninitialized',\n};\n\nconst reEnrollmentChecklistState = createSlice({\n name: 'reEnrollmentChecklist',\n initialState,\n reducers: {\n setPlans(state, { payload }: PayloadAction<ReEnrollmentChecklistPlan[]>) {\n state.plans = payload;\n },\n setCobraOeHandler(state, { payload }: PayloadAction<number | undefined>) {\n let index = state.plans.findIndex(p => p.type === 'cobra');\n let lens = lensPath([ index, 'cobraOeHandler' ]);\n state.plans = set(lens, payload, state.plans);\n },\n setCobraOeTemplateCoverLetter(state, { payload }: PayloadAction<boolean>) {\n let index = state.plans.findIndex(p => p.type === 'cobra');\n let lens = lensPath([ index, 'cobraOeTemplateCoverLetter' ]);\n state.plans = set(lens, payload, state.plans);\n },\n setCobraOeElectionFormApproved(state, { payload }: PayloadAction<boolean>) {\n let index = state.plans.findIndex(p => p.type === 'cobra');\n let lens = lensPath([ index, 'formReviewStatus', 'cobraElection' ]);\n state.plans = set(lens, payload, state.plans);\n },\n setCobraOeCoverLetterApproved(state, { payload }: PayloadAction<boolean>) {\n let index = state.plans.findIndex(p => p.type === 'cobra');\n let lens = lensPath([ index, 'formReviewStatus', 'coverLetter' ]);\n state.plans = set(lens, payload, state.plans);\n },\n setCobraOePrintOptionsBlackAndWhite(state, { payload }: PayloadAction<boolean>) {\n let index = state.plans.findIndex(p => p.type === 'cobra');\n let lens = lensPath([ index, 'printOptions', 'blackAndWhite' ]);\n state.plans = set(lens, payload, state.plans);\n },\n setCobraOePrintOptionsTwoSided(state, { payload }: PayloadAction<boolean>) {\n let index = state.plans.findIndex(p => p.type === 'cobra');\n let lens = lensPath([ index, 'printOptions', 'twoSided' ]);\n state.plans = set(lens, payload, state.plans);\n },\n setCobraOePacketFiles(state, { payload }: PayloadAction<FileListItem[]>) {\n state.plans = makeUpdatedCobraPlan<FileListItem[]>(state.plans, 'oePacketFiles', payload);\n },\n clearOePacketFiles(state) {\n let index = state.plans.findIndex(p => p.type === 'cobra');\n let lens = lensPath([ index, 'oePacketFiles' ]);\n state.plans = set(lens, [], state.plans);\n },\n addOePacketFiles(state, { payload: filesToAdd }: PayloadAction<FileListItem[]>) {\n let index = state.plans.findIndex(p => p.type === 'cobra');\n let lens = lensPath([ index, 'oePacketFiles' ]);\n let files: FileListItem[] = view(lens, state.plans);\n state.plans = set(lens, files.concat(filesToAdd), state.plans);\n },\n removeOePacketFileByName(state, { payload: fileName }: PayloadAction<string>) {\n let index = state.plans.findIndex(p => p.type === 'cobra');\n let lens = lensPath([ index, 'oePacketFiles' ]);\n let files: FileListItem[] = view(lens, state.plans);\n state.plans = set(lens, files.filter(file => file.fullName !== fileName), state.plans);\n },\n setCobraOeSendPackets(state, { payload }: PayloadAction<string>) {\n state.plans = makeUpdatedCobraPlan<string>(state.plans, 'cobraOeSendPackets', payload);\n },\n setCobraOeResponseDeadline(state, { payload }: PayloadAction<string>) {\n state.plans = makeUpdatedCobraPlan<string>(state.plans, 'cobraOeResponseDeadline', payload);\n },\n setCobraOeResponseRequired(state, { payload }: PayloadAction<number>) {\n state.plans = makeUpdatedCobraPlan<number>(state.plans, 'cobraOeResponseRequired', payload);\n },\n setValidations(state, { payload }: PayloadAction<PlanValidation[]>) {\n state.validations = payload;\n },\n setCobraOeValidations(state, { payload }: PayloadAction<PlanValidation>) {\n let index = state.validations.findIndex(p => p.type === 'cobra');\n let lens = lensPath([ index ]);\n state.validations = set(lens, payload, state.validations);\n },\n setCobraOeSubmitFileStatus(state, { payload }: PayloadAction<ApiStatus>) {\n state.submitFileStatus = payload;\n },\n cancelModalOpened(state) {\n state.cancelModalStatus = 'open';\n },\n cancelModalClosed(state) {\n state.cancelModalStatus = 'closed';\n },\n setCobraPlanNewEligibilityCount(state, { payload }: PayloadAction<number>) {\n state.plans = makeUpdatedCobraPlan<number>(state.plans, 'cobraOeNewEligibleCount', payload);\n },\n planRateWizardStepIndexChanged(state, { payload }: PayloadAction<number>) {\n state.planRateWizardStepIndex = payload;\n },\n setNewCobraPlanOnDeck(state, { payload }: PayloadAction<number | null>) {\n const plan: any = state.cobraReEnrollmentChecklistPlans\n .find(p => p.planInProgressId === payload);\n state.cobraPlanOnDeck = plan ?? {};\n },\n setExistingCobraPlanOnDeck(state, { payload }: PayloadAction<number | null>) {\n const plan: any = state.cobraReEnrollmentChecklistPlans\n .find(p => p.planId === payload);\n state.cobraPlanOnDeck = plan ?? {};\n },\n setCobraPlanOnDeckPlanName(state, { payload }: PayloadAction<string>) {\n let lens = lensPath([ 'planName' ]);\n state.cobraPlanOnDeck = set(lens, payload, state.cobraPlanOnDeck);\n },\n setCobraPlanOnDeckInsurer(state, { payload }: PayloadAction<string>) {\n let lens = lensPath([ 'carrier' ]);\n state.cobraPlanOnDeck = set(lens, payload, state.cobraPlanOnDeck);\n },\n setCobraPlanOnDeckPlanTypeId(state, { payload }: PayloadAction<number>) {\n const coverageTypes = state.coverageTypes;\n let name = pathOr(\n '',\n [ 'name' ],\n find(propEq('planTypeId', payload), coverageTypes));\n\n if (payload !== 8) {\n state.cobraPlanOnDeck = set(\n lensPath([ 'planTypeDescription' ]), undefined, state.cobraPlanOnDeck,\n );\n }\n\n state.cobraPlanOnDeck = set(lensPath([ 'planTypeName' ]), name, state.cobraPlanOnDeck);\n state.cobraPlanOnDeck = set(lensPath([ 'planTypeId' ]), payload, state.cobraPlanOnDeck);\n },\n setCobraPlanOnDeckPlanTypeName(state, { payload }: PayloadAction<string>) {\n let lens = lensPath([ 'planTypeName' ]);\n state.cobraPlanOnDeck = set(lens, payload, state.cobraPlanOnDeck);\n },\n setCobraPlanOnDeckPolicyNumber(state, { payload }: PayloadAction<string>) {\n let lens = lensPath([ 'planPolicyNumber' ]);\n state.cobraPlanOnDeck = set(lens, payload, state.cobraPlanOnDeck);\n },\n setCobraPlanOnDeckActivateAccountType(state, { payload }: PayloadAction<number>) {\n let lens = lensPath([ 'activateAccountType' ]);\n state.cobraPlanOnDeck = set(lens, payload, state.cobraPlanOnDeck);\n },\n setCobraPlanOnDeckUpdatePaidThrough(state, { payload }: PayloadAction<number>) {\n let lens = lensPath([ 'updatePaidThrough' ]);\n state.cobraPlanOnDeck = set(lens, payload, state.cobraPlanOnDeck);\n },\n setCobraInsurers(state, { payload }:PayloadAction<CobraInsurer[]>) {\n state.cobraInsurers = payload;\n },\n setCobraPlanOnDeckPlanTypeDescription(state, { payload }: PayloadAction<string | undefined>) {\n let lens = lensPath([ 'planTypeDescription' ]);\n state.cobraPlanOnDeck = set(lens, payload, state.cobraPlanOnDeck);\n },\n setCobraPlanOnDeckHasLevels(state, { payload }: PayloadAction<string>) {\n let lens = lensPath([ 'hasLevels' ]);\n state.cobraPlanOnDeck = set(lens, payload, state.cobraPlanOnDeck);\n },\n setCobraPlanOnDeckNewCarrierName(state, { payload }: PayloadAction<string>) {\n let lens = lensPath([ 'newCarrierName' ]);\n state.cobraPlanOnDeck = set(lens, payload, state.cobraPlanOnDeck);\n },\n setCobraPlanOnDeckCarrierContactName(state, { payload }: PayloadAction<string>) {\n let lens = lensPath([ 'carrierContactName' ]);\n state.cobraPlanOnDeck = set(lens, payload, state.cobraPlanOnDeck);\n },\n setCobraPlanOnDeckCarrierContactEmail(state, { payload }: PayloadAction<string>) {\n let lens = lensPath([ 'carrierContactEmail' ]);\n state.cobraPlanOnDeck = set(lens, payload, state.cobraPlanOnDeck);\n lens = lensPath([ 'carrierContactEmailArray' ]);\n const newArr = payload.length > 0 ? payload.split(';') : [];\n state.cobraPlanOnDeck = set(lens, newArr, state.cobraPlanOnDeck);\n },\n setCobraPlanOnDeckCarrierContactEmailTemp(state, { payload }: PayloadAction<string>) {\n const lens = lensPath([ 'carrierContactEmailTemp' ]);\n state.cobraPlanOnDeck = set(lens, payload, state.cobraPlanOnDeck);\n },\n setCobraPlanOnDeckCarrierContactEmailArray(state, { payload }: PayloadAction<string[]>) {\n const lens = lensPath([ 'carrierContactEmailArray' ]);\n state.cobraPlanOnDeck = set(lens, payload, state.cobraPlanOnDeck);\n },\n setCobraPlanOnDeckCarrierContactPhone(state, { payload }: PayloadAction<string>) {\n let lens = lensPath([ 'carrierContactPhone' ]);\n state.cobraPlanOnDeck = set(lens, payload, state.cobraPlanOnDeck);\n },\n setCobraPlanOnDeckCarrierId(state, { payload }: PayloadAction<number>) {\n let lens = lensPath([ 'carrierId' ]);\n state.cobraPlanOnDeck = set(lens, payload, state.cobraPlanOnDeck);\n },\n setCobraPlanOnDeckCarrierNameAndId(state, { payload }: PayloadAction<string>) {\n let carrierLens = lensPath([ 'carrier' ]);\n state.cobraPlanOnDeck = set(carrierLens, payload, state.cobraPlanOnDeck);\n\n const insurers = state.cobraInsurers;\n\n const insurerId = pathOr(\n null,\n [ 'cobraInsurerId' ],\n find(propEq('insurer', payload), insurers),\n );\n\n let idLens = lensPath([ 'carrierId' ]);\n state.cobraPlanOnDeck = set(idLens, insurerId, state.cobraPlanOnDeck);\n },\n setCobraPlanOnDeckCarrierUpdateMethod(state, { payload }: PayloadAction<InsurerUpdateMethod>) {\n const methodLens = lensPath([ 'carrierUpdateMethod' ]);\n state.cobraPlanOnDeck = set(methodLens, payload, state.cobraPlanOnDeck);\n\n if (payload !== InsurerUpdateMethod.Other) {\n const notesLens = lensPath([ 'carrierUpdateMethodNotes' ]);\n state.cobraPlanOnDeck = set(notesLens, '', state.cobraPlanOnDeck);\n }\n },\n setCobraPlanOnDeckCarrierUpdateMethodNotes(state, { payload }: PayloadAction<string>) {\n let lens = lensPath([ 'carrierUpdateMethodNotes' ]);\n state.cobraPlanOnDeck = set(lens, payload, state.cobraPlanOnDeck);\n },\n setCobraPlanOnDeckCarrierNotes(state, { payload }: PayloadAction<string>) {\n let lens = lensPath([ 'carrierNotes' ]);\n state.cobraPlanOnDeck = set(lens, payload, state.cobraPlanOnDeck);\n },\n setCobraPlanOnDeckInit(state, { payload }: PayloadAction<boolean>) {\n let lens = lensPath([ 'cobraPlanOnDeckInit' ]);\n state.cobraPlanOnDeck = set(lens, payload, state.cobraPlanOnDeck);\n },\n setCobraPlanOnDeckValidations(state, { payload }:PayloadAction<Record<string, string>>) {\n state.cobraPlanOnDeckValidations = payload;\n },\n setCobraPlanOnDeckNewPlanLevel(state, { payload }) {\n state.cobraPlanOnDeck.planLevels = append(\n { levelCoverageTier: payload.levelName, levelDescriptionId: payload.levelId } as any,\n state.cobraPlanOnDeck.planLevels ?? [],\n );\n },\n resetCobraPlanOnDeckNewPlanLevels(state) {\n state.cobraPlanOnDeck.planLevels = [];\n },\n setCobraPlanOnDeckConfirmRates(state, { payload }: PayloadAction<boolean>) {\n let lens = lensPath([ 'confirmRates' ]);\n state.cobraPlanOnDeck = set(lens, payload, state.cobraPlanOnDeck);\n },\n setCobraPlanOnDeckPlanLevelEffectiveTo(state, { payload }) {\n state.cobraPlanOnDeck.planLevels = state\n .cobraPlanOnDeck\n .planLevels\n ?.map(level => ({ ...level, levelCostEndDate: payload }));\n },\n setCobraPlanOnDeckPlanLevelEffectiveFrom(state, { payload }) {\n state.cobraPlanOnDeck.planLevels = state\n .cobraPlanOnDeck\n .planLevels\n ?.map(level => ({ ...level, levelCostBeginDate: payload }));\n },\n setCobraPlanOnDeckPlanRate(state, { payload }: PayloadAction<{levelCoverageTier: string; levelCost: number;}>) {\n let index = state\n .cobraPlanOnDeck\n .planLevels\n ?.findIndex(p => p.levelCoverageTier === payload.levelCoverageTier) ?? -1;\n let lens = lensPath([ index, 'levelCost' ]);\n state.cobraPlanOnDeck.planLevels = set(lens, payload.levelCost, state.cobraPlanOnDeck.planLevels);\n },\n removeCobraPlanOnDeckPlanLevel(state, { payload }: PayloadAction<string>) {\n state.cobraPlanOnDeck.planLevels = state\n .cobraPlanOnDeck\n .planLevels\n ?.filter(p => p.levelCoverageTier !== payload) ?? [];\n },\n setCobraPlanOnDeckRatesDocuments(\n state,\n { payload }: PayloadAction<{ files: FileListItem[]; planInProgressId: number; }>,\n ) {\n const { files, planInProgressId } = payload;\n let lens = lensPath([ 'reenrollmentRatesDocs' ]);\n\n const planIndex = state.cobraReEnrollmentChecklistPlans\n .findIndex(p => p.planInProgressId === planInProgressId);\n\n if (planIndex !== -1) {\n state.cobraReEnrollmentChecklistPlans[planIndex] =\n set(lens, files, state.cobraReEnrollmentChecklistPlans[planIndex]);\n }\n\n state.cobraPlanOnDeck = set(lens, files, state.cobraPlanOnDeck);\n },\n setCobraPlanOnDeckPlanInProgressId(state, { payload }: PayloadAction<number>) {\n let lens = lensPath([ 'planInProgressId' ]);\n state.cobraPlanOnDeck = set(lens, payload, state.cobraPlanOnDeck);\n },\n setRedirectModalStatus(state, { payload }: PayloadAction<CancelModalStatus>) {\n state.redirectModalStatus = payload;\n },\n resetCobraPlanOnDeckRatesDocuments(state) {\n state.cobraPlanOnDeck.reenrollmentRatesDocs = [];\n },\n setCobraPlanTerminating(state, { payload }: PayloadAction<CobraChecklistPlan>) {\n const planIndex = state.cobraReEnrollmentChecklistPlans\n .findIndex(p => p.planId === payload.planId);\n const lens = lensPath([ 'terminating' ]);\n state.cobraReEnrollmentChecklistPlans[planIndex] =\n set(lens, !payload.terminating, state.cobraReEnrollmentChecklistPlans[planIndex]);\n },\n setOeValidationsByPlanType(state, { payload }: PayloadAction<PlanValidation>) {\n let index = state.validations.findIndex(p => p.type === payload.type);\n let lens = lensPath([ index ]);\n state.validations = set(lens, payload, state.validations);\n },\n setDirectBillOeBegins(state, { payload }: PayloadAction<string>) {\n state.plans = updatePlanByType<string>(state.plans, 'directBillOeBegins', payload, 'directBill');\n },\n setDirectBillOeEnds(state, { payload }: PayloadAction<string>) {\n state.plans = updatePlanByType<string>(state.plans, 'directBillOeEnds', payload, 'directBill');\n },\n setDirectBillResponseDeadline(state, { payload }: PayloadAction<string>) {\n state.plans = updatePlanByType<string>(state.plans, 'directBillResponseDeadline', payload, 'directBill');\n },\n },\n extraReducers: (builder) => {\n const saveOePacketInfo = (state: ReEnrollmentChecklistState, action: any) => {\n state.saveOePacketInfoStatus = 'fulfilled';\n\n if (!!action.payload) {\n let index = state.plans.findIndex(p => p.type === 'cobra');\n state.plans = state.plans.map((plan, idx) => {\n if (idx !== index) {\n return plan;\n }\n\n return applyPlanTypeDiscriminator({\n ...plan,\n ...action.payload,\n });\n });\n }\n };\n\n builder\n .addCase(fetchReEnrollmentChecklistPlan.pending, (state) => {\n state.fetchPlansStatus = 'pending';\n })\n .addCase(fetchReEnrollmentChecklistPlan.rejected, (state) => {\n state.fetchPlansStatus = 'rejected';\n })\n .addCase(fetchReEnrollmentChecklistPlan.fulfilled, (state, action) => {\n state.fetchPlansStatus = 'fulfilled';\n state.plans = action\n .payload\n .map(applyPlanTypeDiscriminator)\n .map(plan => ({ ...plan, activateAccountType: plan.activateAccountType ?? ActivateAccountType.PAYMENT }));\n state.validations =\n compose(\n map(pick([ 'type' , 'planYearStart' ])),\n map(applyPlanTypeDiscriminator),\n )(action.payload);\n })\n .addCase(saveCobraOePacketInfo.pending, (state) => {\n state.saveOePacketInfoStatus = 'pending';\n })\n .addCase(saveCobraOePacketInfo.rejected, (state) => {\n state.saveOePacketInfoStatus = 'rejected';\n })\n .addCase(saveCobraOePacketInfo.fulfilled, saveOePacketInfo)\n .addCase(completeChecklist.pending, (state) => {\n state.completeChecklistRequestStatus = 'pending';\n })\n .addCase(completeChecklist.rejected, (state) => {\n state.completeChecklistRequestStatus = 'rejected';\n })\n .addCase(completeChecklist.fulfilled, (state) => {\n state.completeChecklistRequestStatus = 'fulfilled';\n })\n .addCase(saveCobraPlan.pending, (state) => {\n state.saveCobraPlanStatus = 'pending';\n })\n .addCase(saveCobraPlan.rejected, (state) => {\n state.saveCobraPlanStatus = 'rejected';\n })\n .addCase(saveCobraPlan.fulfilled, (state, action) => {\n state.saveCobraPlanStatus = 'fulfilled';\n state.cobraReEnrollmentChecklistPlans = action.payload;\n })\n .addCase(fetchCobraChecklistPlans.pending, (state) => {\n state.fetchCobraChecklistPlansStatus = 'pending';\n })\n .addCase(fetchCobraChecklistPlans.rejected, (state) => {\n state.fetchCobraChecklistPlansStatus = 'rejected';\n })\n .addCase(fetchCobraChecklistPlans.fulfilled, (state, action) => {\n state.fetchCobraChecklistPlansStatus = 'fulfilled';\n state.cobraReEnrollmentChecklistPlans = action.payload;\n })\n .addCase(fetchCobraPlanTypes.pending, (state) => {\n state.cobraPlanTypesStatus = 'pending';\n })\n .addCase(fetchCobraPlanTypes.rejected, (state) => {\n state.cobraPlanTypesStatus = 'rejected';\n })\n .addCase(fetchCobraPlanTypes.fulfilled, (state, action) => {\n state.cobraPlanTypesStatus = 'fulfilled';\n state.cobraPlanTypes = action.payload;\n })\n .addCase(fetchCobraInsurers.pending, (state) => {\n state.cobraInsurersStatus = 'pending';\n })\n .addCase(fetchCobraInsurers.rejected, (state) => {\n state.cobraInsurersStatus = 'rejected';\n })\n .addCase(fetchCobraInsurers.fulfilled, (state, action) => {\n state.cobraInsurersStatus = 'fulfilled';\n state.cobraInsurers = action.payload;\n })\n .addCase(fetchCustomPlans.pending, (state) => {\n state.fetchCustomPlanStatus = 'pending';\n })\n .addCase(fetchCustomPlans.rejected, (state) => {\n state.fetchCustomPlanStatus = 'rejected';\n })\n .addCase(fetchCustomPlans.fulfilled, (state, action) => {\n state.fetchCustomPlanStatus = 'fulfilled';\n state.customPlans = action.payload;\n })\n // stealing these statuses since they all return the same data\n // and will be the same trigger to a loading indicator\n .addCase(deleteOeDocument.pending, (state) => {\n state.saveOePacketInfoStatus = 'pending';\n })\n .addCase(deleteOeDocument.rejected, (state) => {\n state.saveOePacketInfoStatus = 'rejected';\n })\n .addCase(deleteOeDocument.fulfilled, saveOePacketInfo)\n .addCase(generateOeDocuments.pending, (state) => {\n state.saveOePacketInfoStatus = 'pending';\n state.generateOeDocumentsStatus = 'pending';\n })\n .addCase(generateOeDocuments.rejected, (state) => {\n state.saveOePacketInfoStatus = 'rejected';\n state.generateOeDocumentsStatus = 'rejected';\n })\n .addCase(generateOeDocuments.fulfilled, saveOePacketInfo)\n .addCase(finalizeCobraPlans.pending, (state) => {\n state.saveOePacketInfoStatus = 'pending';\n })\n .addCase(finalizeCobraPlans.rejected, (state) => {\n state.saveOePacketInfoStatus = 'rejected';\n })\n .addCase(finalizeCobraPlans.fulfilled, (state, action) => {\n state.saveOePacketInfoStatus = 'fulfilled';\n state.cobraReEnrollmentChecklistPlans = action.payload;\n })\n .addCase(fetchCoverageTypes.pending, (state) => {\n state.fetchCoverageTypesRequestStatus = 'pending';\n })\n .addCase(fetchCoverageTypes.rejected, (state) => {\n state.fetchCoverageTypesRequestStatus = 'rejected';\n })\n .addCase(fetchCoverageTypes.fulfilled, (state, action) => {\n state.fetchCoverageTypesRequestStatus = 'fulfilled';\n state.coverageTypes = action.payload;\n })\n .addCase(fetchPlanLevelDescriptions.pending, (state) => {\n state.fetchPlanLevelDescriptionsStatus = 'pending';\n })\n .addCase(fetchPlanLevelDescriptions.rejected, (state) => {\n state.fetchPlanLevelDescriptionsStatus = 'rejected';\n })\n .addCase(fetchPlanLevelDescriptions.fulfilled, (state, action) => {\n state.fetchPlanLevelDescriptionsStatus = 'fulfilled';\n state.planLevelDescriptions = action.payload;\n })\n .addCase(deleteCobraInProgressPlan.pending, (state) => {\n state.deleteCobraInProgressPlanStatus = 'pending';\n })\n .addCase(deleteCobraInProgressPlan.rejected, (state) => {\n state.deleteCobraInProgressPlanStatus = 'rejected';\n })\n .addCase(deleteCobraInProgressPlan.fulfilled, (state, action) => {\n state.deleteCobraInProgressPlanStatus = 'fulfilled';\n state.cobraReEnrollmentChecklistPlans = action.payload;\n })\n .addCase(saveDirectBillChecklist.pending, (state) => {\n state.saveDirectBillChecklistStatus = 'pending';\n })\n .addCase(saveDirectBillChecklist.rejected, (state) => {\n state.saveDirectBillChecklistStatus = 'rejected';\n })\n .addCase(saveDirectBillChecklist.fulfilled, (state) => {\n state.saveDirectBillChecklistStatus = 'fulfilled';\n });\n },\n});\n\nexport const {\n setPlans,\n setCobraOeHandler,\n setCobraOeTemplateCoverLetter,\n setCobraOeElectionFormApproved,\n setCobraOeCoverLetterApproved,\n clearOePacketFiles,\n addOePacketFiles,\n removeOePacketFileByName,\n setCobraOeSendPackets,\n setCobraOeResponseDeadline,\n setCobraOeResponseRequired,\n setCobraOeValidations,\n setCobraOePacketFiles,\n setValidations,\n setCobraOePrintOptionsBlackAndWhite,\n setCobraOePrintOptionsTwoSided,\n setCobraOeSubmitFileStatus,\n cancelModalClosed,\n cancelModalOpened,\n setCobraPlanNewEligibilityCount,\n planRateWizardStepIndexChanged,\n setNewCobraPlanOnDeck,\n setExistingCobraPlanOnDeck,\n setCobraPlanOnDeckPlanName,\n setCobraPlanOnDeckInsurer,\n setCobraPlanOnDeckPlanTypeId,\n setCobraPlanOnDeckPlanTypeName,\n setCobraPlanOnDeckPlanTypeDescription,\n setCobraPlanOnDeckPolicyNumber,\n setCobraPlanOnDeckActivateAccountType,\n setCobraPlanOnDeckUpdatePaidThrough,\n setCobraInsurers,\n setCobraPlanOnDeckHasLevels,\n setCobraPlanOnDeckNewCarrierName,\n setCobraPlanOnDeckCarrierContactName,\n setCobraPlanOnDeckCarrierContactEmail,\n setCobraPlanOnDeckCarrierContactEmailTemp,\n setCobraPlanOnDeckCarrierContactEmailArray,\n setCobraPlanOnDeckCarrierContactPhone,\n setCobraPlanOnDeckCarrierId,\n setCobraPlanOnDeckCarrierUpdateMethod,\n setCobraPlanOnDeckCarrierUpdateMethodNotes,\n setCobraPlanOnDeckCarrierNotes,\n setCobraPlanOnDeckInit,\n setCobraPlanOnDeckValidations,\n setCobraPlanOnDeckNewPlanLevel,\n resetCobraPlanOnDeckNewPlanLevels,\n setCobraPlanOnDeckConfirmRates,\n setCobraPlanOnDeckPlanRate,\n removeCobraPlanOnDeckPlanLevel,\n setCobraPlanOnDeckPlanLevelEffectiveTo,\n setCobraPlanOnDeckPlanLevelEffectiveFrom,\n setCobraPlanOnDeckRatesDocuments,\n setCobraPlanOnDeckPlanInProgressId,\n setRedirectModalStatus,\n resetCobraPlanOnDeckRatesDocuments,\n setCobraPlanTerminating,\n setOeValidationsByPlanType,\n setDirectBillOeBegins,\n setDirectBillOeEnds,\n setDirectBillResponseDeadline,\n setCobraPlanOnDeckCarrierNameAndId,\n} = reEnrollmentChecklistState.actions;\n\nexport default reEnrollmentChecklistState.reducer;\n\nconst makeUpdatedCobraPlan = <T>(\n plans: ReEnrollmentChecklistPlan[],\n path: string,\n payload: T,\n) => {\n let index = plans.findIndex(p => p.type === 'cobra');\n let lens = lensPath([ index, path ]);\n\n return set(lens, payload, plans);\n};\n\nconst updatePlanByType = <T>(\n plans: ReEnrollmentChecklistPlan[],\n path: string,\n payload: T,\n planType: string,\n) => {\n let index = plans.findIndex(p => p.type === planType);\n let lens = lensPath([ index, path ]);\n\n return set(lens, payload, plans);\n};\n\nconst viewLens = (plans: ReEnrollmentChecklistPlan[], path: string, type: string) => {\n const index = plans.findIndex(p => p.type === type);\n const newLens = lensPath([ index, path ]);\n\n return view(newLens, plans);\n};\n\nexport const selectFetchPlansStatus = (state: RootState) => state.reEnrollmentChecklist.fetchPlansStatus;\n\nexport const selectReEnrollmentChecklistPlans = (state: RootState) => state.reEnrollmentChecklist.plans;\n\nexport const selectReEnrollmentPlansByPlanYearId = (planYearId: number) => (state: RootState) => state\n .reEnrollmentChecklist\n .plans.find((p) => p.planYearId === planYearId);\n\nexport const selectReEnrollmentChecklistRenewalDate = (state: RootState): string => {\n const sortedDates = state.reEnrollmentChecklist.plans\n .map(p => p.renewalDate)\n .sort((a: string, b: string) => dayjs(a).unix() - dayjs(b).unix());\n\n const closestFutureDate = compose(\n head,\n (dates: string[]) => dates\n .filter((d) => dayjs(d).isAfter(dayjs())),\n )(sortedDates) as string;\n\n const closestPastDate = last(sortedDates) as string;\n\n return !!closestFutureDate ? closestFutureDate : closestPastDate;\n};\n\nexport const selectCobraPlan = (state: RootState): CobraReEnrollmentChecklistPlan => {\n return (state.reEnrollmentChecklist.plans\n .find(plan => plan.type === 'cobra') ?? {}) as CobraReEnrollmentChecklistPlan;\n};\n\nexport const selectCobraOeProgress = (state: RootState) => {\n const cobraPlan = selectCobraPlan(state);\n const {\n coverLetterSectionComplete = false,\n oePacketsSectionComplete = false,\n oePacketsChecklistComplete = false,\n } = cobraPlan;\n const statuses = {\n oePacketsChecklistComplete,\n };\n const optionalStatuses = {\n coverLetterSectionComplete,\n oePacketsSectionComplete,\n };\n\n const steps = Object.values(statuses);\n const optionalSteps = Object.values(optionalStatuses);\n const cobraHandler = selectCobraOeHandler(state) === 0;\n const templateCoverLetter = selectCobraOeTemplateCoverLetter(state);\n const totalComplete = (cobraHandler && !templateCoverLetter) ? steps : concat(steps, optionalSteps);\n\n return getPercentageFromBooleanArray(totalComplete);\n};\n\nexport const selectCobraChecklistProgress = (state: RootState) => {\n const cobraPlan = selectCobraPlan(state);\n const isPlanRatesInvalid = selectPlanRatesContinueIsDisabled(state);\n const {\n eligibilitySectionComplete = false,\n oeOptionsSectionComplete = false,\n checklistComplete = false,\n } = cobraPlan;\n const statuses = {\n eligibilitySectionComplete,\n oeOptionsSectionComplete,\n planRatesSectionComplete: !isPlanRatesInvalid,\n checklistComplete,\n };\n const steps = Object.values(statuses);\n\n return getPercentageFromBooleanArray(steps);\n};\n\nexport const selectCobraOeHandler = (state: RootState): number | undefined => {\n return viewLens(state.reEnrollmentChecklist.plans, 'cobraOeHandler', 'cobra');\n};\n\nexport const selectCobraOeTemplateCoverLetter = (state: RootState): boolean => {\n return viewLens(state.reEnrollmentChecklist.plans, 'cobraOeTemplateCoverLetter', 'cobra');\n};\n\nexport const selectCobraOeElectionFormApproved = (state: RootState): boolean => {\n const index = state.reEnrollmentChecklist.plans.findIndex(p => p.type === 'cobra');\n const newLens = lensPath([ index, 'formReviewStatus', 'cobraElection' ]);\n\n return view(newLens, state.reEnrollmentChecklist.plans);\n};\n\nexport const selectCobraOeCoverLetterApproved = (state: RootState): boolean => {\n const index = state.reEnrollmentChecklist.plans.findIndex(p => p.type === 'cobra');\n const newLens = lensPath([ index, 'formReviewStatus', 'coverLetter' ]);\n\n return view(newLens, state.reEnrollmentChecklist.plans);\n};\n\nexport const selectCobraOePrintOptionBlackAndWhite = (state: RootState): boolean => {\n const index = state.reEnrollmentChecklist.plans.findIndex(p => p.type === 'cobra');\n const newLens = lensPath([ index, 'printOptions', 'blackAndWhite' ]);\n\n return view(newLens, state.reEnrollmentChecklist.plans);\n};\n\nexport const selectCobraOePrintOptionTwoSided = (state: RootState): boolean => {\n const index = state.reEnrollmentChecklist.plans.findIndex(p => p.type === 'cobra');\n const newLens = lensPath([ index, 'printOptions', 'twoSided' ]);\n\n return view(newLens, state.reEnrollmentChecklist.plans);\n};\n\nexport const oeFileNamePrefixes = {\n cobraOePacketFilePrefix: 'CobraOEPack-',\n cobraOePacketAdditionalFilePrefix: 'CobraOEPack-Add-',\n cobraRateFilePrefix: 'CobraRateSheet-',\n coverLetter: 'CoverLetter-',\n electionForm: 'ElectionForm-',\n};\n\nconst coverLetterPrefix = `${oeFileNamePrefixes.cobraOePacketFilePrefix}${oeFileNamePrefixes.coverLetter}`;\nconst electionFormPrefix = `${oeFileNamePrefixes.cobraOePacketFilePrefix}${oeFileNamePrefixes.electionForm}`;\n\nexport const selectOePacketFiles = (state: RootState): FileListItem[] => {\n const allFiles = viewLens(state.reEnrollmentChecklist.plans, 'oePacketFiles', 'cobra') ?? [] as FileListItem[];\n\n return allFiles\n .filter((file: FileListItem) => (file.fullName.startsWith(oeFileNamePrefixes.cobraOePacketAdditionalFilePrefix)));\n};\n\nexport const selectCobraOeCoverLetter = (state: RootState): FileListItem | null => {\n const allFiles = viewLens(state.reEnrollmentChecklist.plans, 'oePacketFiles', 'cobra') ?? [] as FileListItem[];\n\n return allFiles.find((file: FileListItem) => (file.fullName.startsWith(coverLetterPrefix)));\n};\n\nexport const selectCobraOeElectionForm = (state: RootState): FileListItem | null => {\n const allFiles = viewLens(state.reEnrollmentChecklist.plans, 'oePacketFiles', 'cobra') ?? [] as FileListItem[];\n\n return allFiles.find((file: FileListItem) => (file.fullName.startsWith(electionFormPrefix)));\n};\n\nexport const selectCobraOePlanYearStart = (state: RootState): number | undefined => {\n return viewLens(state.reEnrollmentChecklist.plans, 'planYearStart', 'cobra');\n};\n\nexport const selectCobraOeValidations = (state: RootState): PlanValidation => {\n return state.reEnrollmentChecklist.validations.find(t => t.type === 'cobra') ?? [] as PlanValidation;\n};\n\nexport const selectSaveCobraOePacketInfoStatus = (state: RootState): string => {\n return state.reEnrollmentChecklist.saveOePacketInfoStatus;\n};\n\nexport const selectCobraOeSubmitDocStatus = (state: RootState): string => {\n return state.reEnrollmentChecklist.submitFileStatus;\n};\n\nexport const selectCompleteChecklistRequestStatus = (state: RootState): string => {\n return state.reEnrollmentChecklist.completeChecklistRequestStatus;\n};\n\nexport const selectCompanyId = (state: RootState): number => {\n const index = state.reEnrollmentChecklist.plans.findIndex(p => p.type === 'cobra');\n const newLens = lensPath([ index, 'companyId' ]);\n\n return view(newLens, state.reEnrollmentChecklist.plans);\n};\n\nexport const selectPlanByPlanCode = (planCode: string) => (state: RootState): ReEnrollmentChecklistPlan => {\n const index = state.reEnrollmentChecklist.plans.findIndex(p => p.planCode === planCode);\n const newLens = lensPath([ index ]);\n\n return view(newLens, state.reEnrollmentChecklist.plans);\n};\n\nexport const selectCancelModalStatus = (state: RootState): string => state.reEnrollmentChecklist.cancelModalStatus;\n\nexport const selectCobraPlanNewEligibleCount = (state: RootState): number => {\n return viewLens(state.reEnrollmentChecklist.plans, 'cobraOeNewEligibleCount', 'cobra');\n};\n\nexport const selectPreviousYearCobraPlanNewEligibleCount = (state: RootState): number => {\n return viewLens(state.reEnrollmentChecklist.plans, 'previousYearCobraOeNewEligibleCount', 'cobra');\n};\n\nexport const selectEligibilityCountDifference = (state: RootState): number => {\n const previous = selectPreviousYearCobraPlanNewEligibleCount(state);\n const current = selectCobraPlanNewEligibleCount(state);\n\n return Math.abs(((previous - current) / previous) * 100);\n};\n\nexport const selectSaveCobraPlanStatus = (state: RootState): string => {\n return state.reEnrollmentChecklist.saveCobraPlanStatus;\n};\n\nexport const selectFetchCobraChecklistPlansStatus = (state: RootState): string => {\n return state.reEnrollmentChecklist.fetchCobraChecklistPlansStatus;\n};\n\nexport const selectUniqueCobraReEnrollmentChecklistPlans = (state: RootState) => {\n return state.reEnrollmentChecklist.cobraReEnrollmentChecklistPlans\n .filter(p => !p.terminating)\n .map(p => {\n const hasDocs = p.reenrollmentRatesDocs.length > 0;\n const hasRates = p.planLevels.length > 0 && p.planLevels.every(level => !!level.levelCost);\n const ratesStatus = ifElse(\n allPass([\n compose(equals(true), always(!!p.planInProgressId)),\n either(\n compose(equals(true), always(hasRates)),\n compose(equals(true), always(hasDocs)),\n ),\n ]),\n always('reviewed'),\n always('incomplete'),\n )(p);\n\n const planWithRatesStatus = Object.assign({}, p, { ratesStatus }) as CobraChecklistPlan;\n\n return planWithRatesStatus;\n });\n};\n\nexport const selectDiscontinuedCobraChecklistPlans = (state: RootState) => {\n return state.reEnrollmentChecklist.cobraReEnrollmentChecklistPlans\n .filter(p => p.terminating)\n .map(p => {\n const planWithRatesStatus = Object.assign({}, p, { ratesStatus: 'discontinued' }) as CobraChecklistPlan;\n\n return planWithRatesStatus;\n });\n};\n\nexport const selectCobraReEnrollmentChecklistPlansByType = (state: RootState) => {\n return groupBy((plan) => plan.planTypeName, state.reEnrollmentChecklist.cobraReEnrollmentChecklistPlans\n .filter(p => !p.terminating));\n};\n\nexport const selectPlanRateWizardStepIndex = (state: RootState): number => {\n return state.reEnrollmentChecklist.planRateWizardStepIndex;\n};\n\nexport const selectCobraPlanTypes = (state: RootState): CobraPlanType[] => {\n return state.reEnrollmentChecklist.cobraPlanTypes;\n};\n\nexport const selectCobraPlanTypesStatus = (state: RootState): ApiStatus => {\n return state.reEnrollmentChecklist.cobraPlanTypesStatus;\n};\n\nexport const selectCobraInsurers = (state: RootState): CobraInsurer[] => {\n return state.reEnrollmentChecklist.cobraInsurers;\n};\n\nexport const selectCobraInsurersStatus = (state: RootState): ApiStatus => {\n return state.reEnrollmentChecklist.cobraInsurersStatus;\n};\n\nexport const selectCobraPlanOnDeck = (state: RootState): OnDeckCobraPlan => {\n return state.reEnrollmentChecklist.cobraPlanOnDeck;\n};\n\nexport const selectCobraPlanLevelsAllPositive = (state: RootState): boolean => {\n return state.reEnrollmentChecklist.cobraPlanOnDeck.planLevels?.every(plan => plan.levelCost >= 0) ?? false;\n};\n\nexport const selectCobraPlanOnDeckCarrierId = (state: RootState): number | null | undefined => {\n return state.reEnrollmentChecklist.cobraPlanOnDeck.carrierId;\n};\n\nexport const selectCobraPlanOnDeckCarrierNotes = (state: RootState): string | undefined => {\n return state.reEnrollmentChecklist.cobraPlanOnDeck.carrierNotes;\n};\n\nexport const selectCobraPlanOnDeckValidations = (state: RootState): Record<string, string> => {\n return state.reEnrollmentChecklist.cobraPlanOnDeckValidations;\n};\n\nexport const selectCobraPlanOnDeckConfirmRates = (state: RootState): boolean | undefined => {\n return state.reEnrollmentChecklist.cobraPlanOnDeck.confirmRates;\n};\n\nexport const selectCobraPlanOnDeckRatesEffectiveTo = (state: RootState) => {\n // they will all be the same, so just grab the first one\n const newLens = lensPath([ 0, 'levelCostEndDate' ]);\n\n return view(newLens, state.reEnrollmentChecklist.cobraPlanOnDeck.planLevels);\n};\n\nexport const selectCobraPlanOnDeckRatesEffectiveFrom = (state: RootState) => {\n // they will all be the same, so just grab the first one\n const newLens = lensPath([ 0, 'levelCostBeginDate' ]);\n\n return view(newLens, state.reEnrollmentChecklist.cobraPlanOnDeck.planLevels);\n};\n\nexport const selectLevelCoverageTiersOnDeck = (state: RootState) => {\n let plan = selectCobraPlanOnDeck(state);\n\n return plan.planLevels ?? [];\n};\n\nexport const selectCustomPlanNames = (state: RootState) => {\n return state.reEnrollmentChecklist.customPlans.map(p => p.planName);\n};\n\nexport const selectCustomPlanNamesFetchStatus = (state: RootState) => {\n return state.reEnrollmentChecklist.fetchCustomPlanStatus;\n};\n\nexport const selectOnDeckPlanHasLevels = (state: RootState) => {\n return state.reEnrollmentChecklist.cobraPlanOnDeck.hasLevels;\n};\n\nexport const selectIsOnDeckPlanNew = (state: RootState) => {\n return !state.reEnrollmentChecklist.cobraPlanOnDeck.planId;\n};\n\nexport const selectOnDeckPlanRatesDocuments = (state: RootState) => {\n return selectCobraPlanOnDeck(state).reenrollmentRatesDocs ?? [];\n};\n\nexport const selectGenerateOeDocumentsStatus = (state: RootState) => {\n return state.reEnrollmentChecklist.generateOeDocumentsStatus;\n};\n\nexport const selectDoesRedirectToOePackets = (state: RootState) => {\n const cobraPlan = selectCobraPlan(state);\n\n return cobraPlan.cobraOeHandler === 0 && !cobraPlan.cobraOeTemplateCoverLetter;\n};\n\nexport const selectCobraPlanIds = (state: RootState): number[] => {\n return state\n .reEnrollmentChecklist\n .cobraReEnrollmentChecklistPlans\n .filter(p => !!p.planInProgressId)\n .map(p => p.planInProgressId) as number[];\n};\n\nexport const selectRedirectModalStatus = (state: RootState) => {\n return state.reEnrollmentChecklist.redirectModalStatus;\n};\n\nexport const selectCanShowOePackets = (state: RootState) => {\n const {\n cobraOeHandler = 0,\n cobraOeTemplateCoverLetter = false,\n checklistComplete = false,\n } = selectCobraPlan(state);\n\n const hasOptedToCreatePackets = cobraOeHandler === 1 || cobraOeTemplateCoverLetter;\n\n return checklistComplete && hasOptedToCreatePackets;\n};\n\nexport const selectCoverageTypesRequestStatus = (state: RootState) => {\n return state.reEnrollmentChecklist.fetchCoverageTypesRequestStatus;\n};\n\nexport const selectCoverageTypes = (state: RootState) => {\n return state.reEnrollmentChecklist.coverageTypes;\n};\n\nexport const selectPlanLevelDescriptionsStatus = (state: RootState) => {\n return state.reEnrollmentChecklist.fetchPlanLevelDescriptionsStatus;\n};\n\nexport const selectPlanLevelDescriptions = (state: RootState) => {\n return state.reEnrollmentChecklist.planLevelDescriptions;\n};\n\nexport const selectDeleteCobraInProgressPlanStatus = (state: RootState) => {\n return state.reEnrollmentChecklist.deleteCobraInProgressPlanStatus;\n};\n\nexport const selectSaveDirectBillChecklistStatus = (state: RootState) => {\n return state.reEnrollmentChecklist.saveDirectBillChecklistStatus;\n};\n\nexport const selectPlanRatesContinueIsDisabled = (state: RootState) => {\n const plans = selectUniqueCobraReEnrollmentChecklistPlans(state);\n\n return plans.length ? plans.some(p => p.ratesStatus === 'incomplete') : true;\n};\n\nexport const selectIsFinalizeCobraChecklistDisabled = (state: RootState) => {\n const planRatesContinueIsDisabled = selectPlanRatesContinueIsDisabled(state);\n const { eligibilitySectionComplete, oeOptionsSectionComplete } = selectCobraPlan(state);\n\n return anyPass<number>([\n always(!eligibilitySectionComplete),\n always(!oeOptionsSectionComplete),\n always(planRatesContinueIsDisabled),\n ])();\n};\n\nexport const selectDirectBillPlan = (state: RootState): DirectBillReEnrollmentChecklistPlan => {\n return (state.reEnrollmentChecklist.plans\n .find(plan => plan.type === 'directBill') ?? {}) as DirectBillReEnrollmentChecklistPlan;\n};\n\nexport const selectDirectBillOePlanYearStart = (state: RootState): number | undefined => {\n return viewLens(state.reEnrollmentChecklist.plans, 'planYearStart', 'directBill');\n};\n\nexport const selectDirectBillOeValidations = (state: RootState): PlanValidation => {\n return state.reEnrollmentChecklist.validations.find(t => t.type === 'directBill') ?? [] as PlanValidation;\n};\n","import { createAsyncThunk } from '@reduxjs/toolkit';\nimport { getHistoricalCobraPlans, getHistoricalDirectBillPlans } from 'shared/api/historicalRatesApi';\n\nexport let fetchRateHistory = createAsyncThunk(\n 'ratesHistory/fetchRatesHistory',\n (companyId: number) => {\n return getHistoricalCobraPlans(companyId);\n },\n);\n\nexport let fetchDirectBillRateHistory = createAsyncThunk(\n 'ratesHistory/fetchDirectBillRatesHistory',\n (companyId: number) => {\n return getHistoricalDirectBillPlans(companyId);\n },\n);\n","import request from '../api-request';\nimport { HistoricalPlanWithRatesResponse } from 'rates-history/rates-history.types';\n\nexport function getHistoricalCobraPlans(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get historical cobra plans for invalid company'));\n }\n const uri = `/api/companies/${companyId}/cobra-plan-rates`;\n\n return request<HistoricalPlanWithRatesResponse>(uri)\n .then(plans => plans ?? { plans: [], planYears: [] });\n}\n\nexport function getHistoricalDirectBillPlans(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get historical direct bill plans for invalid company'));\n }\n const uri = `/api/companies/${companyId}/retiree-plan-rates`;\n\n return request<HistoricalPlanWithRatesResponse>(uri)\n .then(plans => plans ?? { plans: [], planYears: [] });\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport dayjs from 'dayjs';\nimport { always, anyPass } from 'ramda';\nimport { RootState } from 'store/rootReducer';\nimport { fetchDirectBillRateHistory, fetchRateHistory } from 'rates-history/rates-history.thunk';\nimport { HistoricalPlanWithRates, PlanYear } from 'rates-history/rates-history.types';\nimport { ApiStatus } from 'shared/types/api-status.types';\n\nexport interface RatesHistorySlice {\n fetchCobraRatesHistoryStatus: ApiStatus;\n cobraPlans: HistoricalPlanWithRates[];\n cobraPlanYears: PlanYear[];\n fetchDirectBillRatesHistoryStatus: ApiStatus;\n directBillPlans: HistoricalPlanWithRates[];\n directBillPlanYears: PlanYear[];\n filteredCobraPlanYearId: number | null;\n filteredDirectBillPlanYearId: number | null;\n}\n\nexport const initialState: RatesHistorySlice = {\n fetchCobraRatesHistoryStatus: 'uninitialized',\n cobraPlans: [],\n cobraPlanYears: [],\n filteredCobraPlanYearId: null,\n fetchDirectBillRatesHistoryStatus: 'uninitialized',\n directBillPlans: [],\n directBillPlanYears: [],\n filteredDirectBillPlanYearId: null,\n};\n\nconst ratesHistorySlice = createSlice({\n name: 'ratesHistory',\n initialState,\n reducers: {\n cobraPlanYearFilterChanged(state, { payload }: PayloadAction<number>) {\n state.filteredCobraPlanYearId = payload;\n },\n directBillPlanYearFilterChanged(state, { payload }: PayloadAction<number>) {\n state.filteredDirectBillPlanYearId = payload;\n },\n },\n extraReducers: (builder) => {\n builder\n .addCase(fetchRateHistory.pending, (state) => {\n state.fetchCobraRatesHistoryStatus = 'pending';\n })\n .addCase(fetchRateHistory.rejected, (state) => {\n state.fetchCobraRatesHistoryStatus = 'rejected';\n })\n .addCase(fetchRateHistory.fulfilled, (state, action) => {\n state.fetchCobraRatesHistoryStatus = 'fulfilled';\n state.cobraPlans = action.payload.plans.map(p => ({ ...p, planType: 'cobra' }));\n state.cobraPlanYears = action.payload.planYears;\n })\n .addCase(fetchDirectBillRateHistory.pending, (state) => {\n state.fetchDirectBillRatesHistoryStatus = 'pending';\n })\n .addCase(fetchDirectBillRateHistory.rejected, (state) => {\n state.fetchDirectBillRatesHistoryStatus = 'rejected';\n })\n .addCase(fetchDirectBillRateHistory.fulfilled, (state, action) => {\n state.fetchDirectBillRatesHistoryStatus = 'fulfilled';\n state.directBillPlans = action.payload.plans.map(p => ({ ...p, planType: 'directBill' }));\n state.directBillPlanYears = action.payload.planYears;\n });\n },\n});\n\nexport const {\n cobraPlanYearFilterChanged,\n directBillPlanYearFilterChanged,\n} = ratesHistorySlice.actions;\n\nexport default ratesHistorySlice.reducer;\n\nexport const selectFetchCobraRatesHistoryStatus = (state: RootState) => {\n return state.historicalRates.fetchCobraRatesHistoryStatus;\n};\n\nexport const selectFetchDirectBillRatesHistoryStatus = (state: RootState) => {\n return state.historicalRates.fetchDirectBillRatesHistoryStatus;\n};\n\nexport const selectCobraHistoricalPlanYears = (state: RootState) => {\n return state.historicalRates.cobraPlanYears;\n};\n\nexport const selectDirectBillHistoricalPlanYears = (state: RootState) => {\n return state.historicalRates.directBillPlanYears;\n};\n\nexport const selectFilteredCobraPlanYear = (state: RootState) => {\n return state\n .historicalRates\n .cobraPlanYears\n .find(planYear => planYear.planYearId === state.historicalRates.filteredCobraPlanYearId) ?? null;\n};\n\nexport const selectFilteredDirectBillPlanYear = (state: RootState) => {\n return state\n .historicalRates\n .directBillPlanYears\n .find(planYear => planYear.planYearId === state.historicalRates.filteredDirectBillPlanYearId) ?? null;\n};\n\nconst removeNonMatchingPlanYears = (filteredPlanYear: PlanYear | null) => (\n acc: HistoricalPlanWithRates[],\n cur: HistoricalPlanWithRates,\n) => {\n const coverageTiers = cur.coverageTiers.map(t => ({\n ...t,\n tierRates: t.tierRates.filter(r => anyPass([\n always(filteredPlanYear === null),\n always(\n dayjs(r.rateBeginDate).isBefore(dayjs(filteredPlanYear?.planYearEnd))\n && dayjs(r.rateEndDate).isAfter(dayjs(filteredPlanYear?.planYearStart))),\n ])()),\n }));\n\n return [ ...acc, { ...cur, coverageTiers }];\n};\n\nexport const selectHistoricalCobraPlans = (state: RootState) => {\n const filteredPlanYear = selectFilteredCobraPlanYear(state);\n\n return state\n .historicalRates\n .cobraPlans\n .reduce(removeNonMatchingPlanYears(filteredPlanYear), []);\n};\n\nexport const selectHistoricalDirectBillPlans = (state: RootState) => {\n const filteredPlanYear = selectFilteredDirectBillPlanYear(state);\n\n return state\n .historicalRates\n .directBillPlans\n .reduce(removeNonMatchingPlanYears(filteredPlanYear), []);\n};\n","import { createAsyncThunk } from '@reduxjs/toolkit';\nimport { getHsaContributionNotForwardedStatuses } from 'shared/api/contributionStatusesApi';\n\nexport let fetchHsaContributionsNotForwarded = createAsyncThunk(\n 'actionItems/fetchContributionsNotForwarded',\n (companyId: number) => {\n return getHsaContributionNotForwardedStatuses(companyId);\n },\n);\n","import request from 'shared/api-request';\nimport {\n ContributionsNotForwarded,\n} from 'reports/shared/ContributionsNotForwardedTable/contributions-not-forwarded.types';\n\nexport function getHsaContributionNotForwardedStatuses(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get HSA contribution statuses for invalid company'));\n }\n const uri = `/api/companies/${companyId}/reports/hsa-contributions-not-forwarded/statuses`;\n\n return request<ContributionsNotForwarded[]>(uri)\n .then(statuses => statuses ?? []);\n}\n","import { ApiStatus } from 'shared/types/api-status.types';\nimport {\n ContributionsNotForwarded,\n} from 'reports/shared/ContributionsNotForwardedTable/contributions-not-forwarded.types';\nimport { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport {\n fetchHsaContributionsNotForwarded,\n} from 'action-items/action-items.thunks';\nimport { RootState } from 'store/rootReducer';\n\nexport interface ActionItemsSlice {\n fetchContributionsStatus: ApiStatus;\n hsaContributionsNotForwarded: ContributionsNotForwarded[];\n}\n\nexport const initialState: ActionItemsSlice = {\n fetchContributionsStatus: 'uninitialized',\n hsaContributionsNotForwarded: [],\n};\n\nconst actionItemsSlice = createSlice({\n name: 'actionItems',\n initialState,\n reducers: {\n setHsaContributionsNotForwarded(state, { payload }: PayloadAction<ContributionsNotForwarded[]>) {\n state.hsaContributionsNotForwarded = payload;\n },\n setContributionsStatus(state, { payload }: PayloadAction<ApiStatus>) {\n state.fetchContributionsStatus = payload;\n },\n },\n extraReducers: (builder) => {\n builder\n .addCase(fetchHsaContributionsNotForwarded.pending, (state) => {\n state.fetchContributionsStatus = 'pending';\n })\n .addCase(fetchHsaContributionsNotForwarded.rejected, (state) => {\n state.fetchContributionsStatus = 'rejected';\n })\n .addCase(fetchHsaContributionsNotForwarded.fulfilled, (state, action) => {\n state.fetchContributionsStatus = 'fulfilled';\n state.hsaContributionsNotForwarded = action.payload;\n });\n },\n});\n\nexport const {\n setHsaContributionsNotForwarded,\n setContributionsStatus,\n} = actionItemsSlice.actions;\n\nexport default actionItemsSlice.reducer;\n\nexport const selectContributionsNotForwardedCount = (state: RootState) => {\n return state.actionItems.hsaContributionsNotForwarded\n .reduce((acc, curr) => acc + curr.contributions.length, 0);\n};\n\nexport const selectContributionsNotForwarded = (state: RootState) => {\n return state.actionItems.hsaContributionsNotForwarded;\n};\n\nexport const selectContributionsNotForwardedFetchStatus = (state: RootState) => {\n return state.actionItems.fetchContributionsStatus;\n};\n\nexport const selectShowActionItemsSection = (state: RootState) => {\n return selectContributionsNotForwardedCount(state) > 0;\n};\n","import { createAsyncThunk } from '@reduxjs/toolkit';\nimport { getDependents } from 'shared/api/dependentsApi';\nimport { RootState } from 'store/rootReducer';\n\nexport let fetchDependentsForParticipant = createAsyncThunk(\n 'dependents/fetchDependentsForParticipant',\n (_, thunkAPI) => {\n const state = thunkAPI.getState() as RootState;\n const { compid: companyId } = state.companies.selectedCompany ?? { compid: 0 };\n const { empno: participantNumber } = state.participant.selected ?? { empno: '' };\n\n return getDependents(companyId, participantNumber);\n },\n);\n\n","import { createSlice } from '@reduxjs/toolkit';\nimport { Dependent } from 'shared/types/non-plan-year.types';\nimport { fetchDependentsForParticipant } from 'store/slices/dependents/dependents.thunk';\nimport { ApiStatus } from 'shared/types/api-status.types';\nimport { RootState } from 'store/rootReducer';\n\nexport interface DependentsSlice {\n dependents: Dependent[];\n fetchDependentsForParticipantStatus: ApiStatus;\n}\n\nexport const initialState: DependentsSlice = {\n dependents: [],\n fetchDependentsForParticipantStatus: 'uninitialized',\n};\n\nconst dependentsSlice = createSlice({\n name: 'dependentsSlice',\n initialState,\n reducers: {\n resetDependents(state) {\n state.fetchDependentsForParticipantStatus = 'uninitialized';\n state.dependents = [];\n },\n },\n extraReducers: (builder) => {\n builder\n .addCase(fetchDependentsForParticipant.pending, (state) => {\n state.fetchDependentsForParticipantStatus = 'pending';\n })\n .addCase(fetchDependentsForParticipant.rejected, (state) => {\n state.fetchDependentsForParticipantStatus = 'rejected';\n })\n .addCase(fetchDependentsForParticipant.fulfilled, (state, action) => {\n state.fetchDependentsForParticipantStatus = 'fulfilled';\n state.dependents = action.payload ?? [];\n });\n },\n});\n\nexport const { resetDependents } = dependentsSlice.actions;\n\nexport default dependentsSlice.reducer;\n\nexport const selectDependents = (state: RootState) => {\n return state.dependents.dependents;\n};\n\n","import { createAsyncThunk } from '@reduxjs/toolkit';\nimport { RootState } from 'store/rootReducer';\nimport { getDirectDebitAccounts } from 'shared/api/directDebitAccountsApi';\n\nexport let fetchDirectDebitAccount = createAsyncThunk(\n 'directDebit/fetchDirectDebitAccount',\n (_, thunkAPI) => {\n const state = thunkAPI.getState() as RootState;\n const { compid: companyId } = state.companies.selectedCompany ?? { compid: 0 };\n\n return getDirectDebitAccounts(companyId);\n },\n);\n\n","import { DirectDebitAccount } from 'shared/types/direct-debit-accounts.types';\nimport request from 'shared/api-request';\n\nexport function getDirectDebitAccounts(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load direct debit accounts for invalid company.'));\n }\n\n return request<DirectDebitAccount[]>(`/api/companies/${companyId}/direct-debit-accounts`);\n}\n\nexport function payAdminInvoice(companyId: number, invoiceNumber: number, cddId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot pay invoice for invalid company.'));\n }\n\n if (invoiceNumber < 0) {\n return Promise.reject(new Error('Cannot pay invoice for invalid invoice number.'));\n }\n\n if (cddId < 0) {\n return Promise.reject(new Error('Cannot pay invoice for invalid account ID.'));\n }\n\n return request(\n `/api/companies/${companyId}/administrative-billing/pay-admin-invoice`,\n { method: 'POST', body: { invoiceNumber, cddId } },\n );\n}\n","import { createSlice } from '@reduxjs/toolkit';\nimport { ApiStatus } from 'shared/types/api-status.types';\nimport { RootState } from 'store/rootReducer';\nimport { DirectDebitAccount } from 'shared/types/direct-debit-accounts.types';\nimport { fetchDirectDebitAccount } from 'store/slices/direct-debit/direct-debit.thunk';\n\nexport interface DirectDebitSlice {\n directDebitAccounts: DirectDebitAccount[] | null;\n fetchDirectDebitAccountStatus: ApiStatus;\n}\n\nexport const initialState: DirectDebitSlice = {\n directDebitAccounts: null,\n fetchDirectDebitAccountStatus: 'uninitialized',\n};\n\nconst directDebitSlice = createSlice({\n name: 'directDebitSlice',\n initialState,\n reducers: {\n resetDirectDebit(state) {\n state.directDebitAccounts = [];\n state.fetchDirectDebitAccountStatus = 'uninitialized';\n },\n },\n extraReducers: (builder) => {\n builder\n .addCase(fetchDirectDebitAccount.pending, (state) => {\n state.fetchDirectDebitAccountStatus = 'pending';\n })\n .addCase(fetchDirectDebitAccount.rejected, (state) => {\n state.fetchDirectDebitAccountStatus = 'rejected';\n })\n .addCase(fetchDirectDebitAccount.fulfilled, (state, action) => {\n state.fetchDirectDebitAccountStatus = 'fulfilled';\n state.directDebitAccounts = action.payload;\n });\n },\n});\n\nexport const { resetDirectDebit } = directDebitSlice.actions;\n\nexport default directDebitSlice.reducer;\n\nexport const selectDirectDebitAccounts = (state: RootState) => {\n return state.directDebit.directDebitAccounts;\n};\n\nexport const selectFetchDirectDebitAccountStatus = (state: RootState) => {\n return state.directDebit.fetchDirectDebitAccountStatus;\n};\n","import request, { ContentType } from 'shared/api-request';\nimport {\n FmlaCompanyIdAndDates,\n FmlaCompanyIdDatesAndReportType,\n} from 'reports/fmla/fmla-report-types';\n\nexport function getAllFmlaReportsCountsForDashboard(reportData: FmlaCompanyIdAndDates) {\n if (reportData.compid === 0) {\n return Promise.reject(new Error('Cannot retrieve FMLA data for invalid company'));\n }\n\n return Promise.allSettled([\n getReportCount({ ...reportData, reportType: 'open-cases' }),\n getReportCount({ ...reportData, reportType: 'intermittent-leave-cases' }),\n getReportCount({ ...reportData, reportType: 'action-needed' }),\n getReportCount({ ...reportData, reportType: 'rtw-confirmation-needed' }),\n ]).then(([\n allOpenLeaveCaseListCount,\n intermittentLeaveCaseListCount,\n pendingInfoCount,\n returnToWorkConfirmationCount,\n ]) => {\n return {\n allOpenLeaveCaseListCount: allSettledUnwrap(allOpenLeaveCaseListCount),\n intermittentLeaveCaseListCount: allSettledUnwrap(intermittentLeaveCaseListCount),\n pendingInfoCount: allSettledUnwrap(pendingInfoCount),\n returnToWorkConfirmationCount: allSettledUnwrap(returnToWorkConfirmationCount),\n };\n });\n}\n\nexport function getAllDateFilterableFmlaReports(reportData: FmlaCompanyIdAndDates) {\n if (reportData.compid === 0) {\n return Promise.reject(new Error('Cannot retrieve FMLA data for invalid company'));\n }\n\n return Promise.allSettled([\n getReportCount({ ...reportData, reportType: 'all-absences' }),\n getReportCount({ ...reportData, reportType: 'usage-totals' }),\n getReportCount({ ...reportData, reportType: 'all-leave-cases' }),\n ]).then(([\n allAbsencesListCount,\n usageTotalsCount,\n allLeaveCases,\n ]) => {\n return {\n allAbsencesListCount: allSettledUnwrap(allAbsencesListCount),\n usageTotalsCount: allSettledUnwrap(usageTotalsCount),\n allLeaveCases: allSettledUnwrap(allLeaveCases),\n };\n });\n}\n\nexport function downloadFmlaExcel({\n compid,\n reportType,\n startDate = '',\n endDate = '',\n}: FmlaCompanyIdDatesAndReportType) {\n if (compid === 0) {\n return Promise.reject(new Error('Cannot retrieve FMLA data for invalid company'));\n }\n\n const uri = `api/companies/${compid}/fmla/reports/${reportType}/xlsx`;\n\n return request(\n uri,\n {\n method: 'GET',\n headers: { accept: ContentType.XLSX },\n queryParams: {\n startDate,\n endDate,\n },\n });\n}\n\nfunction getReportCount({\n compid,\n reportType,\n endDate = '',\n startDate = '',\n}: FmlaCompanyIdDatesAndReportType) {\n const uri = `api/companies/${compid}/fmla/reports/${reportType}/count`;\n\n return request<number>(\n uri,\n {\n method: 'GET',\n queryParams: {\n startDate,\n endDate,\n },\n });\n}\n\nconst allSettledUnwrap = (res: PromiseSettledResult<number | null>): number | null => {\n return res.status === 'fulfilled'\n ? res.value\n : null;\n};\n","import { createAsyncThunk } from '@reduxjs/toolkit';\nimport {\n getAllDateFilterableFmlaReports,\n getAllFmlaReportsCountsForDashboard,\n} from 'shared/api/fmlaReportsApi';\n\nexport const fetchFMLAReportCountsForDashboard = createAsyncThunk(\n 'fmla-reports/fetchFMLAReportCountsForDashboard',\n getAllFmlaReportsCountsForDashboard,\n);\n\nexport const fetchDateFilterableFmlaReports = createAsyncThunk(\n 'fmla-reports/fetchDateFilterableFmlaReports',\n getAllDateFilterableFmlaReports,\n);\n\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { FmlaReportCounts } from 'reports/fmla/fmla-report-types';\nimport { ApiStatus } from 'shared/types/api-status.types';\nimport {\n fetchDateFilterableFmlaReports,\n fetchFMLAReportCountsForDashboard,\n} from 'reports/fmla/fmla-reports.thunks';\nimport { RootState } from 'store/rootReducer';\n\nexport interface FMLAReportsState {\n dateRangeStart: string;\n dateRangeEnd: string;\n fmlaReportCounts: FmlaReportCounts;\n nonFilterableFmlaReportCountsStatus: ApiStatus;\n filterableFmlaReportCountsStatus: ApiStatus;\n}\n\nexport const initialState: FMLAReportsState = {\n dateRangeStart: '',\n dateRangeEnd: '',\n fmlaReportCounts: {\n allOpenLeaveCaseListCount: null,\n intermittentLeaveCaseListCount: null,\n pendingInfoCount: null,\n returnToWorkConfirmationCount: null,\n allAbsencesListCount: null,\n usageTotalsCount: null,\n allLeaveCases: null,\n },\n nonFilterableFmlaReportCountsStatus: 'uninitialized',\n filterableFmlaReportCountsStatus: 'uninitialized',\n};\n\nconst FMLAReportsSlice = createSlice({\n name: 'fmlaReports',\n initialState,\n reducers: {\n setFMLADateRange(state, { payload }: PayloadAction<{start: string; end: string;}>) {\n state.dateRangeStart = payload.start;\n state.dateRangeEnd = payload.end;\n state.fmlaReportCounts = {\n ...state.fmlaReportCounts,\n allAbsencesListCount: null,\n usageTotalsCount: null,\n allLeaveCases: null,\n };\n },\n },\n extraReducers: (builder) => {\n builder.addCase(fetchFMLAReportCountsForDashboard.pending, (state) => {\n state.nonFilterableFmlaReportCountsStatus = 'pending';\n state.fmlaReportCounts = { ...state.fmlaReportCounts,\n allAbsencesListCount: null,\n usageTotalsCount: null,\n allLeaveCases: null,\n };\n });\n builder.addCase(fetchFMLAReportCountsForDashboard.rejected, (state) => {\n state.nonFilterableFmlaReportCountsStatus = 'rejected';\n });\n builder.addCase(fetchFMLAReportCountsForDashboard.fulfilled, (state, action) => {\n state.nonFilterableFmlaReportCountsStatus = 'fulfilled';\n state.fmlaReportCounts = { ...state.fmlaReportCounts, ...action.payload };\n });\n builder.addCase(fetchDateFilterableFmlaReports.pending, (state) => {\n state.filterableFmlaReportCountsStatus = 'pending';\n state.fmlaReportCounts = {\n ...state.fmlaReportCounts,\n allAbsencesListCount: null,\n usageTotalsCount: null,\n allLeaveCases: null,\n };\n });\n builder.addCase(fetchDateFilterableFmlaReports.rejected, (state) => {\n state.filterableFmlaReportCountsStatus = 'rejected';\n });\n builder.addCase(fetchDateFilterableFmlaReports.fulfilled, (state, action) => {\n state.filterableFmlaReportCountsStatus = 'fulfilled';\n state.fmlaReportCounts = { ...state.fmlaReportCounts, ...action.payload };\n });\n },\n});\n\nexport const {\n setFMLADateRange,\n} = FMLAReportsSlice.actions;\n\nexport default FMLAReportsSlice.reducer;\n\nexport const selectStartAndEndDateRange = (state: RootState): {startDate: string; endDate: string;} => {\n return { startDate: state.fmlaReports.dateRangeStart, endDate: state.fmlaReports.dateRangeEnd };\n};\n\nexport const selectReportsCounts = (state: RootState): FmlaReportCounts => state\n .fmlaReports\n .fmlaReportCounts;\n\nexport const selectNonFilterableFetchFmlaReportCountsStatus = (state: RootState) => {\n return state.fmlaReports.nonFilterableFmlaReportCountsStatus;\n};\n","import { createAsyncThunk } from '@reduxjs/toolkit';\nimport {\n getEmployeeById,\n getCasesSummaryByEmployeeId,\n getLeaveCaseByCaseId,\n getAbsencesByEmployeeId,\n getEmployeeSearchResultsByCriteria,\n} from 'shared/api/leaveRecordsApi';\n\nexport const fetchEmployeeDetails = createAsyncThunk(\n 'leaveRecords/fetchEmployeeDetails',\n getEmployeeById,\n);\n\nexport const fetchCasesSummary = createAsyncThunk(\n 'leaveRecords/fetchCasesSummary',\n getCasesSummaryByEmployeeId,\n);\n\nexport const fetchCaseDetails = createAsyncThunk(\n 'leaveRecords/fetchCaseDetails',\n getLeaveCaseByCaseId,\n);\n\nexport const fetchEmployeeAbsences = createAsyncThunk(\n 'leaveRecords/fetchEmployeeAbsences',\n getAbsencesByEmployeeId,\n);\n\nexport const fetchEmployeeSearchResultsByCriteria = createAsyncThunk(\n 'leaveRecords/fetchEmployeeSearchResultsByCriteria',\n getEmployeeSearchResultsByCriteria,\n);\n","import request from 'shared/api-request';\nimport {\n EmployeeSearchResults,\n LeaveRecordsAbsenceSummary,\n LeaveRecordCaseInfo,\n LeaveRecordCaseSummary,\n LeaveRecordsEmployeeInfo,\n} from 'leave-records/leaveRecord.types';\n\nexport function getEmployeeById(\n { companyId, eeId }: {companyId: number; eeId: string;}) {\n if (companyId === 0) {\n return Promise.reject(new Error('Cannot get employee details for invalid company.'));\n }\n const uri = `api/companies/${companyId}/fmla/employee/detail/${eeId}`;\n\n return request<LeaveRecordsEmployeeInfo>(uri);\n}\n\nexport function getCasesSummaryByEmployeeId(\n { companyId, eeId }: {companyId: number; eeId: string;}) {\n if (companyId === 0) {\n return Promise.reject(new Error('Cannot get leave cases for invalid company.'));\n }\n\n const uri = `api/companies/${companyId}/fmla/leave/cases/employee/${eeId}`;\n\n return request<LeaveRecordCaseSummary[]>(uri);\n}\n\nexport function getLeaveCaseByCaseId(\n { companyId, caseId }: {companyId: number; caseId: string;}) {\n if (companyId === 0) {\n return Promise.reject(new Error('Cannot get leave case for invalid company.'));\n }\n\n const uri = `api/companies/${companyId}/fmla/leave/case/${caseId}`;\n\n return request<LeaveRecordCaseInfo>(uri);\n}\n\nexport function getAbsencesByEmployeeId(\n { companyId, eeId }: {companyId: number; eeId: string;}) {\n if (companyId === 0) {\n return Promise.reject(new Error('Cannot get absences for invalid company.'));\n }\n\n const uri = `api/companies/${companyId}/fmla/absence/employee/${eeId}`;\n\n return request<LeaveRecordsAbsenceSummary[]>(uri);\n}\n\nexport function getEmployeeSearchResultsByCriteria(\n { companyId, criteria }: {companyId: number; criteria: string;}) {\n if (companyId === 0) {\n return Promise.reject(new Error('Cannot get search results for invalid company.'));\n }\n\n const uri = `api/companies/${companyId}/fmla/employee/search`;\n\n return request<EmployeeSearchResults[]>(uri, {\n queryParams: {\n criteria,\n rows: '10',\n offset: '0',\n },\n method: 'GET',\n });\n}\n","import { ApiStatus } from 'shared/types/api-status.types';\nimport { createSlice } from '@reduxjs/toolkit';\nimport {\n __,\n compose,\n dropLast,\n gt,\n identity,\n ifElse,\n insert,\n length,\n without,\n} from 'ramda';\nimport {\n EmployeeSearchResults,\n LeaveRecordCaseInfo,\n LeaveRecordCaseSummary,\n LeaveRecordCaseSummaryAndName,\n LeaveRecordsAbsenceSummary,\n LeaveRecordsEmployeeInfo,\n} from 'leave-records/leaveRecord.types';\nimport {\n fetchCaseDetails,\n fetchCasesSummary,\n fetchEmployeeAbsences,\n fetchEmployeeDetails,\n fetchEmployeeSearchResultsByCriteria,\n} from 'leave-records/leave-records.thunk';\nimport { RootState } from 'store/rootReducer';\n\nexport interface LeaveRecordsState {\n employeeDetailsStatus: ApiStatus;\n casesSummaryStatus: ApiStatus;\n caseDetailsStatus: ApiStatus;\n employeeAbsencesStatus: ApiStatus;\n employeeSearchStatus: ApiStatus;\n employeeDetails: LeaveRecordsEmployeeInfo | null;\n caseDetails: LeaveRecordCaseInfo | null;\n casesSummary: LeaveRecordCaseSummary[];\n employeeAbsences: LeaveRecordsAbsenceSummary[];\n employeeSearchResults: EmployeeSearchResults[];\n recentlyViewedEmployeeAbsences: LeaveRecordCaseSummaryAndName[];\n}\n\nexport const initialState: LeaveRecordsState = {\n employeeDetailsStatus: 'uninitialized',\n casesSummaryStatus: 'uninitialized',\n caseDetailsStatus: 'uninitialized',\n employeeAbsencesStatus: 'uninitialized',\n employeeSearchStatus: 'uninitialized',\n employeeDetails: null,\n caseDetails: null,\n casesSummary: [],\n employeeAbsences: [],\n employeeSearchResults: [],\n recentlyViewedEmployeeAbsences: [],\n};\n\nconst LeaveRequestsSlice = createSlice({\n name: 'leaveRecords',\n initialState,\n reducers: {\n resetLeaveRecordsApiStatus(state) {\n state.employeeDetailsStatus = initialState.employeeDetailsStatus;\n state.casesSummaryStatus = initialState.casesSummaryStatus;\n state.caseDetailsStatus = initialState.caseDetailsStatus;\n state.employeeAbsencesStatus = initialState.employeeAbsencesStatus;\n state.employeeSearchStatus = initialState.employeeSearchStatus;\n state.employeeSearchResults = [];\n },\n getRecentlyViewedFromLocalStorage(state) {\n state\n .recentlyViewedEmployeeAbsences = JSON\n .parse(window.localStorage.getItem('leaveSolutionsRecentlyViewed') ?? '[]');\n },\n updateRecentlyViewed(state, action) {\n const updated = compose(\n ifElse(\n compose(gt(__, 10), length),\n dropLast(1),\n identity,\n ),\n insert(0, action.payload),\n without([ action.payload ]),\n )(state.recentlyViewedEmployeeAbsences);\n\n state.recentlyViewedEmployeeAbsences = updated;\n localStorage.setItem('leaveSolutionsRecentlyViewed', JSON.stringify(updated));\n },\n },\n extraReducers: (builder) => {\n builder.addCase(fetchEmployeeDetails.pending, (state) => {\n state.employeeDetailsStatus = 'pending';\n });\n builder.addCase(fetchEmployeeDetails.rejected, (state) => {\n state.employeeDetailsStatus = 'rejected';\n });\n builder.addCase(fetchEmployeeDetails.fulfilled, (state, action) => {\n state.employeeDetailsStatus = 'fulfilled';\n state.employeeDetails = action.payload ?? null;\n });\n\n builder.addCase(fetchCasesSummary.pending, (state) => {\n state.casesSummaryStatus = 'pending';\n });\n builder.addCase(fetchCasesSummary.rejected, (state) => {\n state.casesSummaryStatus = 'rejected';\n });\n builder.addCase(fetchCasesSummary.fulfilled, (state, action) => {\n state.casesSummaryStatus = 'fulfilled';\n state.casesSummary = action.payload ?? [];\n });\n builder.addCase(fetchCaseDetails.pending, (state) => {\n state.caseDetailsStatus = 'pending';\n });\n builder.addCase(fetchCaseDetails.rejected, (state) => {\n state.caseDetailsStatus = 'rejected';\n });\n builder.addCase(fetchCaseDetails.fulfilled, (state, action) => {\n state.caseDetailsStatus = 'fulfilled';\n state.caseDetails = action.payload ?? null;\n });\n\n builder.addCase(fetchEmployeeAbsences.pending, (state) => {\n state.employeeAbsencesStatus = 'pending';\n });\n builder.addCase(fetchEmployeeAbsences.rejected, (state) => {\n state.employeeAbsencesStatus = 'rejected';\n });\n builder.addCase(fetchEmployeeAbsences.fulfilled, (state, action) => {\n state.employeeAbsencesStatus = 'fulfilled';\n state.employeeAbsences = action.payload ?? [];\n });\n builder.addCase(fetchEmployeeSearchResultsByCriteria.pending, (state) => {\n state.employeeSearchStatus = 'pending';\n state.employeeSearchResults = [];\n });\n builder.addCase(fetchEmployeeSearchResultsByCriteria.rejected, (state, { meta }) => {\n // this happens when changing search while it's pending\n if (meta.aborted) {\n state.employeeSearchStatus = 'pending';\n } else {\n state.employeeSearchStatus = 'rejected';\n state.employeeSearchResults = [];\n }\n });\n builder.addCase(fetchEmployeeSearchResultsByCriteria.fulfilled, (state, action) => {\n state.employeeSearchStatus = 'fulfilled';\n state.employeeSearchResults = action.payload ?? [];\n });\n },\n});\n\nexport const {\n resetLeaveRecordsApiStatus,\n getRecentlyViewedFromLocalStorage,\n updateRecentlyViewed,\n} = LeaveRequestsSlice.actions;\n\nexport default LeaveRequestsSlice.reducer;\n\nexport const selectEmployeeDetailsStatus = (state: RootState) => {\n return state.leaveRecords.employeeDetailsStatus;\n};\n\nexport const selectCasesSummaryStatus = (state: RootState) => {\n return state.leaveRecords.casesSummaryStatus;\n};\n\nexport const selectCaseDetailsStatus = (state: RootState) => {\n return state.leaveRecords.caseDetailsStatus;\n};\n\nexport const selectEmployeeAbsencesStatus = (state: RootState) => {\n return state.leaveRecords.employeeAbsencesStatus;\n};\n\nexport const selectEmployeeDetails = (state: RootState) => {\n return state.leaveRecords.employeeDetails;\n};\n\nexport const selectCasesSummary = (state: RootState) => {\n return state.leaveRecords.casesSummary;\n};\n\nexport const selectCaseDetails = (state: RootState) => {\n return state.leaveRecords.caseDetails;\n};\n\nexport const selectEmployeeAbsences = (state: RootState) => {\n return state.leaveRecords.employeeAbsences;\n};\n\nexport const selectEmployeeSearchResultsStatus = (state: RootState) => {\n return state.leaveRecords.employeeSearchStatus;\n};\n\nexport const selectEmployeeSearchResults = (state: RootState) => {\n return state.leaveRecords.employeeSearchResults;\n};\n\nexport const selectRecentlyViewedEmployeeAbsences = (state: RootState) => {\n return state.leaveRecords.recentlyViewedEmployeeAbsences;\n};\n","import { combineReducers } from 'redux';\n\n// import slices here\nimport companyReducer, { initialState as companyState }\n from 'companies/companies.slice';\nimport notificationReducer, { initialState as notificationState }\n from 'notifications/notifications.slice';\nimport cobraQeReducer, { initialState as cobraQeState }\n from 'enter-cobra-qe/cobra-qe.slice';\nimport participantReducer, { initialState as participantState } from 'participant-search/participant.slice';\nimport planEnrollmentReducer, { initialState as planEnrollmentState } from 'plan-enrollment/plan-enrollment.slice';\nimport appSettingsReducer, { initialState as appSettingsState } from 'components/app-settings.slice';\nimport enrollmentsReducer, {\n initialState as enrollmentsState,\n}\n from 'participant-overview/enrollment/enrollments.slice';\nimport participantOverviewReducer, {\n initialState as participantOverviewInitialState,\n} from 'participant-overview/participant-overview.slice';\nimport directBillingQeReducer, { initialState as directBillingQeState } from 'direct-billing/direct-billing.slice';\nimport manageUsersReducer, { initialState as manageUsersState } from 'manage-settings/manage-users/manage-users.slice';\nimport enrollmentResourcesReducer, {\n initialState as enrollmentResourcesState,\n} from 'open-enrollment-resources/open-enrollment-resources.slice';\nimport fileHistoryReducer, { initialState as fileHistoryState } from 'file-history/file-history.slice';\nimport slideshowReducer, {\n initialState as slideshowState,\n} from 'marketing-info-tile/slideshow.slice';\nimport reportHistoryReducer, { initialState as reportHistoryState } from 'report-history/report-history.slice';\nimport cobraPendingInitialNoticesReducer, {\n initialState as cobraPendingInitialNoticesState,\n} from 'cobra-pending-initial/cobra-pending-initial-notices.slice';\nimport contactInfoReducer, {\n initialState as contactInfoState,\n} from 'manage-settings/contact-info/contact-info.slice';\nimport cobraPendingQeNoticesReducer, {\n initialState as cobraPendingQeNoticesState,\n} from 'cobra-pending-qe/cobra-pending-qe-notices.slice';\nimport reportsReducer, {\n initialState as reportsInitialState,\n} from 'reports/reports.slice';\nimport customReportsReducer, {\n initialState as customReportsInitialState,\n} from 'reports/custom/custom-reports.slice';\nimport reEnrollmentReducer, {\n initialState as reEnrollmentInitialState,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport ratesHistoryReducer, {\n initialState as ratesHistoryInitialState,\n} from 'rates-history/rates-history.slice';\nimport actionItemsReducer, {\n initialState as actionItemsInitialState,\n} from 'action-items/action-items.slice';\n\nimport dependentsReducer, {\n initialState as dependentsInitialState,\n} from 'store/slices/dependents/dependents.slice';\nimport directDebitReducer, {\n initialState as directDebitInitialState,\n} from 'store/slices/direct-debit/direct-debit.slice';\nimport fmlaReportsReducer, {\n initialState as fmlaInitialState,\n} from 'reports/fmla/fmla-reports-slice';\nimport leaveRecordReducer, {\n initialState as leaveRecordInitialState,\n} from 'leave-records/leave-records.slice';\n\nconst rootReducer = combineReducers({\n // and add slices here\n companies: companyReducer,\n notifications: notificationReducer,\n cobraQe: cobraQeReducer,\n participant: participantReducer,\n planEnrollment: planEnrollmentReducer,\n appSettings: appSettingsReducer,\n enrollments: enrollmentsReducer,\n directBillingQe: directBillingQeReducer,\n manageUsers: manageUsersReducer,\n enrollmentResources: enrollmentResourcesReducer,\n participantOverview: participantOverviewReducer,\n fileHistory: fileHistoryReducer,\n slideshow: slideshowReducer,\n reportHistory: reportHistoryReducer,\n cobraPendingInitialNotices: cobraPendingInitialNoticesReducer,\n contactInfo: contactInfoReducer,\n cobraPendingQeNotices: cobraPendingQeNoticesReducer,\n reports: reportsReducer,\n customReports: customReportsReducer,\n reEnrollmentChecklist: reEnrollmentReducer,\n historicalRates: ratesHistoryReducer,\n actionItems: actionItemsReducer,\n dependents: dependentsReducer,\n directDebit: directDebitReducer,\n fmlaReports: fmlaReportsReducer,\n leaveRecords: leaveRecordReducer,\n});\n\nexport type RootState = ReturnType<typeof rootReducer>;\n\nexport const rootInitialState: RootState = {\n // add slice initial states here\n companies: companyState,\n notifications: notificationState,\n cobraQe: cobraQeState,\n participant: participantState,\n planEnrollment: planEnrollmentState,\n appSettings: appSettingsState,\n enrollments: enrollmentsState,\n directBillingQe: directBillingQeState,\n manageUsers: manageUsersState,\n enrollmentResources: enrollmentResourcesState,\n participantOverview: participantOverviewInitialState,\n fileHistory: fileHistoryState,\n slideshow: slideshowState,\n reportHistory: reportHistoryState,\n cobraPendingInitialNotices: cobraPendingInitialNoticesState,\n contactInfo: contactInfoState,\n cobraPendingQeNotices: cobraPendingQeNoticesState,\n reports: reportsInitialState,\n customReports: customReportsInitialState,\n reEnrollmentChecklist: reEnrollmentInitialState,\n historicalRates: ratesHistoryInitialState,\n actionItems: actionItemsInitialState,\n dependents: dependentsInitialState,\n directDebit: directDebitInitialState,\n fmlaReports: fmlaInitialState,\n leaveRecords: leaveRecordInitialState,\n};\n\nexport default rootReducer;\n","import { logToServer } from 'shared/api/companiesApi';\n\nfunction serverLogger ({ getState }: any) {\n return (next: any) => (action: any) => {\n const compid = getState().companies?.selectedCompany?.compid;\n\n if (compid) {\n logToServer(compid, {\n scope: 'redux',\n level: 'info',\n message: JSON.stringify(action),\n });\n }\n\n if (action) {\n return next(action);\n }\n };\n}\n\nexport default serverLogger;\n","function syncCompanyLocalStorage () {\n return (next: any) => (action: any) => {\n if (action.type === 'companies/setSelectedCompany') {\n const stringified = JSON.stringify(action.payload);\n\n if (localStorage.getItem('company') !== stringified) {\n localStorage.setItem('company', stringified);\n }\n }\n\n if (action) {\n return next(action);\n }\n };\n}\n\nexport default syncCompanyLocalStorage;\n","function yupErrorsToObject(errors: string[]) {\n return errors.reduce((acc: Record<string, any>,cur: string) => {\n let [ property, ...message ] = cur.split(' ');\n acc[property] = message.join(' ');\n\n return acc;\n }, {} as Record<string, any>);\n}\n\nexport default yupErrorsToObject;\n","import * as yup from 'yup';\nimport dayjs from 'dayjs';\n\nexport default yup.object({\n type: yup.string(),\n planYearStart: yup.string(),\n cobraOeSendPackets: yup\n .date()\n .typeError('cobraOeSendPackets Please enter a valid date')\n .required()\n .when('planYearStart', (planYearStart: string | null, sch: any) => {\n return sch.test({\n test: (cobraOeSendPackets: Date | null) => {\n return !!cobraOeSendPackets\n && dayjs(cobraOeSendPackets).diff(dayjs().format('MM/DD/YYYY'), 'days') >= 14;\n },\n message: 'cobraOeSendPackets Packet send date must be two weeks or more from the current date',\n });\n }),\n cobraOeResponseDeadline: yup\n .date()\n .typeError('cobraOeResponseDeadline Please enter a valid date')\n .required()\n .when('cobraOeSendPackets', (cobraOeSendPackets: Date | null, sch: any) => {\n return sch.test({\n test: (cobraOeResponseDeadline: Date | null) => !!cobraOeSendPackets && !!cobraOeResponseDeadline && (\n dayjs(cobraOeResponseDeadline).diff(dayjs(cobraOeSendPackets), 'days') >= 14\n && dayjs(cobraOeResponseDeadline).isAfter(cobraOeSendPackets)\n ),\n message: 'cobraOeResponseDeadline Deadline must be more than 14 days after send by date',\n });\n }),\n});\n","import { identity } from 'ramda';\nimport {\n selectCobraPlan, selectCobraOePlanYearStart,\n setCobraOeValidations,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport { noop } from 'shared/utils';\nimport yupErrorsToObject from 'store/middleware/validators/utils/yupErrorsToObject';\nimport validationSchema from 're-enrollment-checklist/cobra/cover-letter/cobraOePacket.validators';\nimport store from 'store';\n\nexport const validate = (appStore: typeof store) => (next: any) => async (action: any) => {\n if (action) {\n next(action);\n }\n\n if (\n action.type.includes('reEnrollmentChecklist/setCobra')\n && !action.type.includes('reEnrollmentChecklist/setCobraOeValidations')\n ) {\n const state = appStore.getState();\n const cobraPlan = selectCobraPlan(state);\n const validations = await validationSchema\n .validate(cobraPlan, { stripUnknown: true, abortEarly: false })\n .then(noop)\n .catch(identity);\n\n const validation = yupErrorsToObject(validations?.errors ?? []);\n const planYearStart = selectCobraOePlanYearStart(state);\n appStore.dispatch(setCobraOeValidations({\n type: 'cobra',\n planYearStart,\n ...validation,\n }));\n }\n};\n","import store from 'store';\nimport { validate } from 're-enrollment-checklist/cobra/cover-letter/cobraOePacket.middleware';\n\nexport function validateCobraPlans(): any {\n return (next: any) => async (action: any) => {\n return validate(store)(next)(action);\n };\n}\n","import * as yup from 'yup';\nimport { isEmpty, isNil, T, ifElse, equals, compose, either, always, not, includes, complement } from 'ramda';\nimport { InsurerUpdateMethod } from './cobra-re-enrollment.types';\n\nexport const cobraChecklistPlanErrorMessages = {\n planName: {\n required: 'Plan Name is required',\n },\n carrier: {\n required: 'Carrier/Provider is required',\n },\n newCarrierName: {\n required: 'If your Insurer is not listed, you must provide a Carrier Name',\n max: 'Carrier/Provider must be 30 characters or less',\n },\n planTypeId: {\n required: 'Type of Coverage is required',\n },\n planTypeDescription: {\n required: 'If Coverage Type is \"Other\", you must provide a description',\n },\n carrierUpdateMethod: {\n required: 'Carrier update method is required',\n invalid: 'Carrier update method is invalid',\n },\n carrierUpdateMethodNotes: {\n required: 'Details must be provided when \"Other\" is selected for the carrier update method',\n },\n planPolicyNumber: {\n required: 'Policy Number must be provided when \"Insurer via Flores\" is selected for the carrier update method',\n max: 'Policy Number must be 20 characters or less',\n },\n carrierContactName: {\n required: 'Contact name is required',\n },\n carrierContactEmail: {\n required: 'Contact email is required',\n invalid: 'Contact email must be a valid email address',\n duplicate: 'Email address is a duplicate',\n },\n carrierContactPhone: {\n min: 'Contact phone number must be 10 numbers.',\n },\n confirmRates: {\n required: 'You must confirm your rates to continue',\n },\n};\n\nexport const cobraChecklistPlanValidationSchema = yup.object({\n planName: yup\n .string()\n .required({ planName: cobraChecklistPlanErrorMessages.planName.required })\n .nullable(),\n carrier: yup\n .string()\n .required({ carrier: cobraChecklistPlanErrorMessages.carrier.required })\n .nullable(),\n newCarrierName: yup\n .string()\n .max(30, { newCarrierName: cobraChecklistPlanErrorMessages.newCarrierName.max })\n .when('carrier', (carrier: string | null, schema: any) => {\n return schema.test({\n test: (newCarrierName: string | null) => {\n return ifElse(\n equals('Insurer Not Listed Below'),\n compose(not, either(isEmpty, isNil), always(newCarrierName)),\n T)(carrier);\n },\n message: { newCarrierName: cobraChecklistPlanErrorMessages.newCarrierName.required },\n });\n })\n .nullable(),\n planTypeId: yup\n .number()\n .required({ planTypeId: cobraChecklistPlanErrorMessages.planTypeId.required })\n .test(\n 'plan-type-id-equals-0',\n { planTypeId: cobraChecklistPlanErrorMessages.planTypeId.required },\n (num) => num !== 0,\n )\n .nullable(),\n planTypeDescription: yup\n .string()\n .when('planTypeId', (planTypeId: number | null, schema: any) => {\n return schema.test({\n test: (planTypeDescription: string | null) => {\n return ifElse(\n equals(8),\n compose(not, either(isEmpty, isNil), always(planTypeDescription)),\n T)(planTypeId);\n },\n message: { planTypeDescription: cobraChecklistPlanErrorMessages.newCarrierName.required },\n });\n })\n .nullable(),\n // see: https://stackoverflow.com/questions/59836052/how-to-validate-enums-in-yup\n carrierUpdateMethod: yup\n .mixed<InsurerUpdateMethod>()\n // @ts-expect-error\n .oneOf(Object.values(InsurerUpdateMethod), {\n carrierUpdateMethod: cobraChecklistPlanErrorMessages.carrierUpdateMethod.invalid,\n })\n .required({ carrierUpdateMethod: cobraChecklistPlanErrorMessages.carrierUpdateMethod.required }),\n carrierUpdateMethodNotes: yup\n .string()\n .when('carrierUpdateMethod', (carrierUpdateMethod: InsurerUpdateMethod | null, schema: any) => {\n return schema.test({\n test: (carrierUpdateMethodNotes: string | null) => ifElse(\n equals(InsurerUpdateMethod.Other),\n compose(not, either(isEmpty, isNil), always(carrierUpdateMethodNotes)),\n T)(carrierUpdateMethod),\n message: { carrierUpdateMethodNotes: cobraChecklistPlanErrorMessages.carrierUpdateMethodNotes.required },\n });\n })\n .nullable(),\n planPolicyNumber: yup\n .string()\n .max(20, { planPolicyNumber: cobraChecklistPlanErrorMessages.planPolicyNumber.max })\n .when('carrierUpdateMethod', (carrierUpdateMethod: InsurerUpdateMethod | null, schema: any) => {\n return schema.test({\n test: (planPolicyNumber: string | null) => ifElse(\n equals(InsurerUpdateMethod.CarrierByTuesdayFile),\n compose(not, either(isEmpty, isNil), always(planPolicyNumber)),\n T)(carrierUpdateMethod),\n message: { planPolicyNumber: cobraChecklistPlanErrorMessages.planPolicyNumber.required },\n });\n })\n .nullable(),\n carrierContactName: yup\n .string()\n .required({ carrierContactName: cobraChecklistPlanErrorMessages.carrierContactName.required })\n .nullable(),\n carrierContactEmail: yup\n .string()\n .required({ carrierContactEmail: cobraChecklistPlanErrorMessages.carrierContactEmail.required })\n .nullable(),\n carrierContactEmailTemp: yup\n .string()\n .required({ carrierContactEmailTemp: cobraChecklistPlanErrorMessages.carrierContactEmail.required })\n .email({ carrierContactEmailTemp: cobraChecklistPlanErrorMessages.carrierContactEmail.invalid })\n .when('carrierContactEmail', (carrierContactEmail: string | null, schema: any) => {\n return schema.test({\n test: (carrierContactEmailTemp: string | null) => ifElse(\n complement(isNil),\n complement(includes(carrierContactEmailTemp)),\n T)(carrierContactEmail),\n message: { carrierContactEmailTemp: cobraChecklistPlanErrorMessages.carrierContactEmail.duplicate },\n });\n })\n .nullable(),\n carrierContactPhone: yup\n .string()\n .test(\n 'phone-empty-or-10-chars-check',\n { carrierContactPhone: cobraChecklistPlanErrorMessages.carrierContactPhone.min },\n (phone) => !phone || phone.length >= 14,\n )\n .nullable(),\n confirmRates: yup\n .boolean()\n .required({ confirmRates: cobraChecklistPlanErrorMessages.confirmRates.required })\n .oneOf([ true ], { confirmRates: cobraChecklistPlanErrorMessages.confirmRates.required }),\n});\n","import store from 'store';\nimport {\n validate,\n} from 're-enrollment-checklist/cobra-reenrollment-checklist/cobra-checklist-plan.middleware';\n\nexport function validateCobraPlanOnDeck(): any {\n return (next: any) => async (action: any) => {\n return validate(store)(next)(action);\n };\n}\n","import { identity } from 'ramda';\n\nimport { noop } from 'shared/utils';\nimport store from 'store';\nimport { cobraChecklistPlanValidationSchema } from './cobra-checklist-plan.validators';\nimport {\n selectCobraPlanOnDeck,\n setCobraPlanOnDeckValidations,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\n\nexport const validate = (appStore: typeof store) => (next: any) => async (action: any) => {\n if (action) {\n next(action);\n }\n\n if (\n action.type.startsWith('reEnrollmentChecklist/setCobraPlanOnDeck')\n && !action.type.endsWith('Validations')\n ) {\n const state = appStore.getState();\n const planOnDeck = selectCobraPlanOnDeck(state);\n const validations = await cobraChecklistPlanValidationSchema\n .validate(planOnDeck, { stripUnknown: true, abortEarly: false })\n .then(noop)\n .catch(identity);\n\n const validation = (validations?.errors ?? [])\n .reduce((value: Record<string, string>, acc: Record<string, string>) => {\n return { ...acc, ...value };\n }, {});\n appStore.dispatch(setCobraPlanOnDeckValidations(validation));\n }\n};\n","import * as yup from 'yup';\nimport dayjs from 'dayjs';\n\nexport const directBillChecklistErrors = {\n date: {\n required: 'Please enter a valid date',\n },\n directBillOeBegins: {\n planYearStart: 'Open enrollment starting date must be no more than 90 days after the plan year starts',\n },\n directBillOeEnds: {\n afterStartDate: 'Open enrollment ending date must be after open enrollment starting date',\n },\n directBillResponseDeadline: {\n afterStartDate: 'Deadline must be more than 14 days after starting date',\n },\n};\n\nexport const directBillChecklistValidationSchema = yup.object({\n planYearStart: yup.string(),\n directBillOeBegins: yup\n .date()\n .typeError(`directBillOeBegins ${directBillChecklistErrors.date.required}`)\n .required()\n .when('planYearStart', (planYearStart: string | null, sch: any) => {\n return sch.test({\n test: (directBillOeBegins: Date | null) => !!directBillOeBegins && !!planYearStart && (\n dayjs(directBillOeBegins).diff(dayjs(planYearStart), 'days') <= 90\n ),\n message: `directBillOeBegins ${directBillChecklistErrors.directBillOeBegins.planYearStart}`,\n });\n }),\n directBillOeEnds: yup\n .date()\n .typeError(`directBillOeEnds ${directBillChecklistErrors.date.required}`)\n .required()\n .when('directBillOeBegins', (directBillOeBegins: Date | null, sch: any) => {\n return sch.test({\n test: (directBillOeEnds: Date | null) => !!directBillOeEnds && !!directBillOeBegins && (\n dayjs(directBillOeEnds).isAfter(directBillOeBegins)\n ),\n message: `directBillOeEnds ${directBillChecklistErrors.directBillOeEnds.afterStartDate}`,\n });\n }),\n directBillResponseDeadline: yup\n .date()\n .typeError(`directBillResponseDeadline ${directBillChecklistErrors.date.required}`)\n .required()\n .when('directBillOeBegins', (directBillOeBegins: Date | null, sch: any) => {\n return sch.test({\n test: (directBillResponseDeadline: Date | null) => !!directBillOeBegins && !!directBillResponseDeadline && (\n dayjs(directBillResponseDeadline).diff(dayjs(directBillOeBegins), 'days') > 14\n ),\n message:\n `directBillResponseDeadline ${directBillChecklistErrors.directBillResponseDeadline.afterStartDate}`,\n });\n }),\n});\n","import { identity } from 'ramda';\nimport {\n selectDirectBillPlan,\n selectDirectBillOePlanYearStart,\n setOeValidationsByPlanType,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport { noop } from 'shared/utils';\nimport yupErrorsToObject from 'store/middleware/validators/utils/yupErrorsToObject';\nimport { directBillChecklistValidationSchema as validationSchema }\n from 're-enrollment-checklist/direct-bill-reenrollment-checklist/direct-bill-checklist.validators';\nimport store from 'store';\n\nexport const validate = (appStore: typeof store) => (next: any) => async (action: any) => {\n if (action) {\n next(action);\n }\n\n if (\n action.type.includes('reEnrollmentChecklist/setDirectBill')\n && !action.type.includes('reEnrollmentChecklist/setDirectBillOeValidations')\n ) {\n const state = appStore.getState();\n const directBillPlan = selectDirectBillPlan(state);\n const validations = await validationSchema\n .validate(directBillPlan, { stripUnknown: true, abortEarly: false })\n .then(noop)\n .catch(identity);\n const validation = yupErrorsToObject(validations?.errors ?? []);\n const planYearStart = selectDirectBillOePlanYearStart(state);\n appStore.dispatch(setOeValidationsByPlanType({\n type: 'directBill',\n planYearStart,\n ...validation,\n }));\n }\n};\n","import store from 'store';\nimport { validate } from 're-enrollment-checklist/direct-bill-reenrollment-checklist/direct-bill-checklist.middleware';\n\nexport function validateDirectBillChecklist(): any {\n return (next: any) => async (action: any) => {\n return validate(store)(next)(action);\n };\n}\n","import store from 'store/index';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\n\nexport const handleErrors = (appStore: typeof store) => (next: any) => async (action: any) => {\n if (action) {\n next(action);\n }\n\n if (action.error?.message === 'cancelled') {\n return;\n }\n\n if (action.type.includes('rejected') && action.payload === undefined) {\n appStore.dispatch(addHttpErrorNotification(new Error(action.error?.message ?? 'There was a problem')));\n }\n};\n\nexport function handleErrorsMiddleware(): any {\n return (next: any) => async (action: any) => {\n return handleErrors(store)(next)(action);\n };\n}\n","import store from 'store';\nimport { dependentsReset } from 'store/slices/dependents/dependents.middleware';\n\nexport function dependentsMiddleware(): any {\n return (next: any) => async (action: any) => {\n return dependentsReset(store)(next)(action);\n };\n}\n","import store from 'store/index';\nimport { resetDependents } from 'store/slices/dependents/dependents.slice';\n\nexport const dependentsReset = (appStore: typeof store) => (next: any) => async (action: any) => {\n if (action) {\n next(action);\n }\n\n if (\n action.type.includes('participant/setSelectedParticipant')\n ) {\n appStore.dispatch(resetDependents());\n }\n};\n","import { AnyAction } from 'redux';\nimport { configureStore } from '@reduxjs/toolkit';\nimport { ThunkAction } from 'redux-thunk';\nimport logger from 'redux-logger';\n\nimport rootReducer, { RootState } from './rootReducer';\nimport serverLogger from 'store/middleware/server-logger';\nimport syncCompanyLocalStorage from 'store/middleware/sync-company-local-storage';\nimport {\n validateCobraPlans,\n handleErrorsMiddleware,\n validateCobraPlanOnDeck,\n validateDirectBillChecklist,\n} from 'store/middleware/validators';\nimport { dependentsMiddleware } from 'store/middleware/dependents/dependents';\n\nconst store = configureStore({\n reducer: rootReducer,\n middleware: process.env.REACT_APP_LOG_LEVEL === 'debug'\n ? (getDefaultMiddleware) => getDefaultMiddleware().concat([\n logger,\n serverLogger,\n syncCompanyLocalStorage,\n validateCobraPlans,\n validateCobraPlanOnDeck,\n validateDirectBillChecklist,\n handleErrorsMiddleware,\n dependentsMiddleware,\n ])\n : (getDefaultMiddleware) => getDefaultMiddleware().concat([\n serverLogger,\n syncCompanyLocalStorage,\n validateCobraPlans,\n validateCobraPlanOnDeck,\n validateDirectBillChecklist,\n handleErrorsMiddleware,\n dependentsMiddleware,\n ]),\n});\n\nexport type AppDispatch = typeof store.dispatch\n\n// todo: the type for this is wrong. void is R, the return from the action creating function\nexport type AppThunk = ThunkAction<Promise<void> | void, RootState, unknown, AnyAction>;\n\nexport default store;\n","export function colorFromLetters(letters: string): string {\n const code = letters.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0);\n\n return avatarColorPalette[ code % avatarColorPalette.length ];\n}\n\nexport const avatarColorPalette = [\n 'bg-pink-400',\n 'bg-pink-500',\n 'bg-pink-600',\n 'bg-pink-700',\n 'bg-pink-800',\n 'bg-pink-900',\n 'bg-purple-400',\n 'bg-purple-500',\n 'bg-purple-600',\n 'bg-purple-700',\n 'bg-purple-800',\n 'bg-purple-900',\n 'bg-deepPurple-400',\n 'bg-deepPurple-500',\n 'bg-deepPurple-600',\n 'bg-deepPurple-700',\n 'bg-deepPurple-800',\n 'bg-deepPurple-900',\n 'bg-indigo-400',\n 'bg-indigo-500',\n 'bg-indigo-600',\n 'bg-indigo-700',\n 'bg-indigo-800',\n 'bg-indigo-900',\n 'bg-blue-400',\n 'bg-blue-500',\n 'bg-blue-600',\n 'bg-blue-700',\n 'bg-blue-800',\n 'bg-blue-900',\n 'bg-lightBlue-400',\n 'bg-lightBlue-500',\n 'bg-lightBlue-600',\n 'bg-lightBlue-700',\n 'bg-lightBlue-800',\n 'bg-lightBlue-900',\n 'bg-cyan-400',\n 'bg-cyan-500',\n 'bg-cyan-600',\n 'bg-cyan-700',\n 'bg-cyan-800',\n 'bg-cyan-900',\n 'bg-teal-400',\n 'bg-teal-500',\n 'bg-teal-600',\n 'bg-teal-700',\n 'bg-teal-800',\n 'bg-teal-900',\n 'bg-green-400',\n 'bg-green-500',\n 'bg-green-600',\n 'bg-green-700',\n 'bg-green-800',\n 'bg-green-900',\n 'bg-lightGreen-400',\n 'bg-lightGreen-500',\n 'bg-lightGreen-600',\n 'bg-lightGreen-700',\n 'bg-lightGreen-800',\n 'bg-lightGreen-900',\n 'bg-deepOrange-400',\n 'bg-deepOrange-500',\n 'bg-deepOrange-600',\n 'bg-deepOrange-700',\n 'bg-deepOrange-800',\n 'bg-deepOrange-900',\n 'bg-brown-400',\n 'bg-brown-500',\n 'bg-brown-600',\n 'bg-brown-700',\n 'bg-brown-800',\n 'bg-brown-900',\n 'bg-blueGrey-400',\n 'bg-blueGrey-500',\n 'bg-blueGrey-600',\n 'bg-blueGrey-700',\n 'bg-blueGrey-800',\n 'bg-blueGrey-900',\n];\n\nexport const getInitials = (firstName: string, lastName: string) => {\n return `${firstName.charAt(0).toUpperCase()}${lastName.charAt(0).toUpperCase()}`;\n};\n\nexport const avatarColor = (firstName: string, lastName: string) => {\n return colorFromLetters(firstName + lastName);\n};\n","import React from 'react';\nimport Avatar from '@mui/material/Avatar';\nimport { useSelector } from 'react-redux';\n\nimport { Participant } from 'participant-search/participant-list.types';\nimport { colorFromLetters } from 'components/shared/avatar-color-palette';\nimport { selectSelectedCompany } from 'companies/companies.slice';\n\ninterface ParticipantSubHeaderProps {\n participant: Participant;\n}\n\nfunction ParticipantSubHeader({ participant }: ParticipantSubHeaderProps): React.ReactElement {\n const { iddesc } = useSelector(selectSelectedCompany) ?? { iddesc: undefined };\n\n return (\n <div className=\"flex flex-nowrap w-full space-x-8\">\n <Avatar className={\n `p-2 text-sm ${colorFromLetters(participant.fname + participant.lname)}`\n }\n >{participant.fname.charAt(0).toUpperCase()}{participant.lname.charAt(0).toUpperCase()}\n </Avatar>\n <p className=\"pt-2\">\n {`${participant.fname} ${participant.lname}`}\n </p>\n <p className=\"pt-2\">\n PID# {participant.empno}\n </p>\n <p className=\"pt-2\">\n {iddesc ?? 'SSN'}# XXXXX{participant.payrollid ?? ''}\n </p>\n </div>\n );\n}\n\nexport default ParticipantSubHeader;\n","import React from 'react';\nimport ExitToAppIcon from '@mui/icons-material/ExitToApp';\n\nimport { assertIsDefined } from 'shared/asserts';\nimport { logout } from './authentication';\n\nimport { Link } from 'react-router-dom';\n\nfunction Logout(): React.ReactElement {\n function handleLogout() {\n assertIsDefined(process.env.REACT_APP_LOGIN_URL);\n logout();\n window.location.assign(process.env.REACT_APP_LOGIN_URL);\n }\n\n return (\n <Link onClick={handleLogout} to=\"\" className=\"mr-2\">\n <ExitToAppIcon /> Logout\n </Link>\n );\n}\n\nexport default Logout;\n","import React from 'react';\n\nimport IconButton from '@mui/material/Button';\nimport { useHistory } from 'react-router-dom';\n\nexport interface UserMenuButtonProps {\n name?: string;\n page?: string;\n}\n\nfunction UserMenuButton({ name, page }: UserMenuButtonProps): React.ReactElement {\n const history = useHistory();\n\n function navigate() {\n navigateToPage(page ?? '');\n }\n\n function navigateToPage(navToPage: string) {\n history.push(navToPage);\n }\n\n return (\n <IconButton\n data-testid=\"user-menu-button\"\n variant=\"outlined\"\n className=\"rounded-full bg-white text-black normal-case\"\n onClick={navigate}\n size=\"large\"\n >{name}\n </IconButton>\n );\n}\n\nexport default UserMenuButton;\n","import React from 'react';\nimport Avatar from '@mui/material/Avatar';\n\nimport { Company } from './company.types';\nimport styles from './CompanyAvatar.module.css';\n\ninterface CompanyAvatarProps {\n company: Company | null;\n className?: string;\n}\n\nfunction CompanyAvatar({ company, className = '' }: CompanyAvatarProps): React.ReactElement {\n function imgSrc(): string {\n return company?.filepath\n ? `https://admin.flores247.com/fsaforms/logos/${company.filepath}/logo.jpg`\n : '';\n }\n\n return <Avatar alt={company?.compname} className={className} classes={ { img: styles.img } } src={imgSrc()} />;\n}\n\nexport default CompanyAvatar;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport Button from '@mui/material/Button';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport Typography from '@mui/material/Typography';\nimport Avatar from '@mui/material/Avatar';\nimport Divider from '@mui/material/Divider';\nimport { Link, useHistory } from 'react-router-dom';\nimport GroupIcon from '@mui/icons-material/Group';\nimport ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown';\n\nimport Logout from 'authentication/Logout';\nimport UserMenuButton from './UserMenuButton';\nimport CompanyAvatar from 'companies/CompanyAvatar';\nimport {\n selectSelectedCompany,\n selectUserCompanies,\n} from 'companies/companies.slice';\n\nfunction UserMenu(): React.ReactElement {\n const history = useHistory();\n const [ anchorEl, setAnchorEl ] = React.useState<HTMLElement | null>(null);\n const company = useSelector(selectSelectedCompany);\n const companies = useSelector(selectUserCompanies);\n\n function handleOpen(event: React.MouseEvent) {\n setAnchorEl(event.currentTarget as HTMLElement);\n }\n\n function handleClose() {\n setAnchorEl(null);\n }\n\n function handleViewAllCompanies() {\n history.push('/company-select');\n window.location.reload();\n }\n\n function openerIcon(): React.ReactElement {\n if (!!company) {\n return (\n <>\n <Typography component=\"p\" className=\"text-sm normal-case\">{company.compname}</Typography>\n <ArrowDropDownIcon htmlColor={'#666666'} />\n <CompanyAvatar company={company} className=\"w-15 h-15 ml-2\" />\n </>\n );\n }\n\n return <Avatar className=\"w-15 h-15\" > </Avatar>;\n }\n\n function viewAllCompanies() {\n if (companies.length > 1) {\n return (\n <MenuItem onClick={handleViewAllCompanies}>\n <Link className=\"mr-2\" to=\"/company-select\"><GroupIcon />View All Companies</Link>\n </MenuItem>\n );\n } else {\n return <span />;\n }\n }\n\n function menuItems(): React.ReactElement {\n if (!!company) {\n // note: we know that there will be more items in this menu for companies\n return (\n <span>\n <Divider />\n <div className=\"flex flex-col items-center\">\n <CompanyAvatar company={company} className=\"w-20 h-20\" />\n <Typography className=\"text-center\" variant=\"body1\" id=\"company-name\">{company.compname}</Typography>\n </div>\n <MenuItem onClick={handleClose} className=\"justify-center mt-3 mb-3\">\n <UserMenuButton\n name=\"Manage your Settings\"\n page=\"/manage-settings\"\n />\n </MenuItem>\n <Divider />\n {viewAllCompanies()}\n <Divider />\n <MenuItem onClick={handleClose}><Logout /></MenuItem>\n <Divider />\n <MenuItem onClick={handleClose}>\n <div className=\"flex flex-auto flex-row items-center justify-around text-xs\">\n <a href=\"https://www.flores-associates.com/fsaforms/privacystandards.pdf\"\n target=\"_blank\" rel=\"noreferrer\"\n >\n Privacy Policy\n </a>\n </div>\n </MenuItem>\n </span>\n );\n }\n\n return <MenuItem><Logout /></MenuItem>;\n }\n\n function renderMenu(): React.ReactElement {\n return (\n <>\n <Button\n aria-controls=\"simple-menu\"\n aria-haspopup=\"true\"\n onClick={handleOpen}\n data-testid=\"userMenuButton\"\n className=\"max-w-xs\"\n >\n {openerIcon()}\n </Button>\n <Menu\n anchorEl={anchorEl}\n anchorOrigin={ { vertical: 'bottom', horizontal: 'center' } }\n transformOrigin={ { vertical: 'top', horizontal: 'center' } }\n keepMounted\n open={Boolean(anchorEl)}\n onClose={handleClose}\n data-testid=\"userMenu\"\n classes={ {\n list: `max-w-sm`,\n } }\n >\n {menuItems()}\n </Menu>\n </>\n );\n }\n\n return renderMenu();\n}\n\nexport default UserMenu;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport MenuItem from '@mui/material/MenuItem';\nimport Avatar from '@mui/material/Avatar';\n\nimport { Participant } from './participant-list.types';\nimport { avatarColor, getInitials } from 'components/shared/avatar-color-palette';\nimport { nameCase } from 'shared/utils';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { selectSearchText } from './participant.slice';\n\ninterface ParticipantResultsRowProps {\n participant: Participant;\n onParticipantSelected: (participant: Participant) => void;\n}\n\nfunction ParticipantResultsRow({\n participant,\n onParticipantSelected,\n}: ParticipantResultsRowProps): React.ReactElement {\n const { iddesc = 'SSN' } = useSelector(selectSelectedCompany) ?? { iddesc: undefined };\n const searchText = useSelector(selectSearchText);\n\n function handleSelected() {\n onParticipantSelected(participant);\n }\n\n function highlightMatch(str?: string): React.ReactElement {\n const field = str ?? '';\n const lowerStr = field.toLocaleLowerCase();\n const lowerSearch = searchText.toLocaleLowerCase();\n\n if (searchText.length > 0 && lowerStr.includes(lowerSearch)) {\n const index = lowerStr.indexOf(lowerSearch.toLocaleLowerCase());\n\n return (\n <span>\n {field.slice(0, index)}\n <b>{field.slice(index, index + searchText.length)}</b>\n {field.slice(index + searchText.length)}\n </span>\n );\n }\n\n return <span>{str}</span>;\n }\n\n return (\n <MenuItem className=\"flex justify-between w-full flex-nowrap space-x-3\" onClick={handleSelected}>\n <Avatar className={`p-2 w-10 text-sm ${avatarColor(participant.fname, participant.lname)}`}>\n {getInitials(participant.fname, participant.lname)}\n </Avatar>\n <p className=\"whitespace-nowrap flex-grow\">\n {highlightMatch(nameCase(`${participant.fname} ${participant.lname}`))}\n </p>\n <p className=\"whitespace-nowrap w-32\">PID# {highlightMatch(participant.empno)}</p>\n <p className=\"whitespace-nowrap\">{iddesc}# XXX-XX-{highlightMatch(participant.payrollid ?? '')}</p>\n </MenuItem>\n );\n}\n\nexport default ParticipantResultsRow;\n","import MenuItem from '@mui/material/MenuItem';\nimport AddParticipantIcon from '@mui/icons-material/AccountCircle';\nimport { useHistory } from 'react-router';\nimport { compose, always } from 'ramda';\n\nfunction AddParticipantItem() {\n const history = useHistory();\n\n function handleAddParticipant() {\n compose(history.push, always('/add-participant'))();\n }\n\n return (\n <MenuItem\n className=\"flex justify-start w-full flex-nowrap space-x-3 participant-search-add-participant\"\n onClick={handleAddParticipant}\n >\n <AddParticipantIcon className=\"w-11 h-11\" color=\"disabled\" />\n <p className=\"flex-grow text-neutral3\">Add New Participant</p>\n </MenuItem>\n );\n}\n\nexport default AddParticipantItem;\n","import React, { RefObject, KeyboardEvent, MouseEvent, useEffect, useRef, useState, forwardRef } from 'react';\nimport { useSelector } from 'react-redux';\nimport Popper from '@mui/material/Popper';\nimport Grow from '@mui/material/Grow';\nimport Paper from '@mui/material/Paper';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport MenuList from '@mui/material/MenuList';\nimport MenuItem from '@mui/material/MenuItem';\n\nimport { Participant } from './participant-list.types';\nimport ParticipantResultsRow from './ParticipantResultsRow';\nimport { selectSearchResults, selectSearchText } from './participant.slice';\nimport AddParticipantItem from './AddParticipantItem';\n\ninterface ParticipantSearchResultsProps {\n anchorRef: RefObject<HTMLElement>;\n open: boolean;\n onClose: () => void;\n onParticipantSelected: (participant: Participant) => void;\n}\n\nexport function popperLoadingIndicator(width: number): React.ReactElement {\n return (\n <div\n className=\"animate-pulse bg-gradient-to-b from-gray-400 to-transparent w-40 h-20\"\n style={ { minWidth: `${width}px` } }\n data-testid=\"participant-results-loading\"\n />\n );\n}\n\nfunction ParticipantSearchResults({\n anchorRef,\n open,\n onClose,\n onParticipantSelected,\n}: ParticipantSearchResultsProps, ref: React.Ref<HTMLUListElement>): React.ReactElement {\n const [ width, setWidth ] = useState(0);\n const prevOpen = useRef(open);\n const participants = useSelector(selectSearchResults);\n const searchText = useSelector(selectSearchText);\n\n function handleParticipantSelect(participant: Participant) {\n onParticipantSelected(participant);\n onClose();\n }\n\n function handleClose(event: MouseEvent<EventTarget>) {\n if (anchorRef.current?.contains(event.target as HTMLElement)) {\n return;\n }\n\n onClose();\n }\n\n function handleListKeyDown(event: KeyboardEvent) {\n if (event.key === 'Tab' || event.key === 'Escape') {\n event.preventDefault();\n onClose();\n }\n }\n\n useEffect(() => {\n if (anchorRef.current !== null) {\n setWidth(anchorRef.current.offsetWidth);\n }\n\n // return focus to the element that handles visibility when we transitioned from !open -> open\n if (prevOpen.current && !open) {\n anchorRef.current!.focus();\n }\n\n prevOpen.current = open;\n }, [ anchorRef, open ]);\n\n function defaultItems() {\n if (searchText.length) {\n return [\n <MenuItem disabled key=\"1\">\n <p style={ { minWidth: `${width}px` } } className=\"p-4\">No participants found</p>\n </MenuItem>,\n <AddParticipantItem key=\"2\" />,\n ];\n }\n\n return <AddParticipantItem />;\n }\n\n function menuList(): React.ReactElement {\n if (participants?.length) {\n return (\n <MenuList\n ref={ref}\n autoFocusItem={open}\n id=\"menu-list-grow\"\n onKeyDown={handleListKeyDown}\n style={ { minWidth: `${width}px` } }\n >\n {\n participants.map((p) => (\n <ParticipantResultsRow\n key={p.empno}\n participant={p}\n onParticipantSelected={handleParticipantSelect}\n />\n ))\n }\n <AddParticipantItem />\n </MenuList>\n );\n }\n\n return (\n <MenuList\n ref={ref}\n autoFocusItem={open}\n id=\"menu-list-grow\"\n onKeyDown={handleListKeyDown}\n style={ { minWidth: `${width}px` } }\n >\n {defaultItems()}\n </MenuList>\n );\n }\n\n return (\n <Popper open={open} anchorEl={anchorRef.current} role={undefined} transition disablePortal placement=\"bottom-start\">\n {({ TransitionProps, placement }) => (\n <Grow\n {...TransitionProps}\n style={ { transformOrigin: placement.includes('bottom') ? 'left top' : 'left bottom' } }\n >\n <Paper>\n <ClickAwayListener onClickAway={handleClose as any}>\n {participants === null ? popperLoadingIndicator(width) : menuList()}\n </ClickAwayListener>\n </Paper>\n </Grow>\n )}\n </Popper>\n );\n}\n\nexport default forwardRef<HTMLUListElement, ParticipantSearchResultsProps>(ParticipantSearchResults);\n","import React, { useRef } from 'react';\nimport TextField from '@mui/material/TextField';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport SearchIcon from '@mui/icons-material/Search';\nimport { compose, pathOr } from 'ramda';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\n\nexport interface SearchInputProps {\n label?: string;\n placeholder?: string;\n onChange: (search: string) => void;\n onFocus?: (search?: string) => void;\n size?: 'small' | 'medium'; // this gets passed along to the TextField. Default is \"medium\"\n variant?: 'outlined' | 'standard' | 'filled'; // passed along to TextField. Default is \"outlined\"\n [otherProp: string]: any;\n}\n\nfunction SearchInput({\n label = 'Search',\n placeholder = '',\n onChange,\n onFocus,\n size = 'medium',\n variant = 'outlined',\n className,\n ...rest\n}: SearchInputProps): React.ReactElement {\n var inputRef = useRef<HTMLInputElement>(null);\n\n function handleFocus() {\n if (onFocus) {\n onFocus(inputRef.current?.value);\n }\n }\n\n const handleChanged = compose(\n onChange,\n pathOr('', [ 'currentTarget', 'value' ]),\n );\n\n function handleIconClick() {\n inputRef.current?.focus();\n }\n\n function handleClickAway(event: React.MouseEvent<Document>) {\n inputRef.current?.blur();\n }\n\n return (\n <ClickAwayListener onClickAway={handleClickAway as any}>\n <TextField\n inputRef={inputRef}\n variant={variant}\n size={size}\n fullWidth\n label={label}\n placeholder={placeholder}\n onChange={handleChanged}\n onFocus={handleFocus}\n {...rest}\n inputProps={ {\n onPaste: handleChanged,\n } }\n InputProps={ {\n className,\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon htmlColor=\"gray\" onClick={handleIconClick} data-testid=\"search-input-icon\" />\n </InputAdornment>\n ),\n } }\n />\n </ClickAwayListener>\n );\n}\n\nexport default SearchInput;\n","import React from 'react';\n\nimport { debounce } from 'shared/utils';\n\ninterface WrappedComponentProps {\n onChange: (...args: any[]) => void;\n}\n\ninterface WithDebounceProps {\n onDebouncedChange: (value: string) => void;\n}\n\nfunction withDebounce<P extends WrappedComponentProps>(\n WrappedComponent: React.ComponentType<React.PropsWithChildren<P>>, timeout = 250,\n) {\n function WithDebounce({ onDebouncedChange, ...props }: WithDebounceProps & Omit<P, 'onChange'>): React.ReactElement {\n function handleChange(value: string) {\n onDebouncedChange(value);\n }\n\n const debouncedHandler = debounce(handleChange, timeout);\n\n return (\n // @ts-expect-error while this compiles and works, TypeScript can't sort out the typing how I need it to for complex reasons\n <WrappedComponent\n onChange={debouncedHandler}\n {...props}\n />\n );\n }\n\n const wrappedComponentName = WrappedComponent.displayName ?? WrappedComponent.name;\n WithDebounce.displayName = `withDebounce(${wrappedComponentName})`;\n\n return WithDebounce;\n}\n\nexport default withDebounce;\n","import React, { KeyboardEvent, useRef, FocusEvent, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport { compose, T, F } from 'ramda';\n\nimport ParticipantSearchResults from './ParticipantSearchResults';\nimport SearchInput from 'components/shared/SearchInput';\nimport withDebounce from 'components/shared/HOC/WithDebounce';\nimport { Participant } from './participant-list.types';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { setSelectedParticipant, searchParticipants, setSearchText, resetSearchResults } from './participant.slice';\nimport store from 'store';\n\nconst DebouncedSearch = withDebounce(SearchInput, 250);\n\nfunction ParticipantSearch(): React.ReactElement {\n const [ open, setOpen ] = useState(false);\n const openList = compose(setOpen, T, searchChange);\n const closeList = compose(setOpen, F);\n\n const listRef = useRef<HTMLUListElement>(null);\n const anchorRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const company = useSelector(selectSelectedCompany);\n const dispatch = useDispatch<typeof store.dispatch>();\n const history = useHistory();\n\n const selectParticipant = compose(dispatch, setSelectedParticipant);\n\n function searchChange(text: string) {\n dispatch(setSearchText(text));\n\n if (text.length) {\n dispatch(searchParticipants());\n }\n }\n\n function handleBlur(event: FocusEvent<HTMLInputElement>) {\n if (listRef.current &&\n event.relatedTarget &&\n !Array.from(listRef.current.children).includes(event.relatedTarget as HTMLElement)) {\n closeList();\n }\n }\n\n function handleSelect(participant: Participant) {\n closeList();\n selectParticipant(participant);\n history.push(`/participant-overview/${participant.empno}/general-info`);\n setSearchText('');\n dispatch(resetSearchResults());\n }\n\n function handleKeyUp(event: KeyboardEvent<HTMLInputElement>) {\n // arrow down into the list\n if (event.key === 'ArrowDown' && listRef.current && listRef.current.children.length > 0) {\n (listRef.current.children[0] as HTMLLIElement).focus();\n }\n\n // update search text and search immediately on Enter\n if (event.key === 'Enter') {\n searchChange((event.target as HTMLInputElement).value);\n }\n }\n\n function content(): React.ReactElement {\n if (!company) {\n return <></>;\n }\n\n let placeHolderText = `Search Participant by PID/${company.iddesc || 'SSN'}/Name`;\n\n return (\n <>\n <div hidden={company.isFmlaOnly} ref={anchorRef}>\n <DebouncedSearch\n ref={inputRef}\n placeholder={placeHolderText}\n size=\"small\"\n label=\"\"\n className=\"rounded-full text-sm\"\n onDebouncedChange={searchChange}\n onFocus={openList}\n onBlur={handleBlur}\n onKeyUp={handleKeyUp}\n aria-controls={open ? 'menu-list-grow' : undefined}\n aria-haspopup=\"true\"\n />\n </div>\n <div>\n {\n open\n ? (\n <ParticipantSearchResults\n ref={listRef}\n open={open}\n anchorRef={anchorRef}\n onClose={closeList}\n onParticipantSelected={handleSelect}\n />\n )\n : <></>\n }\n </div>\n </>\n );\n }\n\n return (\n <div className=\"flex flex-col w-1/2\">\n {content()}\n </div>\n );\n}\n\nexport default ParticipantSearch;\n","export default __webpack_public_path__ + \"static/media/dash-logo.790b2350.svg\";","import React from 'react';\nimport { Link } from 'react-router-dom';\n\nimport dashLogo from 'images/dash-logo.svg';\nimport styles from './FloresHeaderLogo.module.css';\n\nfunction FloresHeaderLogo(): React.ReactElement {\n return (\n <div className={`${styles.logoContainer} p-4`}>\n <Link to=\"/dashboard\"><img src={dashLogo} className={`${styles.logo}`} alt=\"Flores\" /></Link>\n </div>\n );\n}\n\nexport default FloresHeaderLogo;\n","import React from 'react';\nimport IconButton from '@mui/material/IconButton';\nimport Hidden from '@mui/material/Hidden';\nimport MenuIcon from '@mui/icons-material/Menu';\nimport Toolbar from '@mui/material/Toolbar';\n\nimport styles from './AppToolbar.module.css';\nimport UserMenu from './UserMenu';\nimport ParticipantSearch from 'participant-search/ParticipantSearch';\nimport FloresHeaderLogo from './FloresHeaderLogo';\n\ninterface AppToolbarProps {\n onToggleDrawer?: () => void;\n showSearch: boolean;\n}\n\nfunction AppToolbar({ onToggleDrawer, showSearch }: AppToolbarProps): React.ReactElement {\n return (\n <Toolbar classes={ { regular: styles.toolbar } }>\n {\n onToggleDrawer\n ? (\n <Hidden lgUp>\n <IconButton\n aria-label=\"open navigation\"\n onClick={onToggleDrawer}\n className=\"mr-1\"\n data-testid=\"menuButton\"\n size=\"large\"\n >\n <MenuIcon />\n </IconButton>\n </Hidden>\n )\n : <FloresHeaderLogo />\n }\n {\n showSearch\n ? <ParticipantSearch />\n : <></>\n }\n <span className=\"flex-grow\" />\n <UserMenu />\n </Toolbar>\n );\n}\n\nexport default AppToolbar;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport AppBar from '@mui/material/AppBar';\nimport Button from '@mui/material/Button';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { useHistory, useParams } from 'react-router-dom';\n\nimport defaultStyles from './DefaultLayout.module.css';\nimport { selectParticipant } from 'participant-search/participant.slice';\nimport ParticipantSubHeader from '../shared/ParticipantSubHeader';\nimport AppToolbar from './Header/AppToolbar';\nimport { selectPageTitle } from 'components/app-settings.slice';\nimport { WizardStep } from 'components/shared/WizardStepper';\n\ninterface WizardLayoutProps {\n showBackButton?: boolean;\n steps?: Map<string, WizardStep>;\n}\n\nfunction WizardLayout({ children, steps, showBackButton = true }: React.PropsWithChildren<WizardLayoutProps>) {\n const { stepSlug } = useParams<{stepSlug?: string;}>();\n const history = useHistory();\n const participant = useSelector(selectParticipant);\n const pageTitle = useSelector(selectPageTitle);\n\n function getCurrentStep() {\n // this probably happens for pages that use wizard layout without steps, like Add Participant\n if (!steps || !stepSlug) {\n return null;\n }\n\n return steps.get(stepSlug);\n }\n\n function shouldShowBack() {\n if (!showBackButton || !steps || !stepSlug) {\n return false;\n }\n\n const currentStep = getCurrentStep();\n\n if (!currentStep || !currentStep.prev) {\n return false;\n }\n\n return true;\n }\n\n function handleBack() {\n const currentStep = getCurrentStep();\n\n // We should only get to this function if there are steps and if there is a .prev, but TypeScript can't see that\n if (currentStep?.prev) {\n const newPath = history.location.pathname.replace(stepSlug!, currentStep.prev);\n history.push(newPath);\n }\n }\n\n return (\n <div className=\"min-h-screen flex\">\n <div className=\"flex-grow\">\n <div className=\"flex flex-col\">\n <AppBar position=\"fixed\" className=\"left-0 w-auto shadow-none wizard-layout\" color=\"inherit\">\n <AppToolbar showSearch={false} />\n <div className=\"flex justify-center w-full\">\n <div className=\"w-full md:w-2/3 py-3 pl-4\">\n { shouldShowBack()\n ? (\n <Button onClick={handleBack} data-testid=\"wizardBack\">\n <ArrowBackIcon fontSize=\"large\" />\n <h5 className=\"normal-case wizard-title\">{pageTitle}</h5>\n </Button>\n )\n : <h5 className=\"normal-case wizard-title\">{pageTitle}</h5>\n }\n </div>\n </div>\n </AppBar>\n <div className={`${defaultStyles.contentContainer} w-full min-h-screen flex justify-center bg-surface-dark`}>\n <div className=\"w-full md:w-2/3 pt-32\">\n <div className=\"flex flex-col pt-6\">\n {\n participant\n ? <ParticipantSubHeader participant={participant} />\n : <></>\n }\n {children}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nexport default WizardLayout;\n","import React from 'react';\nimport { NavLink } from 'react-router-dom';\n\nimport styles from './NavItem.module.css';\n\nexport interface NavItemProps {\n path: string;\n name: string;\n icon?: React.ComponentType<React.PropsWithChildren<unknown>>;\n}\n\nfunction NavItem({ path, name, icon }: NavItemProps): React.ReactElement {\n function getIcon() {\n if (icon) {\n // note: It's necessary to do this renaming to get it to render.\n const Icon = icon;\n\n return <Icon />;\n }\n\n return <span />;\n }\n\n return (\n <NavLink\n to={path}\n activeClassName={styles.active}\n className={`${styles.navItem} p-2 rounded-sm h-10 flex flex-row items-center`}\n >\n {getIcon()}\n <p className=\"ml-1\">{name}</p>\n </NavLink>\n );\n}\n\nexport default NavItem;\n","import React from 'react';\nimport { NavConfig } from './navigation.types';\n\nimport NavItem from './NavItem';\ninterface NavigationProps {\n navConfig: NavConfig[];\n showLegacy: boolean;\n}\n\nfunction navItemMapper(nav: NavConfig): React.ReactElement {\n let path = nav.path;\n\n return <NavItem path={path} icon={nav.icon} name={nav.name} key={nav.name} />;\n}\n\nfunction Navigation({ navConfig }: NavigationProps): React.ReactElement {\n return (\n <nav className=\"flex flex-col justify-start m-1\">\n { navConfig.map(navItemMapper) }\n </nav>\n );\n}\n\nexport default Navigation;\n","import { NavConfig } from 'navigation/navigation.types';\n\nexport type NavPredicate = (item: NavConfig) => boolean;\n\nexport function makeNav(predicate: NavPredicate) {\n return function (nav: NavConfig[]) {\n return nav.filter(predicate);\n };\n}\n\n","import WebOutlinedIcon from '@mui/icons-material/WebOutlined';\nimport PublishOutlinedIcon from '@mui/icons-material/PublishOutlined';\nimport AccessTimeOutlinedIcon from '@mui/icons-material/AccessTimeOutlined';\nimport EditOutlinedIcon from '@mui/icons-material/EditOutlined';\nimport DesktopWindowsIcon from '@mui/icons-material/DesktopWindows';\nimport PersonAddIcon from '@mui/icons-material/PersonAdd';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport BarChartIcon from '@mui/icons-material/BarChart';\nimport BookIcon from '@mui/icons-material/Book';\nimport AdministrativeBillingIcon from '@mui/icons-material/Description';\nimport DocumentLibraryIcon from '@mui/icons-material/MenuBook';\nimport CreditCardIcon from '@mui/icons-material/CreditCard';\nimport CheckBoxOutlinedIcon from '@mui/icons-material/CheckBoxOutlined';\nimport WorkHistoryOutlinedIcon from '@mui/icons-material/WorkHistoryOutlined';\nimport ManageSearchIcon from '@mui/icons-material/ManageSearch';\nimport { NavConfig } from 'navigation/navigation.types';\n\nconst sidebarNav: NavConfig[] = [\n {\n path: '/scratchpad',\n name: 'Scratchpad',\n icon: DesktopWindowsIcon,\n },\n {\n path: '/dashboard',\n name: 'Dashboard',\n icon: WebOutlinedIcon,\n },\n {\n path: '/reenrollment-checklist',\n name: 'Re-Enrollment Checklist',\n icon: CheckBoxOutlinedIcon,\n },\n {\n path: '/open-enrollment-resources',\n name: 'Open Enrollment Resources',\n icon: BookIcon,\n },\n {\n path: '/file-upload',\n name: 'File Upload',\n icon: PublishOutlinedIcon,\n },\n {\n path: '/document-library',\n name: 'Document Library',\n icon: DocumentLibraryIcon,\n },\n {\n path: '/administrative-billing',\n name: 'Administrative Billing',\n icon: AdministrativeBillingIcon,\n },\n {\n path: '/add-participant',\n name: 'Add New Participant',\n icon: PersonAddIcon,\n },\n {\n path: '/terminate-participant',\n name: 'Terminate Participant',\n icon: DeleteIcon,\n },\n {\n path: '/reports',\n name: 'Reports',\n icon: BarChartIcon,\n },\n {\n path: '/report-history',\n name: 'Report History',\n icon: AccessTimeOutlinedIcon,\n },\n {\n path: '/file-history',\n name: 'File History',\n icon: AccessTimeOutlinedIcon,\n },\n {\n path: '/perform-direct-debit',\n name: 'Perform Direct Debit',\n icon: CreditCardIcon,\n },\n {\n path: '/rates-history',\n name: 'Rates History',\n icon: WorkHistoryOutlinedIcon,\n },\n {\n path: '/enter-cobra-initial-notice',\n name: 'Enter COBRA Initial Notice',\n icon: EditOutlinedIcon,\n },\n {\n path: '/enter-cobra-qe/personal-details',\n name: 'Enter COBRA QE',\n icon: EditOutlinedIcon,\n },\n {\n path: '/direct-bill-event/personal-details',\n name: 'Start Retiree/LOA Billing',\n icon: EditOutlinedIcon,\n },\n {\n path: '/leave-records',\n name: 'Search Leave Cases',\n icon: ManageSearchIcon,\n },\n {\n path: '/enter-leave-request/personal-details',\n name: 'Enter Leave Request',\n icon: EditOutlinedIcon,\n },\n];\n\nexport default sidebarNav;\n\n","import jwt_decode from 'jwt-decode';\nimport { getJWT } from 'authentication/authentication';\n\ntype UserPermission = 'Users' | 'Direct Debits';\n\n/**\n * Check if user has a certain permission\n * @param permissionDescription the description text of the permission\n * @returns the jwt or empty string if it is not set\n * @throws if the REACT_APP_JWT_STORAGE_KEY environment variable is null or undefined\n */\nexport function hasPermission(permissionDescription: UserPermission): boolean {\n const jwt = getJWT();\n\n if (!jwt) {\n return false;\n }\n const jwtDecoded = jwt_decode(jwt);\n\n if ((jwtDecoded as any)?.UserPermissions === undefined) {\n return false;\n }\n\n return JSON.parse((jwtDecoded as any).UserPermissions).some(\n (p: { description: UserPermission; }) => p.description === permissionDescription);\n}\n","import React, { useEffect, useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport Divider from '@mui/material/Divider';\nimport Drawer from '@mui/material/Drawer';\nimport Hidden from '@mui/material/Hidden';\nimport { compose } from 'ramda';\n\nimport Navigation from 'navigation/Navigation';\nimport { makeNav, NavPredicate } from 'components/layout/make-nav';\nimport Typography from '@mui/material/Typography';\nimport CompanyAvatar from 'companies/CompanyAvatar';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport FloresHeaderLogo from './Header/FloresHeaderLogo';\nimport sidebarNav from './sidebar-nav-config';\nimport { Company } from 'companies/company.types';\nimport { hasPermission } from 'authorization/authorization';\n\ninterface SidebarProps {\n collapsed: boolean;\n onToggleDrawer: () => void;\n}\n\nfunction navConfigPredicate(company: Company | null): NavPredicate {\n return function(item) {\n switch (item.name) {\n case 'Scratchpad':\n return process.env.REACT_APP_HIDE_DEV_FEATURES === 'false';\n case 'Start Retiree/LOA Billing':\n return !!company?.hasRetiree && !company.isFmlaOnly;\n case 'Perform Direct Debit':\n return hasPermission('Direct Debits') && !company?.isFmlaOnly;\n case 'Rates History':\n return (!!company?.hasCobra || !!company?.hasRetiree) && !company.isFmlaOnly;\n case 'Enter Leave Request':\n case 'Search Leave Cases':\n return !!company?.hasFmla;\n case 'Open Enrollment Resources':\n case 'Re-Enrollment Checklist':\n return !!company?.isOpenEnrollmentPeriod && !company.isFmlaOnly;\n case 'Add New Participant':\n case 'Terminate Participant':\n return !company?.isCobraOnly && !company?.isFmlaOnly;\n case 'File Upload':\n case 'Report History':\n case 'File History':\n return !company?.isFmlaOnly;\n default:\n return company?.hasCobra || (item.name !== 'Enter COBRA Initial Notice' && item.name !== 'Enter COBRA QE');\n }\n };\n}\n\nconst filter = compose(makeNav, navConfigPredicate);\n\nfunction Sidebar({ collapsed, onToggleDrawer }: SidebarProps): React.ReactElement {\n const company = useSelector(selectSelectedCompany);\n const modalContainer = document.body.querySelector('#root');\n const [ nav, setNav ] = useState(filter(company)(sidebarNav));\n\n useEffect(() => {\n setNav(filter(company)(sidebarNav));\n }, [ company ]);\n\n const drawerContent: React.ReactElement = (\n <>\n <FloresHeaderLogo />\n <Divider />\n <div className=\"flex flex-col justify-center items-center my-4\">\n <CompanyAvatar company={company} className=\"w-20 h-20 my-2\" />\n <Typography className=\"text-center\" variant=\"body1\" id=\"company-name\">{company?.compname}</Typography>\n </div>\n <Divider />\n <Navigation navConfig={nav} showLegacy />\n </>\n );\n\n return (\n <>\n <Hidden lgUp>\n <Drawer\n variant=\"temporary\"\n anchor=\"left\"\n open={collapsed}\n onClose={onToggleDrawer}\n ModalProps={ {\n keepMounted: true, // Better open performance on mobile.\n container: modalContainer,\n } }\n classes={ {\n paper: `w-65 bg-surface`,\n } }\n data-testid=\"sidebarDrawer\"\n >\n {drawerContent}\n </Drawer>\n </Hidden>\n <Hidden lgDown>\n <Drawer\n variant=\"permanent\"\n open\n classes={ {\n paper: `w-65 bg-surface`,\n } }\n data-testid=\"permSidebarDrawer\"\n >\n {drawerContent}\n </Drawer>\n </Hidden>\n </>\n );\n}\n\nexport default Sidebar;\n","import React, { useState } from 'react';\nimport AppBar from '@mui/material/AppBar';\n\nimport styles from './DefaultLayout.module.css';\nimport Sidebar from './Sidebar';\nimport AppToolbar from './Header/AppToolbar';\n\nfunction DefaultLayout({ children }: React.PropsWithChildren<Object>) {\n const [ open, setOpen ] = useState(false);\n\n function toggleDrawer() {\n setOpen(!open);\n }\n\n return (\n <div className=\"min-h-screen flex default-layout\">\n <AppBar position=\"fixed\" className={`${styles.header} bg-surface left-0 w-auto`} color=\"inherit\">\n <AppToolbar onToggleDrawer={toggleDrawer} showSearch />\n </AppBar>\n <div className={`${styles.mainContainer} flex-grow`}>\n <Sidebar collapsed={open} onToggleDrawer={toggleDrawer} />\n <div className=\"bg-surface-dark h-full flex\">\n {children}\n </div>\n </div>\n </div>\n );\n}\n\nexport default DefaultLayout;\n","import React, { useEffect } from 'react';\nimport { Route as _Route, RouteProps, useHistory } from 'react-router-dom';\nimport { useSelector } from 'react-redux';\nimport { isNil } from 'ramda';\n\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { isLoggedIn } from 'authentication/authentication';\nimport WizardLayout from 'components/layout/WizardLayout';\nimport DefaultLayout from 'components/layout/DefaultLayout';\nimport { WizardStep } from 'components/shared/WizardStepper';\n\nconst Route = _Route as any;\n\ninterface BaseAppRouteProps extends RouteProps {\n title: string;\n path: string;\n authRequired?: boolean;\n}\n\ninterface DefaultAppRouteProps extends BaseAppRouteProps {\n layout: 'default';\n}\n\ninterface LandingAppRouteProps extends BaseAppRouteProps {\n layout: 'landing';\n}\n\ninterface WizardAppRouteProps extends BaseAppRouteProps {\n layout: 'wizard';\n steps?: Map<string, WizardStep>;\n showBackButton?: boolean;\n}\n\ntype AppRouteProps = DefaultAppRouteProps | LandingAppRouteProps | WizardAppRouteProps;\n\nconst unprotected = [ '/landing', '/company-select', '/verify-token' ];\n\nfunction AppRoute(props: AppRouteProps): React.ReactElement {\n const {\n children,\n path,\n exact = false,\n title,\n authRequired = true,\n layout,\n ...rest\n } = props;\n const history = useHistory();\n const company = useSelector(selectSelectedCompany);\n const loginUrl = process.env.REACT_APP_LOGIN_URL ?? 'https://flores247.com/';\n\n useEffect(() => {\n if (authRequired) {\n if (!isLoggedIn()) {\n window.location.replace(loginUrl);\n }\n\n let isPartial = window.localStorage.getItem('isPartialLogin') === 'Y';\n\n if (isPartial) {\n history.push('/verify-token');\n } else if (!company && !unprotected.includes(path)) {\n history.push('/company-select');\n }\n }\n }, [ loginUrl, company, history, path, authRequired ]);\n\n function renderChildren() {\n if (props.layout === 'wizard') {\n const showButton = isNil(props.showBackButton) ? true : props.showBackButton;\n\n return <WizardLayout steps={props.steps} showBackButton={showButton}>{children as any}</WizardLayout>;\n }\n\n if (layout === 'landing') {\n return <>{children}</>;\n }\n\n return <DefaultLayout>{children as any}</DefaultLayout>;\n }\n\n function protectedRender(): React.ReactElement {\n if (!isLoggedIn() || (!company && !unprotected.includes(path))) {\n return (<div />);\n }\n\n if (!!children) {\n return (\n <Route\n path={path}\n exact={exact}\n {...rest}\n render={renderChildren}\n />\n );\n }\n\n return (<Route path={path} exact={exact} {...rest} />);\n }\n\n return protectedRender();\n}\n\nexport default AppRoute;\n","import React from 'react';\nimport Card from '@mui/material/Card';\nimport CardMedia from '@mui/material/CardMedia';\nimport CardContent from '@mui/material/CardContent';\n\nimport { Company } from './company.types';\nimport styles from './CompanyTile.module.css';\n\ninterface CompanyTileProps {\n company: Company;\n onSelected: (c: Company) => void;\n}\n\nfunction CompanyTile({ company, onSelected }: CompanyTileProps): React.ReactElement {\n function handleClick() {\n onSelected(company);\n }\n\n function logo(): React.ReactElement {\n if (company.filepath) {\n return (\n <CardMedia\n className={styles.media}\n title={`${company.compname}`}\n image={`https://admin.flores247.com/fsaforms/logos/${company.filepath}/logo.jpg`}\n />\n );\n }\n\n return <CardMedia className={styles.media} />;\n }\n\n return (\n <div onClick={handleClick} role=\"button\" data-testid={`companyTile${company.compid}`}>\n <Card className={`${styles.tile} m-4`} elevation={2} square>\n {logo()}\n <CardContent classes={ { root: styles.content } }>\n <p>{company.compname}</p>\n </CardContent>\n </Card>\n </div>\n );\n}\n\nexport default CompanyTile;\n","import React from 'react';\n\nimport { Company } from './company.types';\nimport CompanyTile from './CompanyTile';\n\ninterface CompanyListProps {\n companies: Company[];\n onSelected: (c: Company) => void;\n className?: string;\n}\n\nfunction CompanyList({ companies, onSelected, className = '' }: CompanyListProps): React.ReactElement {\n function handleSelect(company: Company) {\n onSelected(company);\n }\n\n return (\n <div className={`-m-4 flex flex-wrap ${className}`}>\n {companies.map((c) => <CompanyTile company={c} onSelected={handleSelect} key={c.compid} />)}\n </div>\n );\n}\n\nexport default CompanyList;\n","import React from 'react';\nimport Backdrop from '@mui/material/Backdrop';\n\nimport styles from './Loading.module.css';\n\ninterface LoadingProps {\n text?: string;\n}\n\nfunction Loading({ text = 'Please wait…' }: LoadingProps): React.ReactElement {\n return (\n <Backdrop open className={styles.backdrop}>\n <div className=\"flex flex-col items-center\">\n <div className={`${styles.imageContainer} rounded-full flex justify-center items-center bg-white\n overflow-visible relative`}\n >\n <div className={`${styles.logoImage} absolute rounded-full bg-no-repeat`} data-testid=\"loadingImage\" />\n </div>\n <p className=\"text-2xl mt-4 text-white\">{text}</p>\n </div>\n </Backdrop>\n );\n}\n\nexport default Loading;\n","import React from 'react';\nimport Paper from '@mui/material/Paper';\n\ninterface PageContentPaperProps {\n children: React.ReactNode;\n className?: string;\n}\n\nfunction PageContentPaper({ children, className = '', ...rest }: PageContentPaperProps): React.ReactElement {\n return <Paper className={`${className} p-4 w-full`} {...rest}>{children}</Paper>;\n}\n\nexport default PageContentPaper;\n","import { useEffect } from 'react';\n\nimport { setPageTitle } from 'components/app-settings.slice';\nimport { useDispatch } from 'react-redux';\nimport store from 'store';\n\nexport function usePageTitle(title?: string) {\n const dispatch = useDispatch<typeof store.dispatch>();\n\n useEffect(() => {\n dispatch(setPageTitle(title ?? ''));\n }, [ title, dispatch ]);\n}\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport Typography from '@mui/material/Typography';\n\nimport SearchInput from 'components/shared/SearchInput';\nimport {\n selectUserCompanies,\n setSelectedCompany,\n selectLoadingCompanies,\n} from 'companies/companies.slice';\nimport CompanyList from 'companies/CompanyList';\nimport { Company } from 'companies/company.types';\nimport { getUserPermissions } from 'shared/api/usersApi';\nimport Loading from 'components/shared/Loading';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { usePageTitle } from 'shared/custom-hooks/usePageTitle';\nimport store from 'store';\n\nfunction CompanySelect(): React.ReactElement {\n const [ filter, setFilter ] = useState('');\n\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n usePageTitle('Select a Company');\n\n const companies: Company[] = useSelector(selectUserCompanies);\n const loading = useSelector(selectLoadingCompanies);\n\n const switchCompany = useCallback(async (company: Company) => {\n try {\n await getUserPermissions(company.compid);\n } catch (ex) {\n dispatch(addHttpErrorNotification(ex));\n\n return;\n }\n\n dispatch(setSelectedCompany(company));\n history.push('/dashboard');\n }, [ dispatch, history ]);\n\n useEffect(() => {\n if (companies.length === 1) {\n switchCompany(companies[0]);\n }\n }, [ companies, switchCompany ]);\n\n function handleFilter(search: string) {\n setFilter(search);\n }\n\n function handleCompanySelect(company: Company) {\n switchCompany(company);\n }\n\n function companyFilter(company: Company) {\n return company.compname.toLocaleLowerCase().includes(filter.toLocaleLowerCase());\n }\n\n function companySelector(): React.ReactElement {\n if (loading === 'pending') {\n return <Loading />;\n } else {\n if (companies.length > 1) {\n return (\n <>\n <PageContentPaper className=\"flex flex-col\">\n <div className=\"w-1/2\">\n <SearchInput placeholder=\"Company Search\" label=\"\" onChange={handleFilter} size=\"small\" />\n </div>\n <CompanyList\n companies={companies.filter(companyFilter)}\n onSelected={handleCompanySelect}\n className=\"my-4\"\n />\n </PageContentPaper>\n </>\n );\n }\n\n if (companies.length === 0) {\n return (\n <PageContentPaper className=\"flex flex-col\">\n <Typography variant=\"body1\">\n You do not have access to any companies. Please contact your Account Manager.\n </Typography>\n </PageContentPaper>\n );\n }\n }\n\n return <div />;\n }\n\n return <div className=\"flex flex-col m-4 w-full\" data-testid=\"companySelect\">{companySelector()}</div>;\n}\n\nexport default CompanySelect;\n","import React from 'react';\nimport Avatar from '@mui/material/Avatar';\n\nimport styles from './AgentAvatar.module.css';\n\ninterface AgentAvatarProps {\n agentName: string;\n}\n\nfunction AgentAvatar({ agentName }: AgentAvatarProps): React.ReactElement {\n function imgSrc(): string {\n if (agentName.length > 0) {\n return `https://www.flores247.com/AMPhotos/${agentName.replace(/\\s+/g, '.')}.jpg`;\n }\n\n return '';\n }\n\n return (\n <Avatar\n className={`${styles.agentAvatar} rounded-full border-white border-solid border-8`}\n alt={agentName}\n src={imgSrc()}\n />\n );\n}\n\nexport default AgentAvatar;\n","import React from 'react';\nimport Paper from '@mui/material/Paper';\nimport PhoneIcon from '@mui/icons-material/Phone';\nimport MailOutlineIcon from '@mui/icons-material/MailOutline';\n\nimport AgentAvatar from './AgentAvatar';\nimport styles from './AccountManagerTile.module.css';\n\ninterface AccountManagerTileProps {\n agentName?: string;\n email?: string;\n className?: string;\n title: string;\n phone?: string;\n}\n\nfunction AccountManagerTile({\n agentName = '',\n email = '',\n className,\n title,\n phone = '',\n}: Readonly<AccountManagerTileProps>): React.ReactElement {\n return (\n <Paper elevation={1} className={`${className} ${styles.accountManagerTile} relative`}>\n <div className={`${styles.gradient} rounded-t w-full absolute block top-0 left-0`} />\n\n <div className=\"flex flex-col justify-start h-full\">\n <div className=\"flex justify-center mt-20\">\n <AgentAvatar agentName={agentName} />\n </div>\n\n <div className=\"flex-grow flex flex-col justify-center\">\n <p className=\"text-center\">{title}</p>\n <p className=\"text-black text-center\" data-testid=\"am-name\">{agentName}</p>\n </div>\n\n <div className={`${styles.tileFooter} flex justify-center m-4 pt-4 space-x-4`}>\n <a href=\"tel:800.532.3327\" className=\"\" title=\"Call 800.532.3327\">\n <PhoneIcon className=\"w-8 text-black\" />\n </a>\n <div className=\"text-black w-full\" data-testid=\"am-phone\">{phone}</div>\n <a href={`mailto:${email}`} className=\"\" title={`Email ${email}`} data-testid=\"am-email\">\n <MailOutlineIcon className=\"w-8 text-black\" />\n </a>\n </div>\n </div>\n </Paper>\n );\n}\n\nexport default AccountManagerTile;\n","import { useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { compose, always } from 'ramda';\n\nimport { addHttpErrorNotification, addHttpSuccessNotification } from 'notifications/notifications.slice';\nimport store from 'store';\n\n/**\n * Get a function that can be used to trigger a success notification snackbar.\n *\n * @param msg this string is bound to the returned function so when you\n * @returns {() => void}\n */\nexport function useSuccessNotifier(msg: string) {\n const dispatch = useDispatch<typeof store.dispatch>();\n const [ successNotifier ] = useState(() => compose(\n dispatch,\n addHttpSuccessNotification,\n always(msg),\n ));\n\n return successNotifier;\n}\n\n/**\n * Get a function that can be used to trigger an error notification snackbar.\n *\n * @returns {(error: Error) => void}\n */\nexport function useErrorNotifier() {\n const dispatch = useDispatch<typeof store.dispatch>();\n const [ errorNotifier ] = useState(() => compose(dispatch, addHttpErrorNotification));\n\n return errorNotifier;\n}\n","import React, { ChangeEvent } from 'react';\nimport FormControl from '@mui/material/FormControl';\nimport InputLabel from '@mui/material/InputLabel';\nimport Select from '@mui/material/Select';\n\nimport { PlanYear } from './reports-tile.types';\n\ninterface PlanYearSelectProps {\n planYears: PlanYear[];\n value: number;\n onChange: (planYearId: number) => void;\n}\n\nfunction PlanYearSelect({ value, planYears, onChange }: PlanYearSelectProps): React.ReactElement {\n function handleChange(event: ChangeEvent<{ name?: string; value: unknown; }>) {\n const pyrid = parseInt('' + event.target.value);\n onChange(pyrid);\n }\n\n return (\n <FormControl variant=\"outlined\" className=\"w-full\">\n <InputLabel shrink id=\"plan-years-label\">Plan Year</InputLabel>\n <Select\n label=\"Plan Year\"\n labelId=\"plan-years-label\"\n onChange={handleChange as any}\n value={value}\n native\n >\n {planYears.map((py) => <option value={py.pyrid} key={py.pyrid}>{py.planYearName}</option>)}\n </Select>\n </FormControl>\n );\n}\n\nexport default PlanYearSelect;\n","import React from 'react';\nimport Button from '@mui/material/Button';\nimport DownloadIcon from '@mui/icons-material/SystemUpdateAlt';\nimport LoopIcon from '@mui/icons-material/Loop';\nimport SearchIcon from '@mui/icons-material/Search';\nimport { useHistory } from 'react-router-dom';\n\ninterface ParticipantCountSummaryProps {\n title: string;\n participants: number;\n loading: boolean;\n exportUri?: string;\n detailsPath?: string;\n className?: string;\n}\n\nfunction ParticipantCountSummary({\n title,\n loading,\n participants,\n exportUri = '',\n detailsPath = '',\n className = '',\n}: ParticipantCountSummaryProps): React.ReactElement {\n const history = useHistory();\n\n function handleExport() {\n // todo: there's another ticket for this\n }\n\n function handleDetails() {\n history.push(detailsPath);\n }\n\n function titleBarLink(): React.ReactElement {\n if (loading) {\n return <></>;\n }\n\n if (exportUri.length > 0) {\n return (\n <Button onClick={handleExport} className=\"p-0\">\n <p className=\"flex flex-row justify-center text-sm text-high-em\">\n <DownloadIcon className=\"mr-1\" fontSize=\"small\" /> Export\n </p>\n </Button>\n );\n }\n\n if (detailsPath.length > 0) {\n return (\n <Button onClick={handleDetails} className=\"p-0\">\n <p className=\"flex flex-row justify-center text-sm text-high-em\">\n <SearchIcon className=\"mr-1\" fontSize=\"small\" /> View Details\n </p>\n </Button>\n );\n }\n\n return <></>;\n }\n\n function content(): React.ReactElement {\n if (loading) {\n return (\n <div className=\"flex justify-center items-center flex-grow\">\n <LoopIcon className=\"animate-spin\" data-testid=\"noticeCountLoadingIcon\" />\n </div>\n );\n }\n\n return (\n <>\n <div className={`flex flex-col justify-center text-center p-3 w-full`}>\n <p className=\"text-high-em\">Pending Total</p>\n <h4 className=\"text-high-em\">{participants}</h4>\n </div>\n </>\n );\n }\n\n return (\n <div className={`${className} flex flex-col border border-solid border-gray-300 rounded-sm divide-y`}>\n <div className=\"flex flex-row justify-between align-middle py-2 px-4\">\n <p className=\"text-high-em\">{title}</p>\n {titleBarLink()}\n </div>\n <div className=\"flex flex-wrap xl:divide-x flex-grow\" >{content()}</div>\n </div>\n );\n}\n\nexport default ParticipantCountSummary;\n","import React, { ChangeEvent, useEffect, useState } from 'react';\nimport Select from '@mui/material/Select';\nimport dayjs, { Dayjs } from 'dayjs';\n\ninterface MonthSelectProps {\n // prefer YYYY-MM-DD, but any supported format is fine.\n startDate: Dayjs;\n endDate: Dayjs;\n format?: string; // Changes date format in options. See https://day.js.org/docs/en/display/format\n value?: string;\n onMonthChanged: (month: string) => void;\n [otherProp: string]: any;\n}\n\ninterface MonthSelectOption {\n value: string;\n key: string;\n label: string;\n}\n\nfunction MonthSelect({\n startDate,\n endDate,\n format = 'M/D/YYYY',\n value,\n onMonthChanged,\n ...rest\n}: MonthSelectProps): React.ReactElement {\n const [ options, setOptions ] = useState<MonthSelectOption[]>([]);\n\n useEffect(() => {\n function makeOpt(diff: number): MonthSelectOption {\n const month = startDate.add(diff, 'month');\n\n const labelStart = month.startOf('month').format(format);\n const labelEnd = month.endOf('month').format(format);\n\n const option = {\n value: month.format('YYYY-MM-01'),\n key: month.format('YYYY-MM'),\n label: `${labelStart} - ${labelEnd}`,\n };\n\n return option;\n }\n\n if (!startDate.isValid() || !endDate.isValid()) {\n return;\n }\n\n const opts: MonthSelectOption[] = [];\n const monthDiff = endDate.startOf('day').diff(dayjs(startDate).startOf('day'), 'month');\n\n // if diff is negative, startDate is before endDate. We interpret that as \"display a reverse order list of months\"\n if (monthDiff < 0) {\n for (let idx = 0; idx >= monthDiff; idx--) {\n const option = makeOpt(idx);\n opts.push(option);\n }\n } else {\n for (let idx = 0; idx <= monthDiff; idx++) {\n const option = makeOpt(idx);\n opts.push(option);\n }\n }\n\n setOptions(opts);\n }, [ startDate, endDate, format, onMonthChanged ]);\n\n function handleChange({ target: { value: val } }: ChangeEvent<{ name?: string; value: unknown; }>) {\n onMonthChanged(val as string);\n }\n\n return (\n <Select onChange={handleChange as any} className=\"w-full\" native {...rest} value={value}>\n {options.map((opt) => <option value={opt.value} key={opt.key}>{opt.label}</option>)}\n </Select>\n );\n}\n\nexport default MonthSelect;\n","import dayjs from 'dayjs';\n\nimport { PlanServiceSummary } from 'reports-tile/reports-tile.types';\nimport { ReportType } from 'reports/reports.types';\nimport request, { ContentType } from '../api-request';\nimport { BalanceAccountCount } from 'reports/balance/balance-account.types';\n\nexport function getReportTypes(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load report types for invalid company.'));\n }\n\n return request<ReportType[]>(`/api/companies/${companyId}/reports/report-types`);\n}\n\nexport function downloadReimbursementReport(\n companyId: number,\n planYearId: number,\n planCode: number,\n custom: boolean,\n startDate: string,\n endDate: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download report for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot download report for invalid plan year.'));\n }\n\n const exportUri = `/api/companies/${companyId}/reports/plan-years/${planYearId}/services/${planCode}/${custom}/`\n + `export?startDate=${startDate}&endDate=${endDate}`;\n\n return request(exportUri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n}\n\nexport function downloadReimbursementRecapReport\n(\n companyId: number,\n planYearId: number,\n planCode: number,\n startDate: string,\n endDate: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download report for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot download report for invalid plan year.'));\n }\n\n const exportUri = `/api/companies/${companyId}/reports/reimbursement-report/`\n + `${planYearId}/${planCode}/export?startDate=${startDate}&endDate=${endDate}`;\n\n return request(exportUri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n}\n\nexport function downloadNonPlanYearParticipantReport(\n companyId: number,\n type: 'retiree' | 'loa',\n startDate: string,\n endDate: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download report for invalid company.'));\n }\n\n const exportUri = `/api/companies/${companyId}/reports/${type}-participants/`\n + `export?startDate=${startDate}&endDate=${endDate}`;\n\n return request(exportUri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n}\n\nexport function downloadBalanceByLocationReport\n(\n companyId: number,\n planYearId: number,\n planCode: number,\n startDate: string,\n endDate: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download balance by location report for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot download balance by location report for invalid plan year.'));\n }\n\n const exportUri = `/api/companies/${companyId}/reports/balance-report-location/`\n + `${planYearId}/${planCode}/export?startDate=${startDate}&endDate=${endDate}`;\n\n return request(exportUri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n}\n\nexport function downloadBalanceByPayFrequencyReport\n(\n companyId: number,\n planYearId: number,\n planCode: number,\n startDate: string,\n endDate: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download balance by pay frequency report for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot download balance by pay frequency report for invalid plan year.'));\n }\n\n const exportUri = `/api/companies/${companyId}/reports/balance-report-pay-frequency/`\n + `${planYearId}/${planCode}/export?startDate=${startDate}&endDate=${endDate}`;\n\n return request(exportUri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n}\n\nexport function getServiceSummaries(companyId: number, planYearId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load service data for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot load service data for invalid plan year.'));\n }\n\n const uri = `/api/companies/${companyId}/reports/plan-years/${planYearId}/service-summaries`;\n\n return request<PlanServiceSummary[]>(uri);\n}\n\nexport function getEnrollmentSummary(\n companyId: number,\n planYearId: number,\n planCodeId: number,\n isCustom: boolean,\n startDate: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load enrollment data for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot load enrollment data for invalid plan year.'));\n }\n\n const uri = `/api/companies/${companyId}/reports/plan-years/${planYearId}/enrollments/${planCodeId}/${isCustom}` +\n `?startDate=${startDate}`;\n\n return request<number>(uri);\n}\n\nexport function downloadEnrollmentSummary(\n companyId: number,\n planYearId: number,\n planCodeId: number,\n isCustom: boolean,\n startDate: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load enrollment data for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot load enrollment data for invalid plan year.'));\n }\n\n const uri = `/api/companies/${companyId}/reports/plan-years/${planYearId}/enrollments/${planCodeId}/${isCustom}` +\n `/export?startDate=${startDate}`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n}\n\nexport function getBalanceReportCounts(\n companyId: number,\n planYearId: number,\n planCodeId: number,\n startDate: string,\n endDate: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load balance report data for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot load balance report data for invalid plan year.'));\n }\n\n const uri = `/api/companies/${companyId}/reports/balance-account-counts/${planYearId}/${planCodeId}` +\n `?startDate=${startDate}&endDate=${endDate}`;\n\n return request<BalanceAccountCount>(uri);\n}\n\nexport function getReductionListTotal(\n companyId: number,\n planYearId: number,\n planCodeId: number,\n payDate: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load reduction list total for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot load reduction list total for invalid plan year.'));\n }\n\n const date = dayjs(payDate, 'YYYY-MM-DD');\n\n if (!date.isValid()) {\n return Promise.reject(new Error('Cannot load reduction list total for invalid deduction date.'));\n }\n\n const uri = `/api/companies/${companyId}/reports/plan-years/${planYearId}/reduction-list-total/${planCodeId}` +\n `?payDate=${date.format('YYYY-MM-DD')}`;\n\n return request<number>(uri);\n}\n\nexport function downloadReductionList(\n companyId: number,\n planYearId: number,\n planCodeId: number,\n payDate: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download reduction list report for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot download reduction list report for invalid plan year.'));\n }\n\n const date = dayjs(payDate, 'YYYY-MM-DD');\n\n if (!date.isValid()) {\n return Promise.reject(new Error('Cannot download reduction list report for invalid deduction date.'));\n }\n\n const uri = `/api/companies/${companyId}/reports/plan-years/${planYearId}/reduction-list/${planCodeId}/export` +\n `?payDate=${date.format('YYYY-MM-DD')}`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n}\n\nexport function getDebitCardWarningsTotal(\n companyId: number,\n planYearId: number,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load debit card warnings total for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot load debit card warnings total for invalid plan year.'));\n }\n\n const uri = `/api/companies/${companyId}/reports/debit-card-warnings/${planYearId}`;\n\n return request<number>(uri);\n}\n\nexport function downloadDebitCardWarnings(\n companyId: number,\n planYearId: number,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download debit card warnings report for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot download debit card warnings report for invalid plan year.'));\n }\n\n const uri = `/api/companies/${companyId}/reports/debit-card-warnings/${planYearId}/export`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n}\n\nexport function getUnsubstantiatedDebitCardTotal(\n companyId: number,\n planYearId: number,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load unsubstantiated debit card total for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot load unsubstantiated debit card total for invalid plan year.'));\n }\n\n const uri = `/api/companies/${companyId}/reports/unsubstantiated-debit-card/${planYearId}`;\n\n return request<number>(uri);\n}\n\nexport function downloadUnsubstantiatedDebitCard(\n companyId: number,\n planYearId: number,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download unsubstantiated debit card report for invalid company.'));\n }\n\n if (planYearId <= 0) {\n return Promise.reject(new Error('Cannot download unsubstantiated debit card report for invalid plan year.'));\n }\n\n const uri = `/api/companies/${companyId}/reports/unsubstantiated-debit-card/${planYearId}/export`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n}\n","import dayjs from 'dayjs';\n\nexport function validateDate(message: string, date?: string) {\n const dateObj = date ? dayjs(date) : undefined;\n\n if (dateObj && !dateObj.isValid()) {\n throw new Error(message);\n }\n\n return dateObj;\n}\n","import { Dayjs } from 'dayjs';\n\n/* istanbul ignore next *//* I think it's low value to test this */\nexport default function reportQueryStringTag(\n strings: TemplateStringsArray,\n companyId: number,\n serviceType: string,\n start?: Dayjs,\n end?: Dayjs,\n) {\n let queryString = [];\n\n if (start) {\n queryString.push(`startDate=${start.format('YYYY-MM-DD')}`);\n }\n\n if (end) {\n queryString.push(`endDate=${end.format('YYYY-MM-DD')}`);\n }\n\n const base = `${strings[0]}${companyId}${strings[1]}${serviceType}${strings[2]}`;\n\n if (queryString.length) {\n return `${base}?${queryString.join('&')}`;\n }\n\n return base;\n}\n/* istanbul ignore stop */\n","import request, { ContentType } from 'shared/api-request';\nimport { validateDate } from './validateDate';\nimport queryStringTag from './reportQueryStringTag';\n\nexport function getActiveParticipantCount(\n companyId: number,\n serviceType: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load active participant total for invalid company.'));\n }\n\n const uri = `/api/companies/${companyId}/reports/active-participants/${serviceType}`;\n\n return request<number>(uri);\n}\n\nexport function downloadActiveParticipantsReport(\n companyId: number,\n serviceType: string,\n startDate?: string,\n endDate?: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download active participant report for invalid company.'));\n }\n\n try {\n const start = validateDate('Cannot download active participant report for invalid start date.', startDate);\n const end = validateDate('Cannot download active participant report for invalid end date.', endDate);\n const uri =\n queryStringTag`/api/companies/${companyId}/reports/active-participants/${serviceType}/export${start}${end}`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n } catch (err) {\n return Promise.reject(err);\n }\n}\n\nexport function downloadActiveParticipantsOneLineReport(\n companyId: number,\n serviceType: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download active participant one line report for invalid company.'));\n }\n\n const uri = `/api/companies/${companyId}/reports/active-participants/${serviceType}/one-line/export`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n}\n\nexport function downloadActiveParticipantsFullDataReport(\n companyId: number,\n serviceType: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download active participant full data report for invalid company.'));\n }\n\n const uri = `/api/companies/${companyId}/reports/active-participants/${serviceType}/full-data/export`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n}\n","import React, { useState, useEffect } from 'react';\nimport Button from '@mui/material/Button';\nimport DownloadIcon from '@mui/icons-material/SystemUpdateAlt';\nimport Skeleton from '@mui/material/Skeleton';\nimport dayjs, { Dayjs } from 'dayjs';\nimport { useSelector } from 'react-redux';\nimport MonthSelect from 'components/shared/MonthSelect';\nimport styles from './NonPlanYearServiceSummary.module.css';\nimport { getNonPlanYearServiceSummaryReport } from 'shared/api/nonPlanYearServicesApi';\nimport { noop } from 'shared/utils';\nimport { downloadNonPlanYearParticipantReport } from 'shared/api/reportsApi';\nimport { downloadActiveParticipantsReport } from 'shared/api/activeParticipantsApi';\nimport { NonPlanYearServiceSummaryReportResponse } from 'reports-tile/reports-tile.types';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\n\ninterface NonPlanYearServiceSummaryProps {\n startDate: string;\n endDate: string;\n title: string;\n exportType?: 'cobra' | 'retiree' | 'loa';\n apiUri: string;\n onLoaded: () => void;\n className?: string;\n data?: NonPlanYearServiceSummaryReportResponse | null;\n}\n\nconst defaultSummaryReportResponse: NonPlanYearServiceSummaryReportResponse = {\n activeParticipants: 0,\n noticesMailed: 0,\n paymentsProcessed: 0,\n};\n\nfunction NonPlanYearServiceSummary({\n startDate,\n endDate,\n title,\n apiUri,\n exportType,\n onLoaded,\n className = '',\n data = defaultSummaryReportResponse,\n}: NonPlanYearServiceSummaryProps): React.ReactElement {\n const [ month, setMonth ] = useState<Dayjs>();\n const [ loading, setLoading ] = useState(false);\n const [ summary, setSummary ] =\n useState<NonPlanYearServiceSummaryReportResponse | null>(defaultSummaryReportResponse);\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n const handleError = useErrorNotifier();\n\n async function getData(day: Dayjs) {\n const start = day.startOf('month');\n const end = day.endOf('month');\n\n setLoading(true);\n\n try {\n const result = (await getNonPlanYearServiceSummaryReport(apiUri, start, end)) || defaultSummaryReportResponse;\n\n setSummary(result);\n } catch (ex) {\n handleError(ex as Error);\n } finally {\n onLoaded();\n setLoading(false);\n }\n }\n\n function handleMonthChange(m: string) {\n const newMonth = dayjs(`${m}`);\n setMonth(newMonth);\n getData(newMonth);\n }\n\n useEffect(() => {\n setSummary(data);\n\n if (!!startDate) {\n setMonth(dayjs(startDate));\n }\n }, [ data, startDate ]);\n\n function handleExport() {\n if (compid && exportType) {\n let promise: Promise<unknown>;\n\n if (exportType === 'cobra') {\n promise = downloadActiveParticipantsReport(\n compid,\n exportType,\n month?.startOf('month').format('MM/DD/YYYY'),\n month?.endOf('month').format('MM/DD/YYYY'),\n );\n } else {\n promise = downloadNonPlanYearParticipantReport(\n compid,\n exportType,\n month?.startOf('month').format('MM/DD/YYYY') ?? '',\n month?.endOf('month').format('MM/DD/YYYY') ?? '',\n );\n }\n promise.then(noop)\n .catch(handleError);\n }\n }\n\n function exportLink() {\n if (compid && exportType && !loading) {\n return (\n <Button onClick={handleExport} className=\"p-0\">\n <p className=\"flex flex-row justify-center text-high-em text-sm\">\n <DownloadIcon className=\"mr-1\" fontSize=\"small\" /> Export\n </p>\n </Button>\n );\n }\n\n return <></>;\n }\n\n function content(): React.ReactElement {\n if (loading) {\n return (\n <>\n <Skeleton variant=\"rectangular\" className=\"basis-full h-full\" data-testid=\"reportLoadingSkeleton\" />\n </>\n );\n }\n\n return (\n <>\n <div className={`${styles.dataSection} basis-full xl:basis-1/2 px-4 xl:border-r`}>\n {\n <MonthSelect\n startDate={dayjs(startDate)}\n endDate={dayjs(endDate)}\n value={month?.format('YYYY-MM-01')}\n onMonthChanged={handleMonthChange}\n className=\"text-sm text-high-em\"\n />\n }\n </div>\n <div className={`${styles.dataSection} basis-full xl:basis-1/2 border-t xl:border-t-0`}>\n <p className=\"text-high-em\">Active Participants</p>\n <h4 className=\"text-high-em\">{summary?.activeParticipants ?? 0}</h4>\n </div>\n <div className={`${styles.dataSection} basis-full xl:basis-1/2 border-t xl:border-r`}>\n <p className=\"text-high-em\">Notices Mailed</p>\n <h4 className=\"text-high-em\">{summary?.noticesMailed ?? 0}</h4>\n </div>\n <div className={`${styles.dataSection} basis-full xl:basis-1/2 border-t`}>\n <p className=\"text-high-em\">Payments Processed</p>\n <h4 className=\"text-high-em\">{summary?.paymentsProcessed ?? 0}</h4>\n </div>\n </>\n );\n }\n\n return (\n <div className={`${className} ${styles.summaryContainer} divide-y`} data-testid={title}>\n <div className=\"flex flex-row justify-between align-middle py-2 px-4\">\n <p className=\"text-high-em\">{title}</p>\n {exportLink()}\n </div>\n <div className=\"flex flex-wrap flex-grow\" >{content()}</div>\n </div>\n );\n}\n\nexport default NonPlanYearServiceSummary;\n","import { Dayjs } from 'dayjs';\nimport request from '../api-request';\nimport { NonPlanYearServiceSummaryReportResponse, NonPlanYearServicesResponse } from 'reports-tile/reports-tile.types';\n\nexport function getNonPlanYearServiceSummaryReport(apiUri: string, startDate: Dayjs, endDate: Dayjs) {\n return request<NonPlanYearServiceSummaryReportResponse>(apiUri, {\n method: 'GET',\n queryParams: {\n startDate: startDate.format('YYYY-MM-DD'),\n endDate: endDate.format('YYYY-MM-DD'),\n },\n });\n}\n\nexport function getNonPlanYearServicesSummary(compid: number | undefined, startDate: Dayjs, endDate: Dayjs) {\n if (!compid) {\n return Promise.reject(new Error('Invalid compid.'));\n }\n const apiUri = `/api/companies/${compid}/reports/non-plan-year-services-summary`;\n\n return request<NonPlanYearServicesResponse>(apiUri, {\n method: 'GET',\n queryParams: {\n startDate: startDate.format('YYYY-MM-DD'),\n endDate: endDate.format('YYYY-MM-DD'),\n },\n });\n}\n","import { useState } from 'react';\nimport { compose, F, T, tap } from 'ramda';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\n\nexport function useDownloading(downloadApi: Function, params: any) {\n const [ downloading, setDownloading ] = useState(false);\n const doneDownloading = compose(setDownloading, F);\n const startDownloading = compose(setDownloading, T);\n\n const errorNotifier = useErrorNotifier();\n const handleError = compose(tap(doneDownloading), errorNotifier);\n\n function handleExport() {\n startDownloading();\n downloadApi(params)\n .then(doneDownloading)\n .catch(handleError);\n }\n\n return { downloading, handleExport };\n}\n\n","import React from 'react';\nimport SaveAltIcon from '@mui/icons-material/SaveAlt';\nimport IconButton from '@mui/material/IconButton';\nimport { downloadFmlaExcel } from 'shared/api/fmlaReportsApi';\nimport { FmlaCompanyIdDatesAndReportType } from 'reports/fmla/fmla-report-types';\nimport { useDownloading } from 'shared/custom-hooks/useDownloading';\nimport { isNil } from 'ramda';\n\ninterface FmlaSummaryTileProps {\n title: string;\n className?: string;\n reportData: FmlaCompanyIdDatesAndReportType;\n count: number | null;\n}\n\nfunction FmlaSummaryTile({\n title,\n className = '',\n reportData,\n count,\n}: Readonly<FmlaSummaryTileProps>): React.ReactElement {\n const { handleExport } = useDownloading(downloadFmlaExcel, { ...reportData });\n\n return (\n <div className={className} data-testid={`${reportData.reportType}-tile`}>\n <div className=\"flex justify-end mb-4\">\n <IconButton\n size=\"small\"\n type=\"button\"\n data-testid={`${reportData.reportType}-export-btn`}\n onClick={handleExport}\n disabled={isNil(count)}\n >\n <SaveAltIcon fontSize=\"small\" />\n </IconButton>\n </div>\n <p className=\"text-high-em\">{title}</p>\n <h4 className=\"text-high-em\">{count}</h4>\n </div>\n );\n}\n\nexport default FmlaSummaryTile;\n","import React, { useEffect } from 'react';\nimport styles from './NonPlanYearServiceSummary.module.css';\nimport FmlaSummaryTile from './FmlaSummaryTile';\nimport { fetchFMLAReportCountsForDashboard } from 'reports/fmla/fmla-reports.thunks';\nimport { useDispatch, useSelector } from 'react-redux';\nimport store from 'store';\nimport { selectNonFilterableFetchFmlaReportCountsStatus, selectReportsCounts } from 'reports/fmla/fmla-reports-slice';\nimport { equals } from 'ramda';\nimport Skeleton from '@mui/material/Skeleton';\nimport { selectSelectedCompany } from 'companies/companies.slice';\n\nfunction FmlaSummary(): React.ReactElement {\n const dispatch = useDispatch<typeof store.dispatch>();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const fetchFmlaCountsStatus = useSelector(selectNonFilterableFetchFmlaReportCountsStatus);\n const reportCounts = useSelector(selectReportsCounts);\n const loaded = equals(fetchFmlaCountsStatus, 'fulfilled');\n\n useEffect(() => {\n dispatch(fetchFMLAReportCountsForDashboard({ compid }));\n }, [ dispatch, compid ]);\n\n return (\n <>\n {\n !loaded\n ? (\n <Skeleton variant=\"rectangular\" height={396} className=\"w-1/2\" data-testid=\"fmla-skeleton\" />\n )\n : (\n <div className={`${styles.summaryContainer} w-1/2 divide-y`} data-testid=\"fmla-summary\">\n <div className=\"flex flex-row justify-between align-middle py-2 px-4\">\n <p className=\"text-high-em\">Leave Solutions</p>\n </div>\n <div className=\"flex flex-wrap flex-grow\" >\n <FmlaSummaryTile\n className={`${styles.dataSection} basis-full xl:basis-1/2 px-4 xl:border-r justify-start`}\n title=\"Open Cases\"\n reportData={ { compid, reportType: 'open-cases' } }\n count={reportCounts.allOpenLeaveCaseListCount}\n />\n <FmlaSummaryTile\n className={`${styles.dataSection} basis-full xl:basis-1/2 border-t xl:border-t-0 justify-start`}\n title=\"Intermittent Absences in Past 2 Weeks\"\n reportData={ { compid, reportType: 'intermittent-leave-cases' } }\n count={reportCounts.intermittentLeaveCaseListCount}\n />\n <FmlaSummaryTile\n className={`${styles.dataSection} basis-full xl:basis-1/2 border-t xl:border-r justify-start`}\n title=\"Action Needed\"\n reportData={ { compid, reportType: 'action-needed' } }\n count={reportCounts.pendingInfoCount}\n />\n <FmlaSummaryTile\n className={`${styles.dataSection} basis-full xl:basis-1/2 border-t justify-start`}\n title=\"Return to Work Confirmation Needed\"\n reportData={ { compid, reportType: 'rtw-confirmation-needed' } }\n count={reportCounts.returnToWorkConfirmationCount}\n />\n </div>\n </div>\n )\n }\n </>\n );\n}\n\nexport default FmlaSummary;\n","import React, { useEffect, useRef, useState } from 'react';\nimport Skeleton from '@mui/material/Skeleton';\nimport dayjs, { Dayjs } from 'dayjs';\nimport ParticipantCountSummary from './ParticipantCountSummary';\nimport NonPlanYearServiceSummary from './NonPlanYearServiceSummary';\nimport FmlaSummary from './FmlaSummary';\nimport { NonPlanYearServicesResponse } from 'reports-tile/reports-tile.types';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { getNonPlanYearServicesSummary } from 'shared/api/nonPlanYearServicesApi';\nimport { useSelector } from 'react-redux';\n\nfunction NonPlanYearServices(): React.ReactElement {\n const [ loading, setLoading ] = useState(false);\n const [ nypsStart, setNypsStart ] = useState<Dayjs | null>(null);\n const [ nypsEnd, setNypsEnd ] = useState<Dayjs | null>(null);\n const [ areChildrenLoading, setAreChildrenLoading ] = useState(true);\n const [ data, setData ] = useState<NonPlanYearServicesResponse | null>(null);\n\n const mountedRef = useRef<boolean>();\n const { compid, hasFmla } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n const handleError = useErrorNotifier();\n\n function onChildrenLoaded () {\n setAreChildrenLoading(false);\n }\n\n useEffect(() => {\n // calculate these once on mount\n // default selection should be previous month, range should be prior 12 months\n setNypsStart(dayjs().startOf('month').subtract(1, 'month'));\n setNypsEnd(dayjs().startOf('month').subtract(13, 'month'));\n }, []);\n\n useEffect(() => {\n mountedRef.current = true;\n\n async function getServices(): Promise<void> {\n try {\n if (!nypsStart) {\n return;\n }\n setLoading(true);\n const start = nypsStart.startOf('month');\n const end = nypsStart.endOf('month');\n\n const response = await getNonPlanYearServicesSummary(compid, start, end);\n\n if (mountedRef.current) {\n setData(response);\n }\n } catch (ex) {\n if (mountedRef.current) {\n handleError(ex as Error);\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n onChildrenLoaded();\n }\n }\n }\n\n if (!!compid && !!nypsStart) {\n getServices();\n }\n\n return () => {\n mountedRef.current = false;\n };\n }, [ compid, nypsStart, handleError ]);\n\n function cobraSummary(): React.ReactElement {\n if (data?.services.hasCobra) {\n return (\n <NonPlanYearServiceSummary\n className=\"w-1/2\"\n startDate={nypsStart?.format('YYYY-MM-DD') ?? ''}\n endDate={nypsEnd?.format('YYYY-MM-DD') ?? ''}\n title=\"COBRA\"\n apiUri={`/api/companies/${compid}/reports/cobra-summary`}\n exportType=\"cobra\"\n onLoaded={onChildrenLoaded}\n data={data.summaries.cobra}\n />\n );\n }\n\n return <></>;\n }\n\n function cobraCounts(): React.ReactElement {\n if (data?.services.hasCobra) {\n return (\n <div className=\"flex flex-col justify-start w-1/2\" data-testid=\"cobraCounts\">\n <ParticipantCountSummary\n className=\"mb-4\"\n title=\"Pending COBRA QE Notices\"\n loading={loading}\n participants={data.notices.qeParticipants}\n detailsPath=\"/pending-qe-notices\"\n />\n\n <ParticipantCountSummary\n title=\"Pending COBRA Initial Notices\"\n participants={data.notices.initialNotices}\n loading={loading}\n detailsPath=\"/pending-initial-notices\"\n />\n </div>\n );\n }\n\n return <></>;\n }\n\n function retireeSummary(): React.ReactElement {\n if (data?.services.hasRetiree) {\n return (\n <NonPlanYearServiceSummary\n className=\"w-1/2\"\n startDate={nypsStart?.format('YYYY-MM-DD') ?? ''}\n endDate={nypsEnd?.format('YYYY-MM-DD') ?? ''}\n title=\"Retiree Billing\"\n apiUri={`/api/companies/${compid}/reports/retiree-summary`}\n exportType=\"retiree\"\n onLoaded={onChildrenLoaded}\n data={data.summaries.retiree}\n />\n );\n }\n\n return <></>;\n }\n\n function loaSummary(): React.ReactElement {\n if (data?.services.hasLOA) {\n return (\n <NonPlanYearServiceSummary\n className=\"w-1/2\"\n startDate={nypsStart?.format('YYYY-MM-DD') ?? ''}\n endDate={nypsEnd?.format('YYYY-MM-DD') ?? ''}\n title=\"LOA Billing\"\n apiUri={`/api/companies/${compid}/reports/loa-summary`}\n exportType=\"loa\"\n onLoaded={onChildrenLoaded}\n data={data.summaries.loa}\n />\n );\n }\n\n return <></>;\n }\n\n function fmlaSummary(): React.ReactElement {\n if (hasFmla) {\n return (\n <FmlaSummary />\n );\n }\n\n return <></>;\n }\n\n return (\n <>\n {\n // When one child invokes onChildrenLoaded() it removes this spinner\n areChildrenLoading\n ? (\n <>\n <Skeleton variant=\"rectangular\" height={570} className=\"basis-full\" data-testid=\"nonPlanYearSkeleton\" />\n </>\n )\n : <></>\n }\n <div className=\"flex flex-wrap space-y-4\">\n <div className=\"flex w-full space-x-4\">\n {cobraSummary()}\n {cobraCounts()}\n </div>\n\n <div className=\"flex w-full space-x-4\">\n {retireeSummary()}\n {loaSummary()}\n </div>\n\n <div className=\"flex w-full space-x-4\">\n {fmlaSummary()}\n <div className=\"w-1/2\" />\n </div>\n </div>\n </>\n );\n}\n\nexport default NonPlanYearServices;\n","import React from 'react';\nimport { VictoryPie, VictoryLabel } from 'victory';\n\nexport interface DataPoint {\n label: string;\n value: number;\n}\n\ninterface CenterLabelDonutChartProps {\n chartData: DataPoint[];\n centerItem?: number;\n formatter?: Intl.NumberFormat;\n radius?: number;\n innerRadius?: number;\n colorScale?: string[];\n fontSize?: number;\n width?: number;\n height?: number;\n}\n\nconst defaultColors = [\n '#1976D2',\n '#37A52E',\n '#5198DD',\n '#4886C4',\n '#3F75AA',\n '#366391',\n '#2C5277',\n '#192F44',\n '#006CC6',\n '#0088F9',\n];\n\nfunction CenterLabelDonutChart({\n chartData,\n centerItem = -1,\n radius = 110,\n innerRadius = 90,\n colorScale = defaultColors,\n formatter,\n fontSize = 20,\n width,\n height,\n}: CenterLabelDonutChartProps): React.ReactElement {\n function labelRadius(): number {\n return innerRadius - radius;\n }\n\n function labels({ index }: {index: number;}): string | string[] {\n if (centerItem < 0 || centerItem >= chartData.length) {\n return '';\n }\n\n if (index === 0) {\n let value = chartData[centerItem].value + '';\n\n if (formatter) {\n value = formatter.format(chartData[centerItem].value);\n }\n\n return [ chartData[centerItem].label, value ];\n }\n\n return '';\n }\n\n function centerHighlightFill(): string {\n if (centerItem < 0 || centerItem >= chartData.length) {\n return colorScale[0];\n }\n\n const index = centerItem % colorScale.length;\n\n return colorScale[index];\n }\n\n return (\n <VictoryPie\n data={chartData.map((d) => ({ y: d.value }))}\n labelRadius={labelRadius}\n radius={radius}\n innerRadius={innerRadius}\n labelPlacement=\"vertical\"\n labelPosition=\"startAngle\"\n labels={labels}\n labelComponent={\n <VictoryLabel\n renderInPortal\n style={[\n {\n fill: 'black',\n fontSize: fontSize,\n fontFamily: 'Roboto',\n },\n {\n fill: centerHighlightFill(),\n fontSize: fontSize * 1.5,\n fontFamily: 'Roboto',\n fontWeight: 500,\n },\n ]}\n backgroundStyle={[\n { fill: 'white', opacity: 1 },\n ]}\n />\n }\n colorScale={colorScale}\n padAngle={2}\n padding={0}\n width={width}\n height={height}\n />\n );\n}\n\nexport default CenterLabelDonutChart;\n","import React, { useEffect, useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport Button from '@mui/material/Button';\nimport DownloadIcon from '@mui/icons-material/SystemUpdateAlt';\n\nimport CenterLabelDonutChart, { DataPoint } from 'components/shared/CenterLabelDonutChart';\nimport { currencyFormatter, noop } from 'shared/utils';\nimport { PlanServiceSummary } from 'reports-tile/reports-tile.types';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { downloadReimbursementReport } from 'shared/api/reportsApi';\n\ninterface ReimbursementPlanSummaryProps {\n title: string;\n participants: number;\n showExport?: boolean;\n summary: PlanServiceSummary;\n annualTotals?: number;\n reimbursements?: number;\n}\n\nfunction ReimbursementPlanSummary({\n title,\n summary,\n showExport = true,\n participants,\n annualTotals,\n reimbursements,\n}: ReimbursementPlanSummaryProps): React.ReactElement {\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n const handleError = useErrorNotifier();\n const [ chartData, setChartData ] = useState<DataPoint[]>([]);\n\n useEffect(() => {\n setChartData([\n {\n label: 'Reimbursements',\n value: reimbursements ?? 0,\n },\n {\n label: '',\n value: (annualTotals ?? 0) - (reimbursements ?? 0),\n },\n ]);\n }, [ reimbursements, annualTotals ]);\n\n function handleExport() {\n downloadReimbursementReport(\n compid ?? -2,\n summary.pyrid,\n summary.plcid,\n summary.type === 'custom',\n summary.startDate,\n summary.endDate,\n )\n .then(noop)\n .catch(handleError);\n }\n\n function exportLink(): React.ReactElement {\n return showExport\n ? (\n <Button onClick={handleExport} className=\"p-0\">\n <p className=\"flex flex-row justify-center text-high-em text-sm\">\n <DownloadIcon className=\"mr-1\" fontSize=\"small\" /> Export\n </p>\n </Button>\n )\n : <></>;\n }\n\n return (\n <div className=\"border border-solid border-gray-300 rounded-sm p-2\">\n <div className=\"flex justify-between mb-4\">\n <p className=\"text-high-em text-sm\">{title}</p>\n <div className=\"flex-grow\" />\n {exportLink()}\n </div>\n <div className=\"flex\">\n { annualTotals ?\n (\n <div className=\"w-1/2\" >\n <CenterLabelDonutChart\n chartData={chartData}\n centerItem={0}\n formatter={currencyFormatter}\n radius={150}\n innerRadius={125}\n fontSize={30}\n width={300}\n height={300}\n />\n </div>\n )\n : (<></>)\n }\n <div className={`${annualTotals ? 'w-1/2' : 'w-full'} flex flex-col justify-center\"`}>\n <div className={`${annualTotals ? 'mb-8' : 'mb-4'} text-center`}>\n <p className=\"text-high-em text-lg\">Total Participants</p>\n <p className=\"text-high-em text-3xl\">{participants}</p>\n </div>\n {\n annualTotals\n ? (\n <div className= \"text-center\">\n <p className=\"text-high-em text-lg\">Annual Totals</p>\n <p className=\"text-high-em text-3xl\">{currencyFormatter.format(annualTotals)}</p>\n </div>\n )\n : <></>\n }\n </div>\n </div>\n </div>\n );\n}\n\nexport default ReimbursementPlanSummary;\n","import React, { useEffect, useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport Skeleton from '@mui/material/Skeleton';\nimport Paper from '@mui/material/Paper';\nimport { compose, T, F } from 'ramda';\n\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport PlanYearSelect from './PlanYearSelect';\nimport { PlanServiceSummary, PlanYear } from './reports-tile.types';\nimport NonPlanYearServices from './non-plan-year/NonPlanYearServices';\nimport ReimbursementPlanSummary from './plan-year/ReimbursementPlanSummary';\nimport { getServiceSummaries } from 'shared/api/reportsApi';\nimport { getPlanYears } from 'shared/api/planYearsApi';\n\nfunction ReportsTile(): React.ReactElement {\n const [ loading, setLoading ] = useState(false);\n const [ startLoading ] = useState(() => compose(setLoading, T));\n const [ doneLoading ] = useState(() => compose(setLoading, F));\n const [ planYears, setPlanYears ] = useState<PlanYear[]>([]);\n const [ selectedPlanYearId, setSelectedPlanYearId ] = useState(-1);\n const [ serviceSummaries, setServiceSummaries ] = useState<PlanServiceSummary[]>([]);\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n const handleError = useErrorNotifier();\n\n // initial plan year load for select\n useEffect(() => {\n if (compid) {\n startLoading();\n getPlanYears(compid)\n .then((py) => {\n setPlanYears(py ?? []);\n\n if ((py ?? [])[0]?.pyrid) {\n setSelectedPlanYearId(py![0].pyrid);\n }\n })\n .catch(handleError)\n .finally(doneLoading);\n }\n }, [ compid, handleError, startLoading, doneLoading ]);\n\n // respond to selected plan year change by loading details\n useEffect(() => {\n if (compid && selectedPlanYearId !== -1) {\n startLoading();\n getServiceSummaries(compid, selectedPlanYearId)\n .then((summaries) => setServiceSummaries(summaries ?? []))\n .catch(handleError)\n .finally(doneLoading);\n }\n }, [ compid, handleError, selectedPlanYearId, startLoading, doneLoading ]);\n\n function serviceSummaryContent(): React.ReactElement {\n return (\n <div className=\"w-full flex flex-wrap\">\n {serviceSummaries.map((summary, index) => {\n return (\n <div className={`w-1/2 mb-4 ${index % 2 ? 'pl-2' : 'pr-2'}`} key={summary.plcid}>\n <ReimbursementPlanSummary\n title={summary.name}\n reimbursements={summary.reimbursements}\n annualTotals={summary.annualTotals}\n participants={summary.participants}\n summary={summary}\n />\n </div>\n );\n })}\n </div>\n );\n }\n\n // conditional render\n function content(): React.ReactElement {\n if (loading) {\n return (\n <>\n <Skeleton variant=\"rectangular\" height={570} data-testid=\"reportTileSkeleton\" />\n </>\n );\n }\n\n if (selectedPlanYearId === -1) {\n return (\n <>\n <NonPlanYearServices />\n </>\n );\n }\n\n return serviceSummaryContent();\n }\n\n return (\n <Paper className=\"p-4\">\n <div className=\"flex justify-between mb-4\">\n <p className=\"text-high-em w-1/2 mr-4\">Reports</p>\n <div className=\"w-1/2\">\n {\n !loading && (\n <PlanYearSelect\n planYears={planYears}\n onChange={setSelectedPlanYearId}\n value={selectedPlanYearId}\n />\n )\n }\n </div>\n </div>\n {content()}\n </Paper>\n );\n}\n\nexport default ReportsTile;\n","import request from '../api-request';\nimport { PlanYear } from 'reports-tile/reports-tile.types';\n\nexport function getPlanYears(companyId: number) {\n return request<PlanYear[]>(`/api/companies/${companyId}/plan-years`);\n}\n","import { useHistory } from 'react-router-dom';\nimport SearchIcon from '@mui/icons-material/Search';\nimport Button from '@mui/material/Button';\nimport { always, compose, cond, equals, gt, lte } from 'ramda';\n\ninterface HsaContributionsNotForwardedCardProps {\n count: number;\n}\n\nfunction HsaContributionsNotForwardedCard({ count }: HsaContributionsNotForwardedCardProps) {\n const history = useHistory();\n\n const isBlue = equals<number>(0);\n const isYellow = (c: number) => gt(c, 0) && lte(c, 10);\n const isRed = (c: number) => gt(c, 10);\n\n // tailwind will not compile these classes if they are not used elsewhere\n // so instead of template stringing text and border this is to ensure\n // that these classes get compiled.\n const borderColor = cond<number, string>([\n [ isBlue, always('border-primary-main') ],\n [ isYellow, always('border-yellow-400') ],\n [ isRed, always('border-red-600') ],\n ])(count);\n\n const countColor = cond<number, string>([\n [ isBlue, always('text-primary-main') ],\n [ isYellow, always('text-yellow-400') ],\n [ isRed, always('text-red-600') ],\n ])(count);\n\n return count > 0\n ? (\n <div className={`w-full border border-solid ${ borderColor } rounded p-4`}>\n <div>\n <div className=\"flex justify-between\">\n <div className={`text-2xl ${ countColor } font-bold not-forwarded-count`}>\n { count }\n </div>\n <div className=\"flex\">\n <Button className=\"p-0\">\n <p\n onClick={compose(\n history.push,\n always('action-items/hsa-not-forwarded'),\n )}\n className=\"flex text-sm text-high-em\"\n >\n <SearchIcon className=\"mr-1\" fontSize=\"small\" />\n View Details\n </p>\n </Button>\n </div>\n </div>\n <div className=\"font-semibold\">\n HSA Contributions Not Forwarded\n </div>\n </div>\n </div>\n )\n : <></>;\n}\n\nexport default HsaContributionsNotForwardedCard;\n","import { useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { equals, ifElse, always, compose, gt } from 'ramda';\nimport Paper from '@mui/material/Paper';\nimport Skeleton from '@mui/material/Skeleton';\n\nimport HsaContributionsNotForwardedCard from 'action-items/action-item-cards/HsaContributionsNotForwardedCard';\nimport {\n selectContributionsNotForwardedCount,\n selectContributionsNotForwardedFetchStatus,\n} from './action-items.slice';\nimport { fetchHsaContributionsNotForwarded } from 'action-items/action-items.thunks';\nimport store from 'store';\nimport { selectSelectedCompany } from 'companies/companies.slice';\n\nfunction ActionItems() {\n const dispatch = useDispatch<typeof store.dispatch>();\n const { compid: companyId } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const fetchStatus = useSelector(selectContributionsNotForwardedFetchStatus);\n const hsaContributionsCount = useSelector(selectContributionsNotForwardedCount);\n\n useEffect(() => {\n dispatch(fetchHsaContributionsNotForwarded(companyId));\n }, [ dispatch, companyId ]);\n\n let showCardLoading = always(<Skeleton variant=\"rectangular\" width=\"100%\" height={176} />);\n let showActionItems = always(\n <Paper className=\"p-4 action-items-container\">\n <div className=\"flex justify-between mb-4\">\n <p className=\"text-high-em w-1/2\">Action Items</p>\n </div>\n <div className=\"w-full flex flex-wrap\">\n <HsaContributionsNotForwardedCard count={hsaContributionsCount} />\n </div>\n </Paper>,\n );\n let showNothing = always(<></>);\n\n let maybeShowCard = compose(\n ifElse(\n gt(hsaContributionsCount),\n showActionItems,\n showNothing,\n ),\n always(0),\n );\n\n return ifElse(\n equals('pending'),\n showCardLoading,\n maybeShowCard,\n )(fetchStatus);\n}\n\nexport default ActionItems;\n","import React from 'react';\nimport Paper from '@mui/material/Paper';\nimport Typography from '@mui/material/Typography';\nimport Button from '@mui/material/Button';\nimport { Slide } from './marketing-info-tile.types';\n\ninterface EmblaCarouselSlideProps {\n slide: Slide;\n}\n\nfunction EmblaCarouselSlide({ slide }: Readonly<EmblaCarouselSlideProps>): React.ReactElement {\n function renderImage(): React.ReactElement {\n if (slide.image) {\n return (\n <div data-testid={`slide-image-${slide.unqid}`}\n className=\"flex items-end w-2/3 h-2/3 ml-2 bg-contain bg-bottom bg-no-repeat\" style={\n {\n backgroundImage: `url(${slide.image})`,\n } }\n />\n );\n } else {\n return (<></>);\n }\n }\n\n function renderAction1Button(): React.ReactElement {\n if (slide.action1Link && slide.action1Label) {\n return (\n <div className=\"flex justify-left mt-5\" data-testid={`slide-button-1-${slide.unqid}`}>\n <Button size=\"small\" variant=\"contained\" color=\"secondary\"\n href={slide.action1Link} target=\"_blank\" className=\"text-sm\"\n >{slide.action1Label}\n </Button>\n </div>\n );\n }\n\n return <></>;\n }\n\n function renderAction2Button(): React.ReactElement {\n if (slide.action2Link && slide.action2Label) {\n return (\n <div className=\"flex justify-left mt-5 ml-3\" data-testid={`slide-button-2-${slide.unqid}`}>\n <Button size=\"small\" variant=\"contained\" color=\"secondary\"\n href={slide.action2Link} className=\"text-sm\"\n >{slide.action2Label}\n </Button>\n </div>\n );\n }\n\n return <></>;\n }\n\n return (\n <div className=\"embla__slide basis-full flex-shrink-0 flex-grow-0\">\n <Paper\n className=\"p-5 h-full\"\n style={ { backgroundColor: slide.backgroundColor } }\n >\n <div className=\"flex h-full\">\n <div className=\"flex flex-col justify-between\">\n <div className=\"flex\">\n <Typography variant=\"h5\" style={ { color: slide.textColor, fontWeight: 'bold' } }>\n {slide.headline}\n </Typography>\n </div>\n <div className=\"flex\">\n <Typography variant=\"body2\" style={ { color: slide.textColor } }>\n {slide.paragraph}\n </Typography>\n </div>\n <div className=\"flex\">\n { renderAction1Button() }\n { renderAction2Button() }\n </div>\n </div>\n { renderImage() }\n </div>\n </Paper>\n </div>\n );\n}\n\nexport default EmblaCarouselSlide;\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport useEmblaCarousel from 'embla-carousel-react';\nimport Autoplay from 'embla-carousel-autoplay';\nimport store from 'store';\nimport Skeleton from '@mui/material/Skeleton';\nimport Button from '@mui/material/Button';\nimport MobileStepper from '@mui/material/MobileStepper';\nimport KeyboardArrowRight from '@mui/icons-material/KeyboardArrowRight';\nimport KeyboardArrowLeft from '@mui/icons-material/KeyboardArrowLeft';\nimport {\n selectFetchSlidesStatus,\n selectSlides,\n} from 'marketing-info-tile/slideshow.slice';\nimport { fetchSlides } from 'marketing-info-tile/slideshow.thunks';\nimport EmblaCarouselSlide from './EmblaCarouselSlide';\n\ninterface EmblaCarouselProps {\n delay?: number;\n}\n\nfunction EmblaCarousel({ delay = 10000 }: Readonly<EmblaCarouselProps>): React.ReactElement {\n const dispatch = useDispatch<typeof store.dispatch>();\n const [ emblaRef, emblaApi ] = useEmblaCarousel(\n { loop: true },\n [\n Autoplay({\n playOnInit: true,\n delay,\n stopOnMouseEnter: true,\n stopOnInteraction: false,\n }),\n ],\n );\n const [ selectedIndex, setSelectedIndex ] = useState(0);\n const fetchStatus = useSelector(selectFetchSlidesStatus);\n const slides = useSelector(selectSlides);\n\n const handleClick = useCallback(() => {\n if (emblaApi) {\n setSelectedIndex(emblaApi.selectedScrollSnap());\n const { autoplay } = emblaApi.plugins();\n autoplay?.reset();\n }\n }, [ emblaApi ]);\n\n const scrollNext = useCallback(() => {\n if (emblaApi) {\n emblaApi.scrollNext();\n handleClick();\n }\n }, [ emblaApi, handleClick ]);\n\n const scrollPrev = useCallback(() => {\n if (emblaApi) {\n emblaApi.scrollPrev();\n handleClick();\n }\n }, [ emblaApi, handleClick ]);\n\n const onSlideChange = useCallback(() => {\n if (emblaApi) {\n setSelectedIndex(emblaApi.selectedScrollSnap());\n }\n }, [ emblaApi ]);\n\n useEffect(() => {\n if (emblaApi) {\n emblaApi.on('select', onSlideChange);\n }\n });\n\n useEffect(() => {\n dispatch(fetchSlides());\n }, [ dispatch ]);\n\n function renderSlideNavigation(): React.ReactElement {\n if (slides.length > 0) {\n return (\n <MobileStepper\n className=\"embla__controls\"\n data-testid=\"carousel-controls\"\n steps={slides.length}\n position=\"static\"\n variant=\"dots\"\n activeStep={selectedIndex}\n nextButton={\n <Button size=\"small\" onClick={scrollNext} data-testid=\"carousel-next-btn\">\n Next <KeyboardArrowRight />\n </Button>\n }\n backButton={\n <Button size=\"small\" onClick={scrollPrev} data-testid=\"carousel-back-btn\">\n <KeyboardArrowLeft /> Back\n </Button>\n }\n />\n );\n }\n\n return <></>;\n }\n\n return fetchStatus === 'fulfilled'\n ? (\n <>\n { renderSlideNavigation() }\n <div className=\"embla overflow-hidden\" ref={emblaRef}>\n <div className=\"embla__container flex\">\n {\n slides.length > 0\n ? slides.map((slide, index) => {\n return (<EmblaCarouselSlide slide={slide} key={`slide-${slide.unqid}}`} />);\n })\n : <></>\n }\n </div>\n </div>\n </>\n )\n : <Skeleton variant=\"rectangular\" width=\"100%\" height={350} />;\n}\n\nexport default EmblaCarousel;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport AccountManagerTile from 'account-manager-tile/AccountManagerTile';\nimport ReportsTile from 'reports-tile/ReportsTile';\nimport ActionItems from 'action-items/ActionItems';\nimport EmblaCarousel from 'marketing-info-tile/EmblaCarousel';\n\nfunction Dashboard(): React.ReactElement {\n const company = useSelector(selectSelectedCompany);\n\n return (\n <div data-testid=\"dashboard\" className=\"p-4 flex flex-wrap basis-full\">\n <div className=\"xl:w-2/3 sm:w-full \">\n <div className=\"\">\n <ReportsTile />\n </div>\n <div className=\"mt-2\">\n <ActionItems />\n </div>\n </div>\n\n <div className=\"flex xl:w-1/3 xl:pl-4 xl:mt-0 sm:w-full sm:mt-4 space-y-5 flex-col \">\n <div className=\"xl:w-full sm:w-1/2 \">\n <EmblaCarousel />\n </div>\n {\n !company?.isFmlaOnly &&\n <div className=\"xl:w-full sm:w-1/2 \" data-testid=\"am-card\">\n <AccountManagerTile\n agentName={company?.fullname}\n email={company?.emailaddress}\n title=\"If you are in need of further assistance, please contact\"\n phone=\"800.532.3327\"\n />\n </div>\n }\n {\n company?.hasFmla &&\n <div className=\"xl:w-full sm:w-1/2 \" data-testid=\"ls-card\">\n <AccountManagerTile\n agentName={company.fmlaConsultant?.name}\n email={company.fmlaConsultant?.email}\n title=\"Your Dedicated Leave Solutions Consultant\"\n phone={company.fmlaConsultant?.phone}\n />\n </div>\n }\n </div>\n </div>\n );\n}\n\nexport default Dashboard;\n","import Stepper from '@mui/material/Stepper';\nimport Step from '@mui/material/Step';\nimport StepConnector from '@mui/material/StepConnector';\nimport CheckIcon from '@mui/icons-material/Check';\nimport SvgIcon from '@mui/material/SvgIcon';\nimport { useParams } from 'react-router-dom';\n\nimport { noop } from 'shared/utils';\nimport { usePageTitle } from 'shared/custom-hooks/usePageTitle';\nimport StepLabel from '@mui/material/StepLabel';\n\nexport type WizardStepStatus = 'incomplete' | 'active' | 'complete';\n\nexport interface WizardStep {\n icon: typeof SvgIcon;\n label: string;\n slug: string;\n next?: string;\n prev?: string;\n}\n\ninterface WizardStepperProps {\n steps: Map<string, WizardStep>;\n onChange?: (step: WizardStep) => void;\n allowClick?: boolean;\n}\n\nfunction WizardStepper({\n steps,\n onChange = noop,\n allowClick = false,\n}: WizardStepperProps): React.ReactElement {\n const { stepSlug } = useParams<{stepSlug: string;}>();\n\n usePageTitle(steps.get(stepSlug)?.label ?? '');\n\n function handleStepClick(step: WizardStep) {\n return () => {\n if (allowClick) {\n onChange(step);\n }\n };\n }\n\n function iconColors(step: WizardStep, isComplete: boolean): string {\n let classes = '';\n\n if (isComplete) {\n classes = 'bg-white text-primary-main border-primary-main';\n } else {\n classes = 'text-white border-transparent ';\n classes += step.slug === stepSlug ? 'bg-primary-main' : 'bg-gray-400';\n }\n\n return classes;\n }\n\n function icon(step: WizardStep, isComplete: boolean): React.ReactNode {\n const Icon = isComplete ? CheckIcon : step.icon;\n\n return (\n <div className={`rounded-full p-3 border-2 ${iconColors(step, isComplete)}`}>\n <Icon fontSize=\"large\" />\n </div>\n );\n }\n\n function renderSteps() {\n let isComplete = true;\n const stepIterator = steps.values();\n let rendered: React.ReactElement[] = [];\n\n for (let step of stepIterator) {\n if (step.slug === stepSlug) {\n isComplete = false;\n }\n\n const canClick = allowClick && isComplete;\n rendered.push(\n <Step key={step.slug} className=\"py-0\">\n <StepLabel\n className={`-my-11 ${canClick ? '' : 'cursor-default'}`}\n // active={step.slug === stepSlug}\n onClick={canClick ? handleStepClick(step) : noop}\n // completed={isComplete}\n icon={icon(step, isComplete)}\n data-testid={`wizStepBtn-${step.slug}`}\n >\n <p>{step.label}</p>\n </StepLabel>\n </Step>,\n );\n }\n\n return rendered;\n }\n\n return (\n <>\n <Stepper alternativeLabel className=\"pt-12 pb-10\" connector={<StepConnector className=\"mx-4\" />} >\n {renderSteps()}\n </Stepper>\n </>\n );\n}\n\nexport default WizardStepper;\n","import { ChangeEvent, useState, useRef, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { compose, F, forEachObjIndexed, mergeLeft, pipe, tap } from 'ramda';\nimport LoopIcon from '@mui/icons-material/Loop';\nimport TextField from '@mui/material/TextField';\n\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { Participant } from 'participant-search/participant-list.types';\nimport { debounce, noop } from 'shared/utils';\nimport { getParticipant } from 'shared/api/participantApi';\nimport { defaultParticipant } from 'shared/constants';\nimport { omitNil } from 'shared/utils/omit-nil';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\n\ntype FieldSetter = (field: string, value: any, shouldValidate?: boolean | undefined) => unknown;\n\nexport function setParticipantValues(setter: FieldSetter): (obj: object) => void {\n return forEachObjIndexed((value: any, key: string) => {\n if (key === 'empno' || key === 'socsec' || !!value) {\n setter(key, value);\n }\n });\n}\n\nexport interface PayrollIdParticipantLookupInputProps {\n placeholder?: string;\n initialValue?: string; // initial value, default ''\n onSearchStarted?: () => void;\n onParticipantFound?: (participant: Participant) => void;\n onTextChanged?: (text: string) => void;\n searchOn?: 'blur' | 'change';\n size?: 'small' | 'medium'; // this gets passed along to the TextField. Default is \"medium\"\n variant?: 'outlined' | 'standard' | 'filled'; // passed along to TextField. Default is \"outlined\"\n [otherProp: string]: any;\n}\n\nfunction PayrollIdParticipantLookupInput({\n placeholder = '',\n initialValue = '',\n onSearchStarted,\n onParticipantFound,\n onTextChanged,\n searchOn = 'blur',\n size = 'medium',\n variant = 'outlined',\n className,\n ...rest\n}: PayrollIdParticipantLookupInputProps) {\n const handleError = useErrorNotifier();\n const [ previousPayrollId, setPreviousPayrollId ] = useState<string>(initialValue);\n const [ payrollId, setPayrollId ] = useState(initialValue);\n const [ searching, setSearching ] = useState(false);\n\n const { compid, iddesc = 'SSN' } = useSelector(selectSelectedCompany) ?? { compid: undefined, iddesc: undefined };\n const [ debouncedSearch ] = useState(() => debounce(pipe(\n tap(onTextChanged ?? noop),\n tap(searchForParticipant),\n ), 750));\n const mounted = useRef(false);\n\n useEffect(() => {\n mounted.current = true;\n\n return () => {\n mounted.current = false;\n };\n }, []);\n\n function handlePayrollIdChanged(value: string) {\n const transormed = compose(padPayrollId, deHyphenate)(value);\n setPayrollId(transormed);\n\n if (onTextChanged) {\n onTextChanged(value);\n }\n\n if (searchOn === 'change') {\n debouncedSearch(transormed);\n }\n }\n\n function onChange({ target: { value } }: ChangeEvent<{name?: string; value: unknown;}>) {\n handlePayrollIdChanged(value as string);\n }\n\n function padPayrollId(pid: string) {\n if (pid.length && pid.length < 9) {\n return pid.padStart(9, '0');\n }\n\n return pid;\n }\n\n function deHyphenate(pid: string) {\n return pid.replace(/-+/g, '');\n }\n\n function searchForParticipant(pid: string) {\n if (compid && onParticipantFound && pid !== previousPayrollId) {\n if (onSearchStarted) {\n onSearchStarted();\n }\n\n setSearching(true);\n setPreviousPayrollId(pid);\n\n getParticipant(compid, pid.replace(/[^\\d]+/g, ''))\n .then((p) => {\n onParticipantFound(mergeLeft(omitNil(p), defaultParticipant));\n })\n .catch((err) => {\n onParticipantFound(defaultParticipant as Participant);\n\n if (err.status !== 404) {\n handleError(err);\n }\n })\n .finally(compose(setSearching, F));\n }\n }\n\n function handleBlur() {\n let paddedPayrollId = padPayrollId(payrollId);\n handlePayrollIdChanged(paddedPayrollId);\n searchForParticipant(paddedPayrollId);\n }\n\n return (\n <>\n <TextField\n variant={variant}\n size={size}\n value={payrollId}\n onChange={onChange}\n fullWidth\n label={iddesc || 'SSN'}\n placeholder={placeholder}\n data-testid=\"payrollIdParticipantLookupInput\"\n onBlur={searchOn === 'blur' ? handleBlur : undefined}\n {...rest}\n InputLabelProps={ {\n shrink: true,\n } }\n inputProps={ {\n maxLength: 11,\n role: 'textbox',\n } }\n InputProps={ {\n className,\n endAdornment: searching\n ? <LoopIcon className=\"animate-spin participant-lookup-searching\" />\n : <></>,\n } }\n />\n\n </>\n );\n}\n\nexport default PayrollIdParticipantLookupInput;\n","import { mergeLeft, isNil } from 'ramda';\n\n/**\n * Shallow removes properties whose values are nil\n */\nexport function omitNil<T extends {}> (obj: T): Partial<T> {\n return Object.entries(obj).reduce(\n (acc, [ key, value ]) => isNil(value) ? acc : mergeLeft(acc, { [key]: value }),\n {},\n );\n}\n","import * as yup from 'yup';\n\n/**\n * @file Contains common validators for yup schemas\n *\n * @description These can be added to schema validation via object composition (example below)\n *\n * @example\n * ```\n * const validationSchema = yup.object({\n * ...fname,\n * ...lname,\n * someNonCommonField: yup.require(),\n * })\n */\n\nexport const requiredText = 'This field is required';\n\nexport const errorMessages = {\n nameFirst: {\n max: 'First name must be 15 characters or less',\n },\n nameLast: {\n max: 'Last name must be 20 characters or less',\n },\n ssn: {\n matches: 'SSN must only include numbers',\n length: 'SSN must be 9 digits',\n },\n addr1: {\n max: 'Address line 1 must be 30 characters or less',\n },\n addr2: {\n max: 'Address line 2 must be 30 characters or less',\n },\n email: {\n matches: 'Email must be a valid email address',\n max: 'Email must be 50 characters or less',\n },\n phone: {\n matches: 'Phone is invalid',\n max: 'Phone must be 14 characters or less',\n min: 'Phone must be a minimum of 10 characters',\n },\n fax: {\n matches: 'Fax number is invalid',\n max: 'Fax number must be 14 characters or less',\n min: 'Fax number must be a minimum of 10 characters',\n },\n city: {\n matches: 'City must only include letters and spaces',\n max: 'City must be 20 characters or less',\n },\n postalCd: {\n matches: 'Zip must only include numbers and hyphens',\n max: 'Zip must be 10 characters or less',\n min: 'Zip must be a minimum of 5 characters',\n },\n};\n\nexport const regexPatterns = {\n ssn: /^\\d+$/,\n postalCd: /^[\\d-]+$/,\n phone: /^\\(?(\\d{3})\\)?[-. ]?(\\d{3})[-. ]?(\\d{4})$/,\n};\n\nexport const fname = {\n fname: yup\n .string()\n .trim()\n .max(15, errorMessages.nameFirst.max)\n .required(requiredText),\n};\n\nexport const lname = {\n lname: yup\n .string()\n .trim()\n .max(20, errorMessages.nameLast.max)\n .required(requiredText),\n};\n\nexport const name = {\n ...fname,\n ...lname,\n};\n\nexport const payrollid = {\n payrollid: yup\n .string()\n .trim()\n .matches(/^[\\d-]+$/, 'Must only include numbers')\n .transform(function (value, originalvalue) {\n return originalvalue.replace(/[^\\d]+/g, '');\n })\n .max(9, 'Must be 9 characters or less')\n .required(requiredText),\n};\n\nexport const ssn = {\n ssn: yup\n .string()\n .matches(regexPatterns.ssn, errorMessages.ssn.matches)\n .length(9, errorMessages.ssn.length),\n};\n\nexport const hstreet1 = {\n hstreet1: yup\n .string()\n .trim()\n .max(30, errorMessages.addr1.max)\n .nullable()\n .required(requiredText),\n};\n\nexport const hstreet2 = {\n hstreet2: yup\n .string()\n .max(30, errorMessages.addr2.max)\n .nullable(),\n};\n\nexport const hcity = {\n hcity: yup\n .string()\n .trim()\n .matches(/^[a-zA-Z\\s]+$/, errorMessages.city.matches)\n .max(20, errorMessages.city.max)\n .nullable()\n .required(requiredText),\n};\n\nexport const hstate = {\n hstate: yup\n .string()\n .trim()\n .nullable()\n .required(requiredText),\n};\n\nexport const hzip = {\n hzip: yup\n .string()\n .trim()\n .matches(/^[\\d-]+$/, errorMessages.postalCd.matches)\n .max(10, errorMessages.postalCd.max)\n .nullable()\n .required(requiredText),\n\n};\n\nexport const hphone = {\n hphone: yup\n .string()\n .max(13, 'Phone must be 13 characters or less')\n .test(\n 'phone-empty-or-10-chars-check',\n 'Phone must be at least 10 characters',\n (phone) => !phone || phone.length >= 10,\n )\n .nullable(),\n};\n\nexport const email = {\n email: yup\n .string()\n .email(errorMessages.email.matches)\n .max(50, errorMessages.email.max)\n .nullable(),\n};\n","import dayjs from 'dayjs';\nimport * as yup from 'yup';\n\nimport {\n payrollid,\n fname,\n lname,\n hphone,\n hstreet1,\n hstreet2,\n hcity,\n hstate,\n hzip,\n email,\n} from 'shared/common-validators';\n\nexport const validationSchema = yup.object({\n ...payrollid,\n ...fname,\n ...lname,\n ...hphone,\n ...email,\n ...hstreet1,\n ...hstreet2,\n ...hcity,\n ...hstate,\n ...hzip,\n birthdate: yup\n .date()\n .nullable()\n .max(dayjs(), 'Birthdate must be before today')\n .typeError('Invalid Date Format'),\n});\n\n","import { ChangeEvent, useRef } from 'react';\nimport Select from '@mui/material/Select';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport FormControl from '@mui/material/FormControl';\nimport InputLabel from '@mui/material/InputLabel';\nimport Skeleton from '@mui/material/Skeleton';\n\nimport { useLocationOptions } from 'shared/custom-hooks/useLocationOptions';\n\nexport interface LocationSelectProps {\n onLocationChanged?: (Location: string) => void;\n value?: string;\n error?: boolean;\n className?: string;\n label?: string;\n variant?: 'filled' | 'outlined' | 'standard';\n [otherProp: string]: any;\n}\n\nexport interface LocationSelectFormProps extends LocationSelectProps {\n locations: LocationSelectOption[] | null;\n}\n\nexport interface LocationSelectOption {\n loccode: string;\n location: string;\n}\n\nfunction displayErrorText(showError = false) {\n if (showError) {\n return (\n <FormHelperText\n disabled\n error\n >This field is required\n </FormHelperText>\n );\n } else {\n return (<></>);\n }\n}\n\nfunction LocationSelectForm({\n onLocationChanged,\n variant,\n className,\n value,\n label,\n error,\n locations,\n ...rest\n}: LocationSelectFormProps) {\n const labelRef = useRef<HTMLLabelElement>(null);\n\n function handleChange(event: ChangeEvent<{ name?: string; value: unknown; }>) {\n if (onLocationChanged) {\n onLocationChanged(event.target.value as string);\n }\n }\n\n return (\n <FormControl variant={variant} className={`${className} w-full`}>\n <InputLabel ref={labelRef} id=\"location-select-label\">{label}</InputLabel>\n <Select\n label={label}\n onChange={handleChange as any}\n value={value ?? ''}\n native\n error={error}\n data-testid=\"locationSelect\"\n {...rest}\n >\n <option />\n {locations?.map((loc) => <option value={loc.loccode} key={loc.loccode}>{loc.location}</option>)}\n </Select>\n {displayErrorText(error)}\n </FormControl>\n );\n}\n\nfunction LocationSelect({\n onLocationChanged,\n value,\n error = false,\n label = 'Location',\n className = '',\n variant = 'outlined',\n ...rest\n}: LocationSelectProps) {\n const locations = useLocationOptions();\n\n return locations !== null\n ? (\n <LocationSelectForm\n locations={locations}\n value={value}\n error={error}\n className={className}\n variant={variant}\n label={label}\n onLocationChanged={onLocationChanged}\n {...rest}\n />\n )\n : (\n <div className=\"w-full\" data-testid=\"location-skeleton\">\n <Skeleton variant=\"rectangular\" width=\"100%\" height={60} />\n </div>\n );\n}\n\nexport default LocationSelect;\n","import { useState, useRef, useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { compose, tap, always } from 'ramda';\n\nimport request, { APIOptions } from 'shared/api-request';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { LocationSelectOption } from 'components/shared/LocationSelect';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport store from 'store';\n\nexport function useLocationOptions() {\n const dispatch = useDispatch<typeof store.dispatch>();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n\n const [ locations, setLocations ] = useState<LocationSelectOption[] | null>(null);\n\n const { current: abortCtrl } = useRef(new AbortController());\n const { current: setDefault } = useRef(compose(setLocations, always([])));\n const { current: handleError } = useRef(compose(\n tap(setDefault),\n dispatch,\n addHttpErrorNotification,\n ));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n const uri = `/api/companies/${compid}/locations`;\n const apiOpts: APIOptions = { method: 'GET', signal: abortCtrl.signal };\n request<LocationSelectOption[]>(uri, apiOpts)\n .then((result) => {\n if (mountedRef.current) {\n setLocations(result ?? []);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n\n return () => {\n mountedRef.current = false;\n abortCtrl.abort();\n };\n }, [ handleError, abortCtrl, compid ]);\n\n return locations;\n}\n","import React, { ChangeEvent, useRef } from 'react';\nimport Select from '@mui/material/Select';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport FormControl from '@mui/material/FormControl';\nimport InputLabel from '@mui/material/InputLabel';\n\nimport states from 'components/shared/states.json';\n\ninterface StateSelectProps {\n onStateChanged: (state: string) => void;\n onStateBlur?: (e: React.FocusEvent<any, Element>) => void;\n value?: string;\n error?: boolean;\n className?: string;\n label?: string;\n variant?: 'filled' | 'outlined' | 'standard';\n [otherProp: string]: any;\n}\n\nfunction displayErrorText(y: boolean) {\n if (y) {\n return (\n <FormHelperText\n disabled\n error\n data-testid=\"stateSelectHelper\"\n >This field is required\n </FormHelperText>\n );\n } else {\n return (<></>);\n }\n}\n\nfunction StateSelect({\n onStateChanged,\n onStateBlur,\n value = '',\n error = false,\n className = '',\n label = 'State',\n variant = 'outlined',\n ...rest\n}: StateSelectProps): React.ReactElement {\n const labelRef = useRef<HTMLLabelElement>(null);\n\n function handleChange(event: ChangeEvent<{ name?: string; value: unknown; }>) {\n onStateChanged(event.target.value as string);\n }\n\n return (\n <FormControl variant={variant} className={`${className} w-full`}>\n <InputLabel ref={labelRef} id=\"state-select-label\"><span className=\"bg-white px-2\">{label}</span></InputLabel>\n <Select\n onChange={handleChange as any}\n onBlur={onStateBlur}\n value={value}\n native\n error={error}\n data-testid=\"stateSelect\"\n {...rest}\n >\n <option />\n {states.map(item => (\n <option key={item.abbreviation} value={item.abbreviation}>\n {item.abbreviation}\n </option>\n ))}\n </Select>\n {displayErrorText(error)}\n </FormControl>\n );\n}\n\nexport default StateSelect;\n","import dayjs from 'dayjs';\nimport { FormikHelpers, FormikValues, getIn } from 'formik';\n\n/**\n * Takes the typical format of our datepicker output and converts it to our DB format\n */\nexport function handleDateChange<T>(field: string, form: FormikHelpers<T>) {\n return (event: any) => {\n form.setFieldValue(field, event ? dayjs(event, 'MM/DD/YYYY').format('YYYY-MM-DD') : null);\n };\n}\n\n/**\n * Plucks the value off of a Material Select menu event\n * @param field\n * @param form\n * @returns (string) => void\n */\nexport function handleSelectChange<T>(field: string, form: FormikHelpers<T>) {\n return (event: any) => {\n form.setFieldValue(field, event.target.value);\n };\n}\n\n/**\n * Useful for custom controls like PayFreqSelect or PayrollIdParticipantLookupInput\n * @param field\n * @param form\n * @returns (string) => void\n */\nexport function handleCustomFieldChange<T>(field: string, form: FormikHelpers<T>) {\n return (value: string) => form.setFieldValue(field, value);\n}\n\n/**\n *\n * @param data the data you want to map to options\n * @param labelProp the property on the data that has the label string\n * @param valueProp the property on the data that has the value\n */\nexport function mapToSelectOption<T>(data: T[], labelProp: keyof T, valueProp: keyof T) {\n return data.map((d) => ({\n label: d[labelProp] + '',\n value: d[valueProp] + '',\n }));\n}\n\n/**\n * @param path path to the Formik key to validate\n * @param form object returned from useFormik and useFormikContext hooks\n * @returns boolean\n */\nexport function formikFieldHasError(path: string, form: FormikValues) {\n return Boolean(formikFieldErrorText(path, form));\n}\n\n/**\n * @param path path to the Formik key to validate\n * @param form object returned from useFormik and useFormikContext hooks\n * @returns string\n */\nexport function formikFieldErrorText(path: string, form: FormikValues) {\n return getIn(form.touched, path) && getIn(form.errors, path);\n}\n","import React, { ReactElement, useRef } from 'react';\nimport TextField from '@mui/material/TextField';\nimport FormControl from '@mui/material/FormControl';\nimport InputLabel from '@mui/material/InputLabel';\nimport Select from '@mui/material/Select';\nimport dayjs from 'dayjs';\n\nimport LocationSelect from 'components/shared/LocationSelect';\nimport StateSelect from 'components/shared/StateSelect';\nimport { handleDateChange, handleSelectChange } from 'shared/form-helpers';\nimport { FormikProps } from 'formik';\nimport { Participant } from '../../participant-search/participant-list.types';\nimport { compose, pipe, tap, T } from 'ramda';\nimport { noop } from 'shared/utils';\nimport { ChangeNotifier } from 'shared/types/form.types';\nimport LocalizationProvider from '@mui/lab/LocalizationProvider';\nimport AdapterDayJS from '@mui/lab/AdapterDayjs';\nimport DatePicker from '@mui/lab/DatePicker';\n\ninterface ParticipantDetailsProps extends ChangeNotifier {\n form: FormikProps<Partial<Participant>>;\n}\n\nfunction ParticipantDetails({\n form,\n onHasChanged = noop }: ParticipantDetailsProps): ReactElement {\n const genderLabelRef = useRef<HTMLLabelElement>(null);\n\n function handleCustomFieldChange(field: string) {\n return (value: string) => form.setFieldValue(field, value);\n }\n\n function handleLocationChange(loccode: string) {\n form.setFieldValue('location', loccode ? parseInt(loccode) : null);\n }\n\n return (\n <>\n <div className=\"flex flex-row space-x-4\">\n <TextField\n variant=\"outlined\"\n label=\"First name\"\n name=\"fname\"\n value={form.values.fname ?? ''}\n error={form.touched.fname && !!form.errors.fname}\n helperText={form.touched.fname && form.errors.fname}\n onChange={pipe(tap(compose(onHasChanged, T)), form.handleChange('fname'))}\n fullWidth\n data-testid=\"firstName\"\n />\n <TextField\n variant=\"outlined\"\n label=\"Last name\"\n name=\"lname\"\n value={form.values.lname ?? ''}\n error={form.touched.lname && !!form.errors.lname}\n helperText={form.touched.lname && form.errors.lname}\n onChange={pipe(tap(compose(onHasChanged, T)), form.handleChange('lname'))}\n fullWidth\n data-testid=\"lastName\"\n />\n </div>\n <div className=\"flex flex-row space-x-4\">\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n label=\"Date of Birth (Optional)\"\n value={form.values.birthdate ? dayjs(form.values.birthdate, 'YYYY-MM-DD').format('MM/DD/YYYY') : null}\n onChange={pipe(tap(compose(onHasChanged, T)), handleDateChange('birthdate', form))}\n InputProps={\n {\n className: !form.values.birthdate ? 'MuiFormLabel-root' : '',\n }\n }\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n variant=\"outlined\"\n data-testid=\"dob\"\n className=\"w-full\"\n {...params}\n error={form.touched.birthdate && Boolean(form.errors.birthdate)}\n helperText={form.touched.birthdate && form.errors.birthdate}\n />\n )}\n />\n </LocalizationProvider>\n <FormControl variant=\"outlined\" className=\"w-full\">\n <InputLabel ref={genderLabelRef} id=\"gender-select-label\">Gender (Optional)</InputLabel>\n <Select\n label=\"Gender (Optional)\"\n value={form.values.sex ?? ''}\n onChange={pipe(tap(compose(onHasChanged, T)), handleSelectChange('sex', form))}\n native\n variant=\"outlined\"\n fullWidth\n data-testid=\"gender\"\n >\n <option />\n <option value=\"F\">Female</option>\n <option value=\"M\">Male</option>\n </Select>\n </FormControl>\n </div>\n <div className=\"flex flex-row space-x-4\">\n <LocationSelect\n variant=\"outlined\"\n className=\"w-full\"\n value={form.values.location?.toString() ?? ''}\n label=\"Location (Optional)\"\n onLocationChanged={pipe(tap(compose(onHasChanged, T)), handleLocationChange)}\n />\n <TextField\n variant=\"outlined\"\n name=\"hphone\"\n label=\"Phone (Optional)\"\n value={form.values.hphone ?? ''}\n error={form.touched.hphone && !!form.errors.hphone}\n helperText={form.touched.hphone && form.errors.hphone}\n onChange={pipe(tap(compose(onHasChanged, T)), form.handleChange('hphone'))}\n fullWidth\n data-testid=\"phone\"\n />\n <TextField\n variant=\"outlined\"\n name=\"email\"\n label=\"Email Address (Recommended)\"\n value={form.values.email ?? ''}\n error={form.touched.email && !!form.errors.email}\n helperText={form.touched.email && form.errors.email}\n onChange={pipe(tap(compose(onHasChanged, T)), form.handleChange('email'))}\n fullWidth\n data-testid=\"email\"\n />\n </div>\n <div className=\"flex flex-row space-x-4\">\n <TextField\n variant=\"outlined\"\n label=\"Address Line 1\"\n name=\"hstreet1\"\n value={form.values.hstreet1 ?? ''}\n error={form.touched.hstreet1 && !!form.errors.hstreet1}\n helperText={form.touched.hstreet1 && form.errors.hstreet1}\n onChange={pipe(tap(compose(onHasChanged, T)), form.handleChange('hstreet1'))}\n fullWidth\n data-testid=\"addr1\"\n />\n </div>\n <div className=\"flex flex-row space-x-4\">\n <TextField\n variant=\"outlined\"\n label=\"Address Line 2 (Optional)\"\n name=\"hstreet2\"\n value={form.values.hstreet2 ?? ''}\n error={form.touched.hstreet2 && !!form.errors.hstreet2}\n helperText={form.touched.hstreet2 && form.errors.hstreet2}\n onChange={pipe(tap(compose(onHasChanged, T)), form.handleChange('hstreet2'))}\n fullWidth\n data-testid=\"addr2\"\n />\n </div>\n <div className=\"flex flex-row space-x-4\">\n <TextField\n variant=\"outlined\"\n name=\"hcity\"\n label=\"City\"\n value={form.values.hcity ?? ''}\n error={form.touched.hcity && !!form.errors.hcity}\n helperText={form.touched.hcity && form.errors.hcity}\n onChange={pipe(tap(compose(onHasChanged, T)), form.handleChange('hcity'))}\n className=\"w-1/2\"\n data-testid=\"city\"\n />\n\n <div className=\"w-1/4\" data-testid=\"state\">\n <StateSelect\n onStateChanged={pipe(tap(compose(onHasChanged, T)), handleCustomFieldChange('hstate'))}\n name=\"hstate\"\n label=\"State\"\n value={form.values.hstate ?? undefined}\n variant=\"outlined\"\n error={form.touched.hstate && !!form.errors.hstate}\n />\n </div>\n\n <TextField\n variant=\"outlined\"\n name=\"hzip\"\n label=\"Zip\"\n value={form.values.hzip ?? ''}\n error={form.touched.hzip && !!form.errors.hzip}\n helperText={form.touched.hzip && form.errors.hzip}\n onChange={pipe(tap(compose(onHasChanged, T)), form.handleChange('hzip'))}\n className=\"w-1/4\"\n data-testid=\"zip\"\n />\n </div>\n </>\n );\n}\n\nexport default ParticipantDetails;\n","import { useState } from 'react';\nimport Button from '@mui/material/Button';\nimport { useFormik, FormikProps } from 'formik';\nimport { compose, T } from 'ramda';\n\nimport PayrollIdParticipantLookupInput, {\n setParticipantValues,\n} from 'components/shared/PayrollIdParticipantLookupInput';\nimport { Participant } from 'participant-search/participant-list.types';\nimport { CobraQeFormProps } from '../cobra-qe.types';\nimport { validationSchema } from './cobra-qe-personal-details.validators';\nimport ParticipantDetails from 'components/shared/ParticipantDetails';\nimport { useDispatch } from 'react-redux';\nimport { resetEntry } from 'enter-cobra-qe/cobra-qe.slice';\nimport { setSelectedParticipant } from 'participant-search/participant.slice';\nimport { defaultParticipant } from 'shared/constants';\nimport { QeParticipant } from 'shared/types/non-plan-year.types';\nimport store from 'store';\n\ninterface CobraQePersonalDetailsProps extends CobraQeFormProps {\n details?: QeParticipant;\n}\n\nfunction CobraQePersonalDetails({ details, onNextStep, onCancel }: CobraQePersonalDetailsProps) {\n const dispatch = useDispatch<typeof store.dispatch>();\n const [ searching, setSearching ] = useState(false);\n\n const form = useFormik<Partial<QeParticipant>>({\n initialValues: {\n ...defaultParticipant,\n ...details,\n },\n validationSchema: validationSchema,\n onSubmit: (values) => {\n dispatch(setSelectedParticipant(values as Participant));\n onNextStep(values as any);\n },\n });\n const setParticipantDetails = setParticipantValues(form.setFieldValue);\n\n const handleSearchStarted = compose(setSearching, T);\n\n function handleParticipant(p: Participant) {\n dispatch(resetEntry());\n setParticipantDetails(p);\n setSearching(false);\n }\n\n function handleCustomFieldChange(field: string) {\n return (value: string) => form.setFieldValue(field, value);\n }\n\n return (\n /* eslint-disable @typescript-eslint/no-unnecessary-condition */\n <form data-testid=\"cobraQePersonalDetails\">\n <div className=\"flex flex-col space-y-4\">\n <p>\n The demographic information entered below should be for the primary insured losing coverage due to the\n COBRA Qualifying Event. Please ask your account manager for clarification.\n </p>\n <div className=\"flex flex-row pr-4\">\n <PayrollIdParticipantLookupInput\n className=\"w-1/2\"\n data-testid=\"participantLookup\"\n onSearchStarted={handleSearchStarted}\n onParticipantFound={handleParticipant}\n name=\"payrollid\"\n value={form.values.payrollid ?? ''}\n error={form.touched.payrollid && !!form.errors.payrollid}\n helperText={form.touched.payrollid && form.errors.payrollid}\n onTextChanged={handleCustomFieldChange('payrollid')}\n />\n </div>\n <ParticipantDetails form={form as FormikProps<Partial<QeParticipant>>} />\n </div>\n <div className=\"flex justify-end my-4\">\n <Button\n color=\"primary\"\n data-testid=\"cancelCobraQe\"\n onClick={onCancel}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"button\"\n onClick={form.submitForm}\n data-testid=\"cobraQeNextStep\"\n className=\"ml-4\"\n disabled={searching || (!!Object.values(form.touched).length && !!Object.values(form.errors).length)}\n >\n Next Step\n </Button>\n </div>\n </form>\n /* eslint-enable @typescript-eslint/no-unnecessary-condition */\n );\n}\n\nexport default CobraQePersonalDetails;\n","import { Participant } from 'participant-search/participant-list.types';\n\ninterface ParticipantSummaryProps {\n participant: Omit<Participant, 'pyrid' | 'planCode'>;\n}\n\nfunction ParticipantSummary({ participant }: ParticipantSummaryProps) {\n return (\n <div className=\"flex flex-col space-y-2\">\n <p className=\"text-lg text-black font-semibold\">{participant.fname} {participant.lname}</p>\n <p>\n <span className=\"text-black font-medium\">Address: </span>\n {participant.hstreet1}, \n {participant.hstreet2 ? `${participant.hstreet2}, ` : ''}{participant.hcity}, \n {participant.hstate} {participant.hzip}\n </p>\n <p>\n <span className=\"text-black font-medium\">Phone: </span>\n {participant.hphone}\n </p>\n </div>\n );\n}\n\nexport default ParticipantSummary;\n","import { Dependent } from 'shared/types/non-plan-year.types';\n\ninterface DependentsSummaryProps {\n dependents: Dependent[];\n}\n\nfunction DependentsSummary({ dependents }: DependentsSummaryProps) {\n return (\n <div className=\"flex flex-col space-y-2\" data-testid=\"dependentsList\">\n {\n dependents\n .map((dep, idx) => <p className=\"text-black text-lg font-medium\" key={idx}>{dep.name}</p>)\n }\n </div>\n );\n}\n\nexport default DependentsSummary;\n","import dayjs from 'dayjs';\nimport { DirectBillingEventType } from 'direct-billing/direct-billing.types';\nimport { QeEventType } from 'enter-cobra-qe/cobra-qe.types';\nimport { EventInfo } from 'shared/types/non-plan-year.types';\n\ninterface EventInfoSummaryProps {\n eventInfo: EventInfo;\n eventTypes: QeEventType[] | DirectBillingEventType[] | null;\n}\n\nfunction EventInfoSummary({ eventInfo, eventTypes }: EventInfoSummaryProps) {\n function eventDescription() {\n if (eventTypes === null || eventTypes.length === 0) {\n return '';\n }\n\n if (eventTypes[0].hasOwnProperty('r_qualevid')) {\n return (eventTypes as DirectBillingEventType[])\n .find((type) => type.r_qualevid === eventInfo.eventType)?.desc ?? eventInfo.eventType;\n } else {\n return (eventTypes as QeEventType[])\n .find((type) => type.c_qualevid === eventInfo.eventType)?.desc ?? eventInfo.eventType;\n }\n }\n\n return (\n <div className=\"text-lg flex flex-col space-y-2\">\n <p>\n <span className=\"text-black font-medium\">Event Date: </span>\n {dayjs(eventInfo.eventDate).format('M/D/YYYY')}\n </p>\n <p>\n <span className=\"text-black font-medium\">Event Type: </span>\n {eventDescription()}\n </p>\n <p>\n <span className=\"text-black font-medium\">Coverage Begins: </span>\n {dayjs(eventInfo.coverageBegins).format('M/D/YYYY')}\n </p>\n {\n eventInfo.paidThrough\n ? (\n <p>\n <span className=\"text-black font-medium\">Paid Through: </span>\n {dayjs(eventInfo.paidThrough).format('M/D/YYYY')}\n </p>\n )\n : ''\n }\n </div>\n\n );\n}\n\nexport default EventInfoSummary;\n","import Button from '@mui/material/Button';\nimport { Link } from 'react-router-dom';\n\nimport { CobraQe, QeEventType } from '../cobra-qe.types';\nimport classes from './CobraQeSummary.module.css';\nimport ParticipantSummary from 'components/shared/qe/ParticipantSummary';\nimport DependentsSummary from 'components/shared/qe/DependentsSummary';\nimport EventInfoSummary from 'components/shared/qe/EventInfoSummary';\n\ninterface CobraQeSummaryProps {\n entry: CobraQe;\n eventTypes: QeEventType[];\n onCancel: () => void;\n onSave: (doAnother: boolean) => void;\n}\n\nfunction CobraQeSummary({ entry, eventTypes, onCancel, onSave }: CobraQeSummaryProps) {\n function handleSubmit(doAnother: boolean) {\n return () => {\n onSave(doAnother);\n };\n }\n const eventInfo = {\n eventDate: entry.eventDate,\n eventType: entry.eventType,\n coverageBegins: entry.coverageBegins,\n paidThrough: entry.paidThrough,\n };\n\n return (\n <div className=\"w-full flex flex-col space-y-4\">\n <p className=\"mb-8\">Are you sure you want to submit this COBRA Qualifying Event?</p>\n <div className=\"flex flex-col space-y-32\">\n <div className=\"flex space-x-8\">\n <div className=\"w-1/2\">\n <div className=\"flex justify-between border-b border-solid border-gray-500 pb-1 mb-2\">\n <p className={classes.sectionHeader}>Personal Details</p>\n <Link\n to=\"/enter-cobra-qe/personal-details\"\n className={`${classes.link} text-sm`}\n data-testid=\"detailsLink\"\n >\n Edit\n </Link>\n </div>\n <ParticipantSummary participant={entry.participant} />\n </div>\n <div className=\"w-1/2\">\n <div className=\"flex justify-between border-b border-solid border-gray-500 pb-1 mb-2\">\n <p className={classes.sectionHeader}>Dependents</p>\n <Link to=\"/enter-cobra-qe/dependents\" className={`${classes.link} text-sm`} data-testid=\"dependentsLink\">\n Edit\n </Link>\n </div>\n <DependentsSummary dependents={entry.initialDependents.concat(entry.addedDependents)} />\n </div>\n </div>\n <div className=\"flex space-x-4\">\n <div className=\"w-1/2\">\n <div className=\"flex justify-between border-b border-solid border-gray-500 pb-1 mb-2\">\n <p className={classes.sectionHeader}>Event Info</p>\n <Link to=\"/enter-cobra-qe/event-info\" className={`${classes.link} text-sm`} data-testid=\"eventLink\">\n Edit\n </Link>\n </div>\n <EventInfoSummary eventInfo={eventInfo} eventTypes={eventTypes} />\n </div>\n <div className=\"w-1/2\">\n <div className=\"flex justify-between border-b border-solid border-gray-500 pb-1 mb-2\">\n <p className={classes.sectionHeader}>Benefits</p>\n <Link to=\"/enter-cobra-qe/benefits\" className={`${classes.link} text-sm`} data-testid=\"benefitsLink\">\n Edit\n </Link>\n </div>\n <div className=\"flex flex-col space-y-2\" data-testid=\"benefitsList\">\n {\n entry.benefits.map((benefit) => {\n return (\n <div key={benefit.plansId}>\n <p className=\"text-lg text-black font-medium\">{benefit.displayName}</p>\n <p className=\"text-sm\">\n <span className=\"text-black font-medium\">Covered: </span>\n {\n (\n [\n { name: `${entry.participant.fname} ${entry.participant.lname}` },\n ...benefit.coveredDependents,\n ]\n )\n .map((dep) => dep.name)\n .join(', ')\n }\n </p>\n </div>\n );\n })\n }\n </div>\n </div>\n </div>\n </div>\n <div className=\"flex justify-end py-8 space-x-8\">\n <Button\n color=\"primary\"\n onClick={onCancel}\n data-testid=\"cancelCobraQe\"\n >\n Cancel\n </Button>\n <Button\n variant=\"outlined\"\n color=\"primary\"\n onClick={handleSubmit(false)}\n data-testid=\"submitCobraQe\"\n >\n Submit COBRA QE\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={handleSubmit(true)}\n data-testid=\"submitCobraQeAndDoAgain\"\n >\n Submit & Enter Another COBRA QE\n </Button>\n </div>\n </div>\n );\n}\n\nexport default CobraQeSummary;\n","import * as yup from 'yup';\nimport dayjs from 'dayjs';\n\nconst requiredText = 'This field is required';\n\nexport const validationSchema = yup.object({\n eventDate: yup\n .date()\n .typeError('Please enter a valid date')\n .nullable()\n .required(requiredText),\n coverageBegins: yup\n .date()\n .typeError('Please enter a valid date')\n .when('eventDate', (ed: Date | null, schema: any) => {\n return schema.test({\n test: (cb: Date | null) => !!ed && !!cb && (dayjs(ed).isSame(dayjs(cb)) || dayjs(ed).isBefore(dayjs(cb))),\n message: 'Event date must be before or the same date as the coverage begins date',\n });\n })\n .nullable()\n .required(requiredText),\n paidThrough: yup\n .date()\n .typeError('Please enter a valid date')\n .when('coverageBegins', (cb: Date | null, schema: any) => {\n return schema.test({\n test: (pt: Date | null) => !pt || (!!cb && dayjs(cb).isBefore(dayjs(pt))),\n message: 'Coverage begins must be before the paid through date',\n });\n })\n .nullable(),\n eventType: yup\n .string()\n .trim()\n .test('match',\n 'Please select an event type',\n (eventType) => eventType !== '-1',\n )\n .required(requiredText),\n});\n","import { PropsWithChildren } from 'react';\nimport FormHelperText from '@mui/material/FormHelperText';\n\ninterface FormErrorTextProps {\n show: boolean;\n className?: string;\n message?: string;\n}\n\nfunction FormErrorText({\n show,\n className = '',\n message,\n children,\n}: PropsWithChildren<FormErrorTextProps>) {\n return show\n ? (\n <FormHelperText disabled error className={className}>\n { children ?? message ?? 'This field is required.' }\n </FormHelperText>\n )\n : <></>;\n}\n\nexport default FormErrorText;\n","import { useRef } from 'react';\nimport FormControl from '@mui/material/FormControl';\nimport InputLabel from '@mui/material/InputLabel';\nimport Select from '@mui/material/Select';\n\nimport { SelectChangeEvent } from 'shared/types/form.types';\nimport { QeEventType } from '../cobra-qe.types';\nimport FormErrorText from 'components/shared/FormErrorText';\n\ninterface EventTypeSelectProps {\n eventTypes: QeEventType[];\n value: string;\n error: boolean;\n onSelectChange: (value: string) => void;\n className?: string;\n disabled?: boolean;\n}\n\nfunction EventTypeSelect({\n eventTypes,\n value,\n error,\n onSelectChange,\n className = '',\n disabled = false,\n}: EventTypeSelectProps) {\n const labelRef = useRef<HTMLLabelElement>(null);\n\n function handleChange({ target: { value: val } }: SelectChangeEvent) {\n onSelectChange(val as string);\n }\n\n return (\n <FormControl variant=\"outlined\" className={className}>\n <InputLabel ref={labelRef} id=\"event-types-label\">Event Type</InputLabel>\n <Select\n label=\"Event Type\"\n labelId=\"event-types-label\"\n name=\"eventType\"\n native\n variant=\"outlined\"\n fullWidth\n data-testid=\"event-type\"\n value={value}\n onChange={handleChange as any}\n error={error}\n className={!value ? 'MuiFormLabel-root' : ''}\n tabIndex={-1}\n inputProps={ { disabled } }\n disabled={disabled}\n >\n <option value=\"-1\" />\n {eventTypes.map((event, idx) => <option key={idx} value={event.c_qualevid}>{event.desc}</option>)}\n </Select>\n <FormErrorText show={error} />\n </FormControl>\n );\n}\n\nexport default EventTypeSelect;\n","import React, { ReactElement, ComponentType } from 'react';\nimport LoopIcon from '@mui/icons-material/Loop';\n\nfunction withLoopIcon<P>(\n WrappedComponent: ComponentType<React.PropsWithChildren<P>>,\n loadingMessage: string,\n isLoading: boolean,\n className = '',\n) {\n function WithLoopIcon(props: P): ReactElement {\n return (\n isLoading\n ? (\n <div className={className}>\n <LoopIcon\n className=\"animate-spin\"\n style={ { animationDirection: 'reverse' } }\n /> <span>{loadingMessage}</span>\n </div>\n )\n : <WrappedComponent {...props} />\n );\n }\n\n const wrappedComponentName = WrappedComponent.displayName ?? WrappedComponent.name;\n WithLoopIcon.displayName = `withLoopIcon(${wrappedComponentName})`;\n\n return WithLoopIcon;\n}\n\nexport default withLoopIcon;\n","export const ModalContent = new Map([\n [ 'CA', `You have indicated that this COBRA Event is subject to CA state COBRA continuation \n laws in addition to federal COBRA law. This will extend length of continuation coverage \n beyond the COBRA maximum coverage period for the participant. Generally, CA state \n continuation only applies to fully insured medical, dental, vision, and prescription drug \n plans issued in California. If your plans are not subject to CA state continuation, please \n select “Termination-Voluntary†or “Termination-Involuntary†without a state listed as the \n event type for this participant. Please note, if you select state continuation then CA \n state continuation will be applied to all benefits indicated in this event. If state \n continuation should only apply to certain benefits under your plan, please enter a separate \n COBRA event for all benefits not subject to CA state COBRA continuation. If you have \n questions about whether state continuation applies, please consult with your legal counsel \n and your insurance carrier.` ],\n [ 'CT', `You have indicated that this COBRA Event is subject to CT state COBRA continuation \n laws in addition to federal COBRA law. This will extend length of continuation coverage \n beyond the COBRA maximum coverage period for the participant. Generally, CT state \n continuation only applies to fully insured medical plans issued in Connecticut. If your \n plans are not subject to CT state continuation, please select “Termination-Voluntary†or \n “Termination-Involuntary†without a state listed as the event type for this participant. \n Please note, if you select state continuation then CT state continuation will be applied to \n all benefits indicated in this event. If state continuation should only apply to medical \n benefits under your plan, please enter a separate COBRA event for all benefits not subject \n to CT state COBRA continuation (e.g., dental and vision plans). If you have questions about \n whether state continuation applies, please consult with your legal counsel and your \n insurance carrier.` ],\n [ 'NY', `You have indicated that this COBRA Event is subject to NY state COBRA continuation \n laws in addition to federal COBRA law. This will extend length of continuation coverage \n beyond the COBRA maximum coverage period for the participant. Generally, NY state \n continuation only applies to fully insured medical plans issued in New York. If your plans \n are not subject to NY state continuation, please select “Termination-Voluntary†or \n “Termination-Involuntary†without a state listed as the event type for this participant. \n Please note, if you select state continuation then NY state continuation will be applied to \n all benefits indicated in this event. If state continuation should only apply to medical \n benefits under your plan, please enter a separate COBRA event for all benefits not subject \n to NY state COBRA continuation (e.g., dental and vision plans). If you have questions \n about whether state continuation applies, please consult with your legal counsel and your \n insurance carrier.` ],\n [ 'TX', `You have indicated that this COBRA Event is subject to TX state COBRA continuation \n laws in addition to federal COBRA law. This will extend length of continuation coverage \n beyond the COBRA maximum coverage period for the participant. Generally, TX state \n continuation only applies to fully insured medical plans issued in Texas. If your plans \n are not subject to TX state continuation, please select “Termination-Voluntary†or \n “Termination-Involuntary†without a state listed as the event type for this participant. \n Please note, if you select state continuation then TX state continuation will be applied to \n all benefits indicated in this event. If state continuation should only apply to medical \n benefits under your plan, please enter a separate COBRA event for all benefits not subject \n to TX state COBRA continuation (e.g., dental and vision plans). If you have questions \n about whether state continuation applies, please consult with your legal counsel and your \n insurance carrier.` ],\n]);\n","import React, { ReactElement, ComponentType, FunctionComponent } from 'react';\nimport IconButton from '@mui/material/IconButton';\nimport Modal from '@mui/material/Modal';\nimport CloseIcon from '@mui/icons-material/Close';\n\nexport interface ModalPropsClasses {\n position?: string;\n modalContainer?: string;\n titleText?: string;\n contentContainer?: string;\n footerContainer?: string;\n}\n\ninterface ModalProps {\n isOpen: boolean;\n title?: string;\n className?: string;\n classes?: ModalPropsClasses;\n footer?: FunctionComponent<React.PropsWithChildren<{}>>;\n onClose: (args?: unknown) => void;\n}\n\nconst defaultClasses: ModalPropsClasses = {\n position: 'flex justify-center items-center',\n modalContainer: 'bg-surface p-4 w-1/2',\n titleText: '',\n contentContainer: '',\n footerContainer: '',\n};\n\nfunction withModal<P extends object>(WrappedComponent: ComponentType<React.PropsWithChildren<P>>) {\n function WithModal({\n isOpen,\n title = '',\n className = '',\n classes,\n footer,\n onClose,\n ...otherProps\n }: P & ModalProps): ReactElement {\n const {\n position,\n modalContainer,\n titleText,\n contentContainer,\n footerContainer,\n } = { ...defaultClasses, ...classes };\n\n function renderFooter() {\n if (footer) {\n return <div className={footerContainer}>{footer({})}</div>;\n }\n\n return <></>;\n }\n\n return (\n <Modal open={isOpen} className={`${position} with-modal`} onClose={onClose}>\n <div className={modalContainer}>\n <div className=\"flex items-center with-modal-title-bar\">\n <h6 className={titleText}>{title}</h6>\n <div className=\"flex-auto\" />\n <IconButton\n aria-label=\"close modal\"\n className=\"with-modal-close-button\"\n onClick={onClose}\n size=\"large\"\n >\n <CloseIcon />\n </IconButton>\n </div>\n <div className={`with-modal-content ${contentContainer}`}>\n <WrappedComponent {...otherProps as P} />\n </div>\n { renderFooter() }\n </div>\n </Modal>\n );\n }\n\n const wrappedComponentName = WrappedComponent.displayName ?? WrappedComponent.name;\n WithModal.displayName = `withModal(${wrappedComponentName})`;\n\n return WithModal;\n}\n\nexport default withModal;\n","import React from 'react';\nimport { ModalContent } from './StateContinuationContent.model';\nimport withModal from 'components/shared/HOC/WithModal';\n\nexport interface StateContinuationProps {\n eventTypeState: string;\n}\n\nfunction StateContinuation({ eventTypeState }: StateContinuationProps): React.ReactElement {\n return (\n <div>\n <p className=\"my-4\">\n {ModalContent.get(eventTypeState)}\n </p>\n </div>\n );\n}\n\nexport const StateContinuationModal = withModal<StateContinuationProps>(StateContinuation);\n\nexport default StateContinuation;\n","import { useEffect, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useFormikContext } from 'formik';\nimport dayjs from 'dayjs';\nimport { always, compose, F, ifElse, T, when } from 'ramda';\n\nimport { setEventTypes } from 'enter-cobra-qe/cobra-qe.slice';\nimport { handleDateChange } from 'shared/form-helpers';\nimport EventSelect from './EventTypeSelect';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport { useEventTypes } from 'shared/custom-hooks/useEventTypes';\nimport { StateContinuationModal } from './StateContinuation';\nimport AdapterDayJS from '@mui/lab/AdapterDayjs';\nimport LocalizationProvider from '@mui/lab/LocalizationProvider';\nimport DatePicker from '@mui/lab/DatePicker';\nimport TextField from '@mui/material/TextField';\nimport store from 'store';\nimport Skeleton from '@mui/material/Skeleton';\n\ninterface EventInfoFormProps {\n letterSent?: boolean;\n respPostmark?: boolean;\n}\n\nfunction EventInfoForm({ letterSent = false, respPostmark = false }: EventInfoFormProps) {\n const form = useFormikContext<any>();\n const events = useEventTypes();\n const dispatch = useDispatch<typeof store.dispatch>();\n\n useEffect(() => {\n dispatch(setEventTypes(events ?? []));\n }, [ events, dispatch ]);\n\n const EventSelectWithLoading = withLoopIcon(\n EventSelect,\n 'Loading event types...',\n events === null,\n 'event-type-loading',\n );\n\n const [ eventChangeModal, setEventChangeModal ] = useState(false);\n const [ eventTypeState, setEventTypeState ] = useState('');\n\n const eventTypeTest = when(\n (x: number) => x >= 25 && x <= 33 && x !== 27,\n compose(\n compose(setEventChangeModal, T),\n ifElse(\n (x: number) => x !== -1,\n compose(setEventTypeState,\n (x: any) => events?.find((type) => type.c_qualevid === parseInt(x))?.desc.substr(-2) ?? ''),\n compose(setEventTypeState, always('')),\n ),\n ),\n );\n\n function handleSelectChange(value: string) {\n form.handleChange('eventType')(value);\n eventTypeTest(parseInt(value));\n }\n\n return (\n <>\n <div className=\"grid grid-rows-2 grid-flow-col gap-4 w-full\">\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n label=\"Event Date\"\n value={form.values.eventDate ? dayjs(form.values.eventDate, 'YYYY-MM-DD').format('MM/DD/YYYY') : null}\n onChange={handleDateChange('eventDate', form)}\n InputProps={\n {\n className: !form.values.eventDate ? 'MuiFormLabel-root' : '',\n tabIndex: -1,\n disabled: respPostmark,\n }\n }\n disabled={respPostmark}\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n variant=\"outlined\"\n name=\"eventDate\"\n data-testid=\"event-date\"\n className=\"w-full event-info-event-date\"\n {...params}\n error={form.touched.eventDate && Boolean(form.errors.eventDate)}\n helperText={form.touched.eventDate && form.errors.eventDate as any}\n />\n )}\n />\n </LocalizationProvider>\n\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n label=\"Coverage Begins\"\n value={\n form.values.coverageBegins ? dayjs(form.values.coverageBegins, 'YYYY-MM-DD').format('MM/DD/YYYY') : null\n }\n onChange={handleDateChange('coverageBegins', form)}\n className=\"mb-4\"\n InputProps={\n {\n className: !form.values.coverageBegins ? 'MuiFormLabel-root' : '',\n tabIndex: -1,\n disabled: respPostmark || letterSent,\n }\n }\n disabled={respPostmark || letterSent}\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n variant=\"outlined\"\n data-testid=\"coverage-begins\"\n name=\"coverageBegins\"\n className=\"w-full event-info-coverage-begins\"\n {...params}\n error={form.touched.coverageBegins && Boolean(form.errors.coverageBegins)}\n helperText={form.touched.coverageBegins && form.errors.coverageBegins as any}\n />\n )}\n />\n </LocalizationProvider>\n\n {\n events !== null\n ?\n <EventSelectWithLoading\n onSelectChange={handleSelectChange}\n error={!!form.touched.eventType && !!form.errors.eventType}\n value={form.values.eventType?.toString() ?? '-1'}\n eventTypes={events}\n className=\"mb-4 w-full event-info-type\"\n disabled={respPostmark}\n />\n :\n <div className=\"w-full\" data-testid=\"event-type-skeleton\">\n <Skeleton variant=\"rectangular\" width=\"100%\" height={60} />\n </div>\n }\n\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n label=\"Paid Through (Optional)\"\n value={form.values.paidThrough ? dayjs(form.values.paidThrough, 'YYYY-MM-DD').format('MM/DD/YYYY') : null}\n onChange={handleDateChange('paidThrough', form)}\n className=\"mb-4 pl-2\"\n InputProps={\n {\n className: !form.values.coverageBegins ? 'MuiFormLabel-root' : '',\n tabIndex: -1,\n disabled: respPostmark || letterSent,\n }\n }\n disabled={respPostmark}\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n data-testid=\"paid-through\"\n variant=\"outlined\"\n name=\"paidThrough\"\n className=\"w-full event-info-paid-thru\"\n {...params}\n error={form.touched.paidThrough && Boolean(form.errors.paidThrough)}\n helperText={form.touched.paidThrough && form.errors.paidThrough as any}\n />\n )}\n />\n </LocalizationProvider>\n </div>\n <StateContinuationModal\n isOpen={eventChangeModal}\n onClose={compose(setEventChangeModal, F)}\n title=\"State Continuation Confirmation\"\n eventTypeState={eventTypeState}\n />\n </>\n );\n}\n\nexport default EventInfoForm;\n","import { useState, useRef, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { compose, tap, always } from 'ramda';\n\nimport request, { APIOptions } from 'shared/api-request';\nimport { QeEventType } from 'enter-cobra-qe/cobra-qe.types';\nimport { useErrorNotifier } from './useNotifiers';\nimport { selectSelectedCompany } from 'companies/companies.slice';\n\nexport function useEventTypes() {\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n\n const [ eventTypes, setEventTypes ] = useState<QeEventType[] | null>(null);\n\n const { current: abortCtrl } = useRef(new AbortController());\n const { current: setDefault } = useRef(compose(setEventTypes, always([])));\n const { current: handleError } = useRef(compose(\n tap(setDefault),\n useErrorNotifier(),\n ));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n const uri = `/api/companies/${compid}/cobra-qe/cobra-event-types`;\n const apiOpts: APIOptions = { method: 'GET', signal: abortCtrl.signal };\n request<QeEventType[]>(uri, apiOpts)\n .then((result) => {\n if (mountedRef.current) {\n setEventTypes(result ?? []);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n\n return () => {\n mountedRef.current = false;\n abortCtrl.abort();\n };\n }, [ handleError, abortCtrl, compid ]);\n\n return eventTypes;\n}\n","import Button from '@mui/material/Button';\nimport { FormikProvider, useFormik } from 'formik';\n\nimport styles from './EventInfoForm.module.css';\nimport { QeEventInfo } from '../cobra-qe.types';\nimport { validationSchema } from './event-info.validators';\nimport EventInfoForm from './EventInfoForm';\n\nexport interface QeEventInfoProps {\n data?: QeEventInfo;\n onNextStep: (data: QeEventInfo) => void;\n onCancel: () => void;\n}\n\nfunction EventInfo({ data = {}, onNextStep, onCancel }: QeEventInfoProps) {\n const form = useFormik<Partial<QeEventInfo>>({\n initialValues: {\n eventDate: undefined,\n coverageBegins: undefined,\n eventType: -1,\n paidThrough: undefined,\n ...data,\n },\n validationSchema,\n onSubmit: (values) => {\n onNextStep({\n ...values,\n eventType: parseInt(values.eventType?.toString() ?? '-1'),\n } as QeEventInfo);\n },\n });\n\n return (\n <form data-testid=\"event-info\">\n <div className=\"flex flex-col space-y-4\">\n <p>Enter the loss of coverage event details below.</p>\n <div className={`flex flex-wrap ${styles.twoCol}`}>\n <FormikProvider value={form}>\n <EventInfoForm />\n </FormikProvider>\n </div>\n </div>\n <div className=\"flex justify-end my-4\">\n <Button\n color=\"primary\"\n onClick={onCancel}\n data-testid=\"cancel\"\n tabIndex={-1}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"button\"\n onClick={form.submitForm}\n data-testid=\"next-step\"\n className=\"ml-4\"\n tabIndex={-1}\n >\n Next Step\n </Button>\n </div>\n </form>\n );\n}\n\nexport default EventInfo;\n","import React, { ReactElement } from 'react';\nimport Modal from '@mui/material/Modal';\nimport Button from '@mui/material/Button';\nimport ErrorOutline from '@mui/icons-material/ErrorOutline';\n\nimport styles from './CancelModel.module.css';\n\ninterface Props {\n title?: string;\n prompt?: string;\n closeText?: string;\n cancelText?: string;\n onCancel: () => void;\n onClose: () => void;\n isOpen: boolean;\n}\n\nfunction CancelModal({\n title = 'Are you sure you want to cancel?',\n prompt = 'Changes you have made so far will not be saved.',\n closeText = 'Stay',\n cancelText = 'Navigate away',\n isOpen,\n onCancel,\n onClose,\n}: Props): ReactElement {\n function makeBody() {\n return (\n <div className={`${styles.modal} absolute left-1/2 p-4 text-center bg-surface`}>\n <ErrorOutline className=\"w-12 h-12 uppercase my-3 text-caution\" />\n <h5 data-testid=\"cancel-modal-title\">{title}</h5>\n <p className=\"py-5\" data-testid=\"cancel-modal-prompt\">\n {prompt}\n </p>\n <div className=\"flex py-5\">\n <Button\n data-testid=\"cancel-modal-close\"\n className={'text-sm font-light flex-auto'}\n onClick={handleClose}\n variant=\"contained\"\n >\n {closeText}\n </Button>\n <div className=\"flex-auto\" />\n <Button\n data-testid=\"cancel-modal-confirm\"\n variant=\"contained\"\n color=\"inherit\"\n onClick={handleCancel}\n className={'text-sm uppercase font-light flex-auto bg-danger text-white'}\n >\n {cancelText}\n </Button>\n </div>\n </div>\n );\n }\n\n function handleCancel() {\n handleClose();\n onCancel();\n }\n\n function handleClose() {\n onClose();\n }\n\n return (\n <Modal\n open={isOpen}\n onClose={handleClose}\n aria-labelledby=\"cancel-modal-title\"\n aria-describedby=\"cancel-modal-description\"\n >\n {makeBody()}\n </Modal>\n );\n}\n\nexport default CancelModal;\n","import { FormikErrors } from 'formik';\nimport { clone, equals, flatten } from 'ramda';\nimport { Benefit, Dependent } from 'shared/types/non-plan-year.types';\nimport { QeBenefits } from '../cobra-qe.types';\n\n/**\n * Convert the covered dependents to a string to compare and find by index in the full\n * dependents array\n */\nexport function hashCoveredDependents(benefit: Benefit, dependents: Dependent[]): Benefit {\n return Object.fromEntries(\n Object.entries(clone(benefit))\n .map(([ k, v ]) => {\n return k === 'coveredDependents'\n ? [ k, v\n .map((d: Dependent) => dependents.findIndex(a => equals(d, a)).toString())\n .filter((s:string) => s !== '-1') ]\n : [ k, v ];\n }),\n ) as Benefit;\n}\n\n/**\n * Conform the redux state for benefits to the format needed for the benefits form.\n *\n * If the benefit has been previously selected the selected benefit is filled in for\n * that benefit, otherwise populate the benefit based on available benefits\n */\nexport function conformToForm(state: Benefit[], plans: QeBenefits[]): Benefit[] {\n return plans.reduce((acc: Benefit[], current) => {\n const foundBenefit = state.find((b) => b.planType === current.benefits[0].planType);\n\n return [ ...acc, foundBenefit ?? { ...current.benefits[0], plvlid: -1, coveredDependents: [] } ];\n }, []);\n}\n\n/**\n * Conform the selected benefits for the redux slice. This includes filtering out any\n * benefits where a selection was not made, and converting the hashed dependents to full\n * dependent objects\n */\nexport function conformToSlice(dependents: Dependent[], availablePlans: QeBenefits[]): (s: QeBenefits) => QeBenefits {\n const allPlans = flatten(availablePlans.map((plans) => plans.benefits));\n\n return (state: QeBenefits) => ({\n benefits: state.benefits\n .filter((b) => b.plvlid.toString() !== '-1')\n .map((b) => {\n const plvlid = parseInt(b.plvlid.toString());\n // Note: It should never be the case that the plan isn't found. If somehow that does happen, defaulting back to\n // the one selected might result in a mismatched label on the summary step, but likely in good data in the DB\n // since what we really care about is plvlid, which is preserved.\n // plvlid may or may not be unique\n const found = allPlans.find((plan) => (plan.plvlid === plvlid && plan.planType === b.planType)) ?? b;\n\n return {\n ...found,\n coveredDependents: b.coveredDependents.map((cd) => dependents[cd as unknown as number]),\n plvlid,\n cost: b.cost ? parseFloat(b.cost.toString()) : 0.00,\n subsidy: b.subsidy ? parseFloat(b.subsidy.toString()) : undefined,\n subsidyEnd: b.subsidyEnd,\n };\n }),\n });\n}\n\n/* istanbul ignore next */ // This function exists solely to work around type errors\nexport function benefitErrorMessage(\n errors: FormikErrors<{benefits: Benefit[];}>,\n idx: number,\n fieldName: keyof Benefit): string {\n if (!errors.benefits) {\n return '';\n }\n\n if (idx >= errors.benefits.length) {\n return '';\n }\n\n const benErrors = (errors.benefits as FormikErrors<Benefit[]>)[idx] as FormikErrors<Benefit>;\n\n /* eslint-disable-next-line @typescript-eslint/no-unnecessary-condition */ // benErrors can be undefined because errors is a sparse array\n return benErrors && !!benErrors[fieldName] ? (benErrors[fieldName] as string) : '';\n}\n/* istanbul ignore stop */\n","import { useFormikContext } from 'formik';\nimport TextField from '@mui/material/TextField';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport dayjs from 'dayjs';\n\nimport { Benefit } from 'shared/types/non-plan-year.types';\nimport { benefitErrorMessage } from './benefit-state-helpers';\nimport AdapterDayJS from '@mui/lab/AdapterDayjs';\nimport LocalizationProvider from '@mui/lab/LocalizationProvider';\nimport DatePicker from '@mui/lab/DatePicker';\n\ninterface BenefitsSubsidyFieldsProps {\n idx: number;\n benefit: Benefit;\n disabled?: boolean;\n}\n\nfunction BenefitSubsidyFields({ idx, benefit, disabled = false }: BenefitsSubsidyFieldsProps) {\n const { setFieldValue, handleChange, errors } = useFormikContext<{benefits: Benefit[];}>();\n\n function handleDateChange() {\n return (value: any) => setFieldValue(\n `benefits.${idx}.subsidyEnd`, value ? dayjs(value, 'MM/DD/YYYY').format('YYYY-MM-DD') : null,\n );\n }\n\n return (\n <>\n <TextField\n variant=\"outlined\"\n label=\"ER Subsidy\"\n name={`benefits.${idx}.subsidy`}\n value={benefit.subsidy ?? ''}\n InputProps={ {\n startAdornment: <InputAdornment position=\"start\">$</InputAdornment>,\n disabled,\n } }\n className=\"mr-4\"\n data-testid={`benefits.${idx}.subsidy`}\n onChange={handleChange}\n error={benefitErrorMessage(errors, idx, 'subsidy').length > 0}\n helperText={benefitErrorMessage(errors, idx, 'subsidy')}\n />\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n label=\"Subsidy Ends\"\n value={benefit.subsidyEnd ? dayjs(benefit.subsidyEnd, 'YYYY-MM-DD').format('MM/DD/YYYY') : null}\n onChange={handleDateChange()}\n className=\"m-4\"\n InputProps={ {\n className: !benefit.subsidyEnd ? 'MuiFormLabel-root' : '' ,\n disabled,\n } }\n disabled={disabled}\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n data-testid={`benefits.${idx}.subsidyEnd`}\n variant=\"outlined\"\n className=\"w-full\"\n {...params}\n error={benefitErrorMessage(errors, idx, 'subsidyEnd').length > 0}\n helperText={benefitErrorMessage(errors, idx, 'subsidyEnd')}\n />\n )}\n />\n </LocalizationProvider>\n </>\n );\n}\n\nexport default BenefitSubsidyFields;\n","import FormControlLabel from '@mui/material/FormControlLabel';\nimport Checkbox from '@mui/material/Checkbox';\nimport { useFormikContext } from 'formik';\n\nimport { Benefit, Dependent } from 'shared/types/non-plan-year.types';\n\ninterface BenefitDependentsProps {\n dependents: Dependent[];\n idx: number;\n benefit: Benefit;\n disabled?: boolean;\n}\n\nfunction BenefitDependents({ dependents, idx, benefit, disabled = false }: BenefitDependentsProps) {\n const { handleChange } = useFormikContext<{benefits: Benefit[];}>();\n\n return (\n <>\n <h6>Covered Dependents</h6>\n <div className=\"grid grid-cols-2 grid-flow-row\">\n {dependents.map((d, ii) => (\n <FormControlLabel\n control={\n <Checkbox\n value={ii}\n checked={benefit.coveredDependents.includes(`${ii}` as any)}\n name={`benefits.${idx}.coveredDependents`}\n color=\"primary\"\n data-testid={`checkbox-${d.name.toLocaleLowerCase().replace(/\\W+/g, '-')}`}\n onChange={!disabled ? handleChange : undefined}\n inputProps={ { disabled } }\n />\n }\n disabled={disabled}\n label={d.name}\n labelPlacement=\"end\"\n key={ii}\n />\n ))}\n </div>\n </>\n );\n}\n\nexport default BenefitDependents;\n","import React, { useRef, useState } from 'react';\nimport { FieldArray, useFormikContext } from 'formik';\nimport FormControl from '@mui/material/FormControl';\nimport TextField from '@mui/material/TextField';\nimport InputAdornment from '@mui/material/InputAdornment';\n\nimport { Benefit, Dependent } from 'shared/types/non-plan-year.types';\nimport { QeBenefits } from 'enter-cobra-qe/cobra-qe.types';\nimport { useSelector } from 'react-redux';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport styles from 'components/shared/qe/Benefits.module.css';\nimport InputLabel from '@mui/material/InputLabel';\nimport FormErrorText from 'components/shared/FormErrorText';\nimport Select from '@mui/material/Select';\nimport { benefitErrorMessage } from './benefit-state-helpers';\nimport BenefitSubsidyFields from './BenefitSubsidyFields';\nimport BenefitDependents from './BenefitDependents';\nimport { selectQeEventInfo } from 'enter-cobra-qe/cobra-qe.slice';\nimport { getNoBenefitsMessage } from 'shared/api/cobraQeApi';\nimport dayjs from 'dayjs';\nimport CancelModal from 'components/shared/CancelModal';\nimport { always, compose, equals, F, T, when } from 'ramda';\n\ninterface BenefitsFormProps {\n dependents: Dependent[];\n availablePlans: QeBenefits[];\n letterSent?: boolean;\n respPostmark?: boolean;\n}\n\nfunction BenefitsForm({ dependents, availablePlans, letterSent = false, respPostmark = false }: BenefitsFormProps) {\n const { values, handleChange, errors } = useFormikContext<{ benefits: Benefit[]; }>();\n const planSelectLabelRef = useRef<HTMLLabelElement>(null);\n const { hasCobraErsubsidy } = useSelector(selectSelectedCompany) ?? { hasCobraErsubsidy: false };\n const eventInfo = useSelector(selectQeEventInfo);\n const [ costConfirmationModal, setConfirmationModal ] = useState(false);\n const [ hasTriggeredModal, setHasTriggeredModal ] = useState(false);\n\n function displayErSubsidy(idx: number, benefit: Benefit) {\n return hasCobraErsubsidy\n ? <BenefitSubsidyFields idx={idx} benefit={benefit} disabled={respPostmark} />\n : <></>;\n }\n\n function showDependents(idx: number, benefit: Benefit) {\n return dependents.length > 0\n ? (\n <BenefitDependents\n dependents={dependents}\n idx={idx}\n benefit={benefit}\n disabled={letterSent || respPostmark}\n />\n )\n : <></>;\n }\n\n function renderFieldArray() {\n return () => (\n <div>\n {\n values.benefits.length > 0\n ? (\n values.benefits.map((b: Benefit, idx: number) => (\n <div\n key={idx}\n className={`${styles.summaryContainer} flex flex-col mb-8 p-4`}\n data-testid={`benefitSelector-${b.planTypeName}`}\n >\n <h6 className={`${styles.color} mb-4`}>{b.planTypeName}</h6>\n <div className=\"flex flex-row\">\n <div className=\"flex flex-grow flex-col\">\n <FormControl variant=\"outlined\">\n <InputLabel\n ref={planSelectLabelRef}\n >\n Plan\n </InputLabel>\n\n <Select\n name={`benefits.${idx}.plvlid`}\n value={b.plvlid}\n native\n fullWidth\n data-testid={`benefits.${idx}.planSelect`}\n label=\"Plan\"\n variant=\"outlined\"\n className=\"mb-4\"\n onChange={handleChange}\n error={!!benefitErrorMessage(errors, idx, 'plvlid')}\n inputProps={ { disabled: letterSent || respPostmark } }\n disabled={letterSent || respPostmark}\n >\n <option value=\"-1\">None Selected</option>\n {availablePlans.find(({ benefits }) => benefits\n .some(benefit => benefit.planTypeName === b.planTypeName))?.benefits\n .map(item => (\n <option key={item.plvlid} value={item.plvlid}>\n {item.displayName}\n </option>\n ))}\n </Select>\n <FormErrorText\n show={!!benefitErrorMessage(errors, idx, 'plvlid')}\n message={benefitErrorMessage(errors, idx, 'plvlid')}\n className=\"planSelectHelper\"\n />\n </FormControl>\n <div className=\"flex flex-row\">\n <TextField\n variant=\"outlined\"\n label=\"Cost\"\n name={`benefits.${idx}.cost`}\n data-testid={`benefits.${idx}.cost`}\n placeholder=\"Default\"\n value={b.cost === 0 ? '' : b.cost}\n InputProps={ {\n startAdornment: <InputAdornment position=\"start\">$</InputAdornment>,\n disabled: respPostmark,\n } }\n className=\"mr-4\"\n onChange={handleChange}\n onFocus={\n when(\n compose(equals(false), always(hasTriggeredModal)),\n compose(\n compose(setHasTriggeredModal, T),\n compose(setConfirmationModal, T),\n ),\n )\n }\n\n error={benefitErrorMessage(errors, idx, 'cost').length > 0}\n helperText={benefitErrorMessage(errors, idx, 'cost')}\n />\n {displayErSubsidy(idx, b)}\n </div>\n </div>\n <div className={`flex flex-col${dependents.length > 0 ? ' ml-4' : ''}`}>\n {showDependents(idx, b)}\n </div>\n </div>\n </div >\n ))\n )\n : <p>{getNoBenefitsMessage(dayjs(eventInfo.coverageBegins).format('MM/DD/YYYY'))}</p>\n }\n <CancelModal\n isOpen={costConfirmationModal}\n onCancel={compose(setConfirmationModal, F)}\n onClose={compose(setConfirmationModal, F)}\n title={'Are you sure you wish to edit the rate?'}\n prompt=\"Flores keeps default rates on file for all benefits except Age-Banded plans.\n If your plan is not an Age-Banded plan, we suggest using the default rates.\n If your plan is not an Age-Banded plan and you still believe the rates should be edited,\n please confirm with your account manager.\"\n closeText=\"Yes\"\n cancelText=\"No\"\n />\n </div>\n );\n }\n\n return (\n <FieldArray\n name=\"benefits\"\n render={renderFieldArray()}\n />\n );\n}\n\nexport default BenefitsForm;\n","import * as yup from 'yup';\n\nexport const validationSchema = yup\n .object({\n benefits: yup\n .array()\n .of(\n yup\n .object()\n .nullable()\n .shape({\n plvlid: yup\n .string(),\n\n cost: yup\n .number()\n .typeError('Must be a number')\n .min(0, 'Must be a positive number'),\n\n subsidy: yup\n .number()\n .typeError('Must be a number')\n .min(0, 'Must be a positive number')\n .when('subsidyEnd', {\n is: (subsidyEnd: Date | undefined) => !!subsidyEnd,\n then: yup\n .number()\n .typeError('Must be a number')\n .required('Subsidy is required.'),\n otherwise: yup\n .number()\n .nullable()\n .typeError('Must be a number'),\n }),\n subsidyEnd: yup\n .date()\n .nullable()\n .when('subsidy', {\n is: (subsidy: number | undefined) => subsidy && (subsidy > 0),\n then: yup\n .date()\n .typeError('Subsidy End must be a valid date.')\n .required('Subsidy End is required.'),\n }),\n }, [ 'subsidy', 'subsidyEnd' ] as any)),\n });\n","import React from 'react';\nimport { FormikProvider, useFormik } from 'formik';\nimport { compose } from 'ramda';\n\nimport { Benefit, Dependent } from 'shared/types/non-plan-year.types';\nimport { QeBenefits, CobraQeFormProps } from '../cobra-qe.types';\nimport { conformToForm, conformToSlice, hashCoveredDependents } from './benefit-state-helpers';\nimport BenefitsForm from './BenefitsForm';\nimport { validationSchema } from './cobra-benefits.validators';\nimport Button from '@mui/material/Button';\n\ninterface BenefitsFormContainerProps extends CobraQeFormProps {\n availablePlans: QeBenefits[];\n dependents: Dependent[];\n selectedBenefits: Benefit[];\n}\n\nfunction BenefitsFormContainer({\n availablePlans,\n dependents,\n selectedBenefits,\n onNextStep,\n onCancel,\n}: BenefitsFormContainerProps) {\n const form = useFormik<{benefits: Benefit[];}>({\n initialValues: {\n benefits: conformToForm(selectedBenefits, availablePlans)\n .map(b => hashCoveredDependents(b, dependents)),\n },\n validationSchema,\n onSubmit: compose(validateLength, conformToSlice(dependents, availablePlans)),\n });\n\n function validateLength(state: QeBenefits) {\n if (state.benefits.length) {\n onNextStep(state);\n } else {\n window.alert('Please fill out at least one benefit');\n }\n }\n\n return (\n <form data-testid=\"benefits-form\">\n <div className=\"flex flex-col space-y-4 mt-10\">\n <FormikProvider value={form}>\n <BenefitsForm dependents={dependents} availablePlans={availablePlans} />\n </FormikProvider>\n </div>\n <div className=\"flex justify-end my-4\">\n <Button\n color=\"primary\"\n onClick={onCancel}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n data-testid=\"cobraQeNextStep\"\n className=\"ml-4\"\n type=\"button\"\n onClick={form.submitForm}\n >\n Next Step\n </Button>\n </div>\n <div className=\"flex flex-col space-y-4\" />\n </form>\n );\n}\n\nexport default BenefitsFormContainer;\n","import { Dayjs } from 'dayjs';\n\nimport { Benefit, Dependent } from 'shared/types/non-plan-year.types';\nimport { CobraQeFormProps } from '../cobra-qe.types';\nimport Loading from 'components/shared/Loading';\nimport { useCobraPlans } from './useCobraPlans';\nimport BenefitsFormContainer from './BenefitsFormContainer';\n\ninterface CobraQeBenefitsProps extends CobraQeFormProps {\n dependents: Dependent[];\n selectedBenefits: Benefit[];\n effectiveDate: string | Dayjs;\n}\n\nfunction CobraQeBenefits({\n selectedBenefits,\n dependents,\n onNextStep,\n onCancel,\n effectiveDate,\n}: CobraQeBenefitsProps) {\n const availablePlans = useCobraPlans(effectiveDate);\n\n return availablePlans === null\n ? <Loading text=\"Loading Benefits...\" />\n : (\n <div>\n <div className=\"flex flex-col mb-4\">\n <p>\n Select the benefits the insured and their dependent(s) are eligible to continue under COBRA.\n </p>\n </div>\n <BenefitsFormContainer\n availablePlans={availablePlans}\n dependents={dependents}\n selectedBenefits={selectedBenefits}\n onNextStep={onNextStep}\n onCancel={onCancel}\n />\n </div>\n );\n}\n\nexport default CobraQeBenefits;\n\n","import { useState, useRef, useEffect } from 'react';\nimport { compose, tap, always } from 'ramda';\nimport dayjs from 'dayjs';\nimport { useSelector } from 'react-redux';\n\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { QeBenefits } from '../cobra-qe.types';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { getCobraAvailablePlans } from 'shared/api/cobraQeApi';\n\nexport function useCobraPlans(effectiveDate?: string | dayjs.Dayjs) {\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const [ plans, setPlans ] = useState<QeBenefits[] | null>(null);\n\n const { current: abortCtrl } = useRef(new AbortController());\n const { current: setDefault } = useRef(compose(setPlans, always([])));\n const { current: handleError } = useRef(compose(\n tap(setDefault),\n useErrorNotifier(),\n ));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n getCobraAvailablePlans(compid, effectiveDate ? effectiveDate : '')\n .then((result) => {\n if (mountedRef.current) {\n setPlans(result);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n\n return () => {\n mountedRef.current = false;\n abortCtrl.abort();\n };\n }, [ compid, handleError, abortCtrl, effectiveDate ]);\n\n return plans;\n}\n","import React, { useState } from 'react';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport Avatar from '@mui/material/Avatar';\nimport DeleteIcon from '@mui/icons-material/DeleteOutlineOutlined';\nimport dayjs, { Dayjs } from 'dayjs';\n\nimport { Dependent } from 'shared/types/non-plan-year.types';\nimport Button from '@mui/material/Button';\nimport Tooltip from '@mui/material/Tooltip';\nimport { colorFromLetters } from 'components/shared/avatar-color-palette';\nimport CancelModal from 'components/shared/CancelModal';\n\ninterface DependentsTableRowProps {\n dependent: Dependent;\n dateFormat?: string;\n onDependentDeleted?: (d: Dependent) => void;\n}\n\nfunction DependentsTableRow({\n dependent,\n dateFormat = 'MM/DD/YYYY',\n onDependentDeleted,\n}: DependentsTableRowProps): React.ReactElement {\n const [ showModal, setShowModal ] = useState(false);\n\n function dependentInitials(): string {\n return dependent.name ? dependent.name.split(' ').map(n => n.charAt(0).toUpperCase()).join('') : '';\n }\n\n function formatDate(date?: string| Dayjs): string {\n return date ? dayjs(date).format(dateFormat) : '';\n }\n\n function formatGender(gender?: string): string {\n switch (gender) {\n case 'M':\n return 'Male';\n case 'F':\n return 'Female';\n default:\n return 'Unknown';\n }\n }\n\n function formatRelation(relation?: string): string {\n switch (relation) {\n case 'S':\n return 'Spouse';\n case 'C':\n return 'Child';\n case 'O':\n return 'Other';\n default:\n return 'Unknown';\n }\n }\n\n function handleDelete() {\n if (onDependentDeleted) {\n onDependentDeleted(dependent);\n }\n }\n\n function handleModalClose() {\n setShowModal(false);\n }\n\n function deleteTooltip() {\n return onDependentDeleted ? 'Delete' : 'Existing dependents cannot be deleted';\n }\n\n function avatarColor() {\n return colorFromLetters(dependentInitials());\n }\n\n function onDeleteButtonClicked() {\n setShowModal(true);\n }\n\n return (\n <>\n <TableRow className=\"transition-opacity duration-100 ease-linear\">\n <TableCell>\n <Avatar className={`p-2 text-sm ${avatarColor()}`}>{dependentInitials()}</Avatar>\n </TableCell>\n <TableCell className=\"text-sm\">{dependent.name}</TableCell>\n <TableCell className=\"text-sm\">{dependent.ssn}</TableCell>\n <TableCell className=\"text-sm\">{formatDate(dependent.dateOfBirth)}</TableCell>\n <TableCell className=\"text-sm\">{formatRelation(dependent.relation)}</TableCell>\n <TableCell className=\"text-sm\">{formatGender(dependent.sex)}</TableCell>\n <TableCell>\n <Tooltip title={deleteTooltip()}>\n <span>\n <Button\n onClick={onDeleteButtonClicked}\n data-testid={`${dependent.name}-delete`}\n className=\"text-md\"\n disabled={!onDependentDeleted}\n >\n <DeleteIcon className=\"text-md\" />\n </Button>\n </span>\n </Tooltip>\n </TableCell>\n </TableRow>\n <CancelModal\n isOpen={showModal}\n onCancel={handleDelete}\n onClose={handleModalClose}\n title=\"Are you sure you want to delete the dependent?\"\n prompt=\"\"\n cancelText=\"Delete\"\n />\n </>\n );\n}\n\nexport default DependentsTableRow;\n","import React from 'react';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\n\nimport { Dependent } from 'shared/types/non-plan-year.types';\nimport DependentsTableRow from './DependentsTableRow';\n\ninterface DependentsTableProps {\n initialDependents: Dependent[];\n addedDependents: Dependent[];\n onDependentDeleted?: (d: Dependent) => void;\n}\n\nfunction DependentsTable({\n initialDependents,\n addedDependents,\n onDependentDeleted,\n}: DependentsTableProps): React.ReactElement {\n function totalDependents() {\n return initialDependents.length + addedDependents.length;\n }\n\n function handleDelete(dependent: Dependent) {\n if (onDependentDeleted) {\n onDependentDeleted(dependent);\n }\n }\n\n function header(): React.ReactElement {\n return (\n <TableRow>\n <TableCell />\n <TableCell className=\"text-sm\">Dependent Name</TableCell>\n <TableCell className=\"text-sm\">Dependent SSN</TableCell>\n <TableCell className=\"text-sm\">Date of Birth</TableCell>\n <TableCell className=\"text-sm\">Relation</TableCell>\n <TableCell className=\"text-sm\">Gender</TableCell>\n <TableCell className=\"text-sm\">Action</TableCell>\n </TableRow>\n );\n }\n\n function body(): React.ReactElement {\n if (totalDependents() < 1) {\n return (\n <TableRow>\n <TableCell colSpan={7}>\n <p className=\"italic\">No dependents are available</p>\n </TableCell>\n </TableRow>\n );\n }\n\n return (\n <>\n {initialDependents.map((d, index) => (\n <DependentsTableRow\n dependent={d}\n key={index}\n />\n ))}\n {addedDependents.map((d, index) => (\n <DependentsTableRow\n dependent={d}\n onDependentDeleted={handleDelete}\n key={index}\n />\n ))}\n </>\n );\n }\n\n return (\n <div className=\"w-full\">\n <Table className=\"w-full\">\n <TableHead>\n {header()}\n </TableHead>\n <TableBody>\n {body()}\n </TableBody>\n </Table>\n </div>\n );\n}\n\nexport default DependentsTable;\n","import * as yup from 'yup';\nimport dayjs from 'dayjs';\n\nimport { fname, lname, ssn } from 'shared/common-validators';\n\nexport const validationSchema = yup.object({\n dateOfBirth: yup\n .date()\n .transform(\n (value, originalValue) => dayjs(originalValue).toDate(),\n )\n .max(dayjs(), 'Birthdate must be before today')\n .typeError('Please enter a valid date')\n .nullable(),\n relation: yup\n .string(),\n sex: yup\n .string(),\n ...ssn,\n ...fname,\n ...lname,\n});\n","import React, { useRef } from 'react';\nimport Button from '@mui/material/Button';\nimport TextField from '@mui/material/TextField';\nimport FormControl from '@mui/material/FormControl';\nimport InputLabel from '@mui/material/InputLabel';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport Select from '@mui/material/Select';\nimport dayjs from 'dayjs';\nimport { useFormik } from 'formik';\n\nimport { Dependent } from 'shared/types/non-plan-year.types';\nimport { validationSchema } from './add-new-dependent.validators';\nimport { handleDateChange, handleSelectChange } from 'shared/form-helpers';\nimport withModal from 'components/shared/HOC/WithModal';\nimport LocalizationProvider from '@mui/lab/LocalizationProvider';\nimport DatePicker from '@mui/lab/DatePicker';\nimport AdapterDayJS from '@mui/lab/AdapterDayjs';\n\nexport interface AddNewDependentFormProps {\n onSaveDependent: (data: Dependent) => void;\n onCancel: () => void;\n}\n\nexport function AddNewDependent({ onSaveDependent, onCancel }: AddNewDependentFormProps): React.ReactElement {\n const form = useFormik({\n initialValues: {\n fname: '',\n lname: '',\n ssn: '',\n dateOfBirth: '',\n relation: '',\n sex: '',\n },\n validationSchema: validationSchema,\n onSubmit: (values) => {\n onSaveDependent({ ...values, name: `${values.fname} ${values.lname}`, ssn: values.ssn.toString() } as Dependent);\n },\n });\n\n const genderLabelRef = useRef<HTMLLabelElement>(null);\n const relationLabelRef = useRef<HTMLLabelElement>(null);\n\n function handleCancel() {\n onCancel();\n }\n\n function displayErrorText(y: boolean) {\n if (y) {\n return (\n <FormHelperText\n disabled\n error\n data-testid=\"selectError\"\n >This field is required\n </FormHelperText>\n );\n } else {\n return (<></>);\n }\n }\n\n return (\n <form data-testid=\"add-new-dependent-form\">\n <div className=\"flex flex-col space-y-4\">\n <div className=\"flex flex-row\">\n <TextField\n variant=\"outlined\"\n label=\"First name\"\n name=\"fname\"\n value={form.values.fname}\n error={form.touched.fname && Boolean(form.errors.fname)}\n helperText={form.touched.fname && form.errors.fname}\n onChange={form.handleChange}\n InputProps={\n {\n className: !form.values.fname ? 'MuiFormLabel-root' : '',\n tabIndex: -1,\n }\n }\n fullWidth\n data-testid=\"add-new-dependent-first-name\"\n />\n </div>\n <div className=\"flex flex-row\">\n <TextField\n variant=\"outlined\"\n label=\"Last name\"\n name=\"lname\"\n value={form.values.lname}\n error={form.touched.lname && Boolean(form.errors.lname)}\n helperText={form.touched.lname && form.errors.lname}\n onChange={form.handleChange}\n fullWidth\n InputProps={\n {\n className: !form.values.lname ? 'MuiFormLabel-root' : '',\n tabIndex: -1,\n }\n }\n data-testid=\"add-new-dependent-last-name\"\n />\n </div>\n <div className=\"flex flex-row\">\n <TextField\n variant=\"outlined\"\n name=\"ssn\"\n label=\"SSN (Optional)\"\n value={form.values.ssn}\n onChange={form.handleChange}\n error={form.touched.ssn && Boolean(form.errors.ssn)}\n helperText={form.touched.ssn && form.errors.ssn}\n InputProps={\n {\n className: !form.values.ssn ? 'MuiFormLabel-root' : '',\n tabIndex: -1,\n }\n }\n fullWidth\n data-testid=\"add-new-dependent-ssn\"\n />\n </div>\n <div className=\"flex flex-row\">\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n label=\"Date of Birth (Optional)\"\n value={form.values.dateOfBirth ? dayjs(form.values.dateOfBirth, 'YYYY-MM-DD').format('MM/DD/YYYY') : null}\n onChange={handleDateChange('dateOfBirth', form)}\n inputFormat=\"MM/DD/YYYY\"\n InputProps={\n {\n className: !form.values.dateOfBirth ? 'MuiFormLabel-root' : '',\n tabIndex: -1,\n }\n }\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n data-testid=\"add-new-dependent-dob\"\n variant=\"outlined\"\n className=\"w-full\"\n {...params}\n error={form.touched.dateOfBirth && Boolean(form.errors.dateOfBirth)}\n helperText={form.touched.dateOfBirth && form.errors.dateOfBirth}\n />\n )}\n />\n </LocalizationProvider>\n </div>\n <div className=\"flex flex-row\">\n <FormControl variant=\"outlined\" className=\"w-full\">\n <InputLabel ref={relationLabelRef} id=\"relation-select-label\">Relation (Optional)</InputLabel>\n <Select\n onChange={handleSelectChange('relation', form)}\n value={form.values.relation}\n native\n fullWidth\n data-testid=\"add-new-dependent-relation\"\n className={!form.values.relation ? 'MuiFormLabel-root' : ''}\n error={form.touched.relation && Boolean(form.errors.relation)}\n tabIndex={-1}\n >\n <option />\n <option value=\"S\">Spouse</option>\n <option value=\"C\">Child</option>\n <option value=\"O\">Other</option>\n </Select>\n {displayErrorText(!!form.errors.relation)}\n </FormControl>\n </div>\n <div className=\"flex flex-row\">\n <FormControl variant=\"outlined\" className=\"w-full\">\n <InputLabel ref={genderLabelRef} id=\"gender-select-label\">Gender (Optional)</InputLabel>\n <Select\n onChange={handleSelectChange('sex', form)}\n value={form.values.sex}\n native\n fullWidth\n data-testid=\"add-new-dependent-gender\"\n className={!form.values.sex ? 'MuiFormLabel-root' : ''}\n error={form.touched.sex && Boolean(form.errors.sex)}\n tabIndex={-1}\n >\n <option />\n <option value=\"F\">Female</option>\n <option value=\"M\">Male</option>\n </Select>\n {displayErrorText(!!form.errors.sex)}\n </FormControl>\n </div>\n </div>\n <div className=\"flex justify-end mt-8\">\n <Button\n color=\"primary\"\n onClick={handleCancel}\n data-testid=\"add-new-dependent-cancel\"\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"button\"\n onClick={form.submitForm}\n data-testid=\"add-new-dependent-save\"\n className=\"ml-4\"\n >\n Save Dependent\n </Button>\n </div>\n </form>\n );\n}\n\nexport default withModal(AddNewDependent);\n","import { ReactElement, useState } from 'react';\nimport Button from '@mui/material/Button';\nimport AddIcon from '@mui/icons-material/Add';\nimport Tooltip from '@mui/material/Tooltip';\n\nimport { Dependent, QeDependents } from 'shared/types/non-plan-year.types';\nimport DependentsTable from './DependentsTable';\nimport AddNewDependent from './add-new-dependent/AddNewDependent';\nimport styles from './Dependents.module.css';\nimport { noop } from 'shared/utils';\nimport { ChangeNotifier } from 'shared/types/form.types';\n\ninterface DependentsProps extends ChangeNotifier {\n initialAddedDependents?: Dependent[];\n dependents?: Dependent[];\n submitText: string;\n onNextStep: (data: QeDependents) => void;\n cancelText?: string;\n saving?: boolean;\n onCancel?: () => void;\n}\n\nfunction Dependents({\n dependents = [],\n initialAddedDependents = [],\n onNextStep,\n onCancel,\n onHasChanged = noop,\n submitText,\n saving,\n cancelText = 'Cancel',\n}: DependentsProps): ReactElement {\n const [ openAddDependentModal, setOpenAddDependentModal ] = useState(false);\n const [ addedDependents, setAddedDependents ] = useState<Dependent[]>(initialAddedDependents);\n\n function handleDelete(dependent: Dependent) {\n const newDependents = addedDependents.filter((d) => {\n return d.name !== dependent.name ||\n d.relation !== dependent.relation ||\n d.dateOfBirth !== dependent.dateOfBirth ||\n d.ssn !== dependent.ssn ||\n d.dateOfBirth !== dependent.dateOfBirth;\n });\n setAddedDependents(newDependents);\n }\n\n function handleNext() {\n onNextStep({ initialDependents: dependents, addedDependents });\n onHasChanged(false);\n // Reset added dependents for internally tracked state to remain in sync with parent\n setAddedDependents([]);\n }\n\n function handleNewDependentClicked() {\n setOpenAddDependentModal(true);\n }\n\n function handleAddDependent(dep: Dependent) {\n setAddedDependents([ ...addedDependents, dep ]);\n onHasChanged(true);\n setOpenAddDependentModal(false);\n }\n\n function handleCancelAddDependent() {\n setOpenAddDependentModal(false);\n }\n\n function totalDependents() {\n return dependents.length + addedDependents.length;\n }\n\n function canAddDependents() {\n return totalDependents() < 10;\n }\n\n function addDependentTooltip() {\n return canAddDependents() ? '' : 'No more than 10 dependents can be added.';\n }\n\n return (\n <div data-testid=\"dependents-container\">\n <div className=\"flex justify-end\">\n <Tooltip title={addDependentTooltip()}>\n <span>\n <Button\n variant=\"outlined\"\n color=\"primary\"\n className=\"p-2\"\n onClick={handleNewDependentClicked}\n data-testid=\"addDependent\"\n disabled={!canAddDependents()}\n >\n <AddIcon className=\"mr-2\" />\n New Dependent\n </Button>\n </span>\n </Tooltip>\n </div>\n <div className=\"flex flex-row pr-4\">\n <DependentsTable\n initialDependents={dependents}\n addedDependents={addedDependents}\n onDependentDeleted={handleDelete}\n />\n </div>\n <div className=\"flex justify-end my-4\">\n { onCancel ?\n <Button\n color=\"primary\"\n onClick={onCancel}\n >\n {cancelText}\n </Button> : '' }\n\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={handleNext}\n data-testid=\"cobraQeNextStep\"\n className=\"ml-4\"\n disabled={saving}\n >\n {submitText}\n </Button>\n <AddNewDependent\n title=\"Add Dependent\"\n isOpen={openAddDependentModal}\n data-testid=\"addDependentModal\"\n onClose={handleCancelAddDependent}\n onSaveDependent={handleAddDependent}\n onCancel={handleCancelAddDependent}\n classes={ {\n modalContainer: `${styles.modal} absolute left-1/2 text-center`,\n } }\n />\n </div>\n </div>\n );\n}\n\nexport default Dependents;\n","import { useEffect } from 'react';\nimport Dependents from 'components/shared/dependents/Dependents';\nimport { Dependent, QeDependents } from 'shared/types/non-plan-year.types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { loadInitialDependents, selectInitialDependents } from 'enter-cobra-qe/cobra-qe.slice';\nimport store from 'store';\n\ninterface CobraQeDependentsProps {\n empno: string;\n initialAddedDependents: Dependent[];\n onNextStep: (data: QeDependents) => void;\n onCancel?: () => void;\n}\n\nfunction CobraQeDependents({\n onNextStep,\n onCancel,\n empno,\n initialAddedDependents = [],\n}: CobraQeDependentsProps) {\n const dispatch = useDispatch<typeof store.dispatch>();\n // todo: refactor to useDependents\n const initialDependents = useSelector(selectInitialDependents);\n\n const company = useSelector(selectSelectedCompany);\n\n useEffect(() => {\n if (company) {\n dispatch(loadInitialDependents(company.compid, empno));\n }\n }, [ dispatch, company, empno ]);\n\n return (\n <div className=\"flex flex-col space-y-4\">\n <p>\n Dependents who are losing coverage as a result of the COBRA Qualifying Event should be listed below.\n </p>\n <Dependents\n onNextStep={onNextStep}\n onCancel={onCancel}\n dependents={initialDependents}\n initialAddedDependents={initialAddedDependents}\n submitText=\"Next Step\"\n cancelText=\"Cancel\"\n />\n </div>\n );\n}\n\nexport default CobraQeDependents;\n","import { isNil } from 'ramda';\nimport { useEffect, useState } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport { UnregisterCallback } from 'history';\n\nexport function useHistoryBlock(\n regex: RegExp,\n unMountCallback?: () => void,\n addedCondition = true,\n) {\n const history = useHistory();\n const [ navUnblock, setNavUnblock ] = useState<UnregisterCallback | null>(null);\n\n useEffect(() => {\n const unblock = history.block((location) => {\n if (!regex.test(location.pathname) && addedCondition) {\n // Note: to future developers. It is claimed in the react-router documentation that you can supply your own modal\n // This is a lie. If you track through the code, the only allowed return values from this function are void, false,\n // or a string. If you return false or void, navigation is not blocked. If you return any string, even '',\n // window.confirm is used, not the modal you want. It will show your modal, but it pops up a confirm and uses that\n // to determine whether to block or allow navigation.\n return 'Changes you have made so far will not be saved. Are you sure you want to cancel?';\n }\n });\n\n // this callback here is a workaround to store a function as state\n setNavUnblock(() => unblock);\n\n return () => {\n if (!isNil(unMountCallback)) {\n unMountCallback();\n }\n\n unblock();\n };\n }, [ history, regex, unMountCallback, addedCondition ]);\n\n return navUnblock;\n}\n","export default __webpack_public_path__ + \"static/media/404.d808a46d.svg\";","import React from 'react';\nimport { useHistory } from 'react-router-dom';\nimport Typography from '@mui/material/Typography';\nimport Button from '@mui/material/Button';\n\nimport styles from './NotFound.module.css';\nimport notFoundImg from 'images/404.svg';\nimport PageContentPaper from 'components/layout/PageContentPaper';\n\nfunction NotFoundPage(): React.ReactElement {\n const history = useHistory();\n\n function back() {\n history.goBack();\n }\n\n return (\n <PageContentPaper className=\"m-4\">\n <div className=\"lg:flex flex-row justify-between\">\n <div className=\"flex-shrink order-2\">\n <img src={notFoundImg} alt=\"\" className=\"w-full\" />\n </div>\n <div className=\"flex flex-col order-1 w-full lg:w-1/2 justify-between p-10 align-middle\">\n <Typography variant=\"h1\" className={`${styles.oops} font-bold`}>Oops!</Typography>\n <Typography variant=\"h4\" color=\"primary\" className=\"\">Page Not Found</Typography>\n <Typography variant=\"body1\" className=\"\">\n Sorry we're unable to find the page you're looking for.\n </Typography>\n <Button variant=\"contained\" color=\"primary\" className=\"text-uppercase mt-10\" onClick={back}>\n Go back\n </Button>\n </div>\n </div>\n </PageContentPaper>\n );\n}\n\nexport default NotFoundPage;\n","import PersonOutlineIcon from '@mui/icons-material/PersonOutline';\nimport PeopleOutlineIcon from '@mui/icons-material/PeopleOutline';\nimport LocalHospitalIcon from '@mui/icons-material/LocalHospital';\nimport DescriptionIcon from '@mui/icons-material/Description';\nimport EventIcon from '@mui/icons-material/Event';\n\nimport { WizardStep } from 'components/shared/WizardStepper';\n\nexport type EQEStepSlug = 'personal-details' | 'event-info' | 'dependents' | 'benefits' | 'summary';\n\nconst wizardSteps: Map<EQEStepSlug, WizardStep> = new Map([\n [\n 'personal-details',\n {\n label: 'Personal Details',\n icon: PersonOutlineIcon,\n slug: 'personal-details',\n next: 'event-info',\n },\n ],\n [\n 'event-info',\n {\n label: 'Event Info',\n icon: EventIcon,\n slug: 'event-info',\n next: 'dependents',\n prev: 'personal-details',\n },\n ],\n [\n 'dependents',\n {\n label: 'Dependents',\n icon: PeopleOutlineIcon,\n slug: 'dependents',\n next: 'benefits',\n prev: 'event-info',\n },\n ],\n [\n 'benefits',\n {\n label: 'Benefits',\n icon: LocalHospitalIcon,\n slug: 'benefits',\n next: 'summary',\n prev: 'dependents',\n },\n ],\n [\n 'summary',\n {\n label: 'Summary',\n icon: DescriptionIcon,\n slug: 'summary',\n prev: 'benefits',\n },\n ],\n]);\n\nexport default wizardSteps;\n","import PageContentPaper from 'components/layout/PageContentPaper';\nimport { useEffect, useRef, useState } from 'react';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { compose, tap, F } from 'ramda';\n\nimport WizardStepper, { WizardStep } from 'components/shared/WizardStepper';\nimport { CobraQeFormProps, QeBenefits, QeEventInfo } from './cobra-qe.types';\nimport CobraQePersonalDetails from './personal-details/CobraQePersonalDetails';\nimport CobraQeSummary from './summary/CobraQeSummary';\nimport {\n resetEntry,\n selectCobraQeEntry,\n selectEventTypes,\n selectQeBenefits,\n selectQeDependents,\n selectQeEventInfo,\n selectQePersonalDetails,\n updateBenefits,\n updateDependents,\n updateEventInfo,\n updatePersonalDetails,\n selectAllDependents,\n} from './cobra-qe.slice';\nimport EventInfo from './event-info/EventInfo';\nimport CancelModal from 'components/shared/CancelModal';\nimport request from 'shared/api-request';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport Loading from 'components/shared/Loading';\nimport CobraQeBenefits from './benefits/CobraQeBenefits';\nimport CobraQeDependents from './dependents/CobraQeDependents';\nimport { useHistoryBlock } from 'shared/custom-hooks/useHistoryBlock';\nimport NotFoundPage from 'components/pages/NotFound';\nimport { setSelectedParticipant } from 'participant-search/participant.slice';\nimport { useErrorNotifier, useSuccessNotifier } from 'shared/custom-hooks/useNotifiers';\nimport wizardSteps, { EQEStepSlug } from './enter-cobra-qe-steps';\nimport { QeParticipant, QeDependents } from 'shared/types/non-plan-year.types';\nimport store from 'store';\n\ninterface CobraQeWizardProps extends CobraQeFormProps {\n onSave: (doAnother: boolean) => void;\n}\n\nfunction CobraQeWizard({ onNextStep, onCancel, onSave }: CobraQeWizardProps): React.ReactElement {\n const { stepSlug } = useParams<{ stepSlug: EQEStepSlug; }>();\n const details = useSelector(selectQePersonalDetails);\n const dependents = useSelector(selectQeDependents);\n const allDependents = useSelector(selectAllDependents);\n const eventInfo = useSelector(selectQeEventInfo);\n const benefits = useSelector(selectQeBenefits);\n const entry = useSelector(selectCobraQeEntry);\n const eventTypes = useSelector(selectEventTypes);\n\n function content(): React.ReactElement {\n switch (stepSlug) {\n case 'personal-details':\n return <CobraQePersonalDetails onNextStep={onNextStep} onCancel={onCancel} details={details} />;\n case 'event-info':\n return <EventInfo onNextStep={onNextStep} onCancel={onCancel} data={eventInfo} />;\n case 'dependents':\n return (\n <CobraQeDependents\n onNextStep={onNextStep}\n onCancel={onCancel}\n empno={details.empno}\n initialAddedDependents={dependents.addedDependents}\n />\n );\n case 'benefits':\n return (\n <CobraQeBenefits\n selectedBenefits={benefits}\n dependents={allDependents}\n effectiveDate={eventInfo.coverageBegins!}\n onNextStep={onNextStep}\n onCancel={onCancel}\n />\n );\n case 'summary':\n return <CobraQeSummary entry={entry} onCancel={onCancel} onSave={onSave} eventTypes={eventTypes} />;\n default:\n return <NotFoundPage />;\n }\n }\n\n return content();\n}\n\nfunction EnterCobraQePage(): React.ReactElement {\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n const { current: unmountCallback } = useRef(compose(dispatch, resetEntry));\n const { current: blockRegex } = useRef(/^\\/enter-cobra-qe/);\n const navUnblock = useHistoryBlock(blockRegex, unmountCallback);\n const { stepSlug: activeStepSlug = 'personal-details' } = useParams<{ stepSlug: EQEStepSlug; }>();\n\n const company = useSelector(selectSelectedCompany);\n const entry = useSelector(selectCobraQeEntry);\n\n const [ showModal, setShowModal ] = useState(false);\n const [ saving, setSaving ] = useState(false);\n\n const handleError = compose(tap(compose(setSaving, F)), useErrorNotifier());\n const successNotifier = useSuccessNotifier('COBRA QE saved successfully.');\n\n // this is only here to clear out selected participant on mount\n useEffect(() => {\n dispatch(setSelectedParticipant(null));\n }, [ dispatch ]);\n\n function handleSave(doAnother: boolean) {\n setSaving(true);\n request(`/api/companies/${company?.compid}/cobra-qe`, { method: 'POST', body: entry })\n .then(() => {\n setSaving(false);\n dispatch(resetEntry());\n dispatch(setSelectedParticipant(null));\n successNotifier();\n\n if (navUnblock) {\n navUnblock();\n }\n\n history.push(doAnother ? '/enter-cobra-qe/personal-details' : '/dashboard');\n })\n .catch(handleError);\n }\n\n function onNextStep(data: QeParticipant | QeEventInfo | QeDependents | QeBenefits) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if ((data as QeParticipant).payrollid !== undefined) {\n dispatch(updatePersonalDetails(data as QeParticipant));\n } else if ((data as QeEventInfo).eventType !== undefined) {\n dispatch(updateEventInfo((data as QeEventInfo)));\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n } else if ((data as QeDependents).initialDependents !== undefined) {\n dispatch(updateDependents((data as QeDependents)));\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n } else if ((data as QeBenefits).benefits !== undefined) {\n dispatch(updateBenefits((data as QeBenefits)));\n }\n\n const step = wizardSteps.get(activeStepSlug);\n history.push(`/enter-cobra-qe/${step?.next}`);\n }\n\n function handleStepClick(step: WizardStep) {\n history.push(`/enter-cobra-qe/${step.slug}`);\n }\n\n function onWizardCancel() {\n setShowModal(true);\n }\n\n function closeModal() {\n setShowModal(false);\n }\n\n function goToDashboard() {\n if (showModal) {\n setShowModal(false);\n }\n\n if (navUnblock) {\n navUnblock();\n }\n\n dispatch(resetEntry());\n history.push('/dashboard');\n }\n\n return (\n <>\n <PageContentPaper className=\"mt-4 mb-8\">\n <div className=\"mb-8\">\n <WizardStepper\n steps={wizardSteps}\n allowClick\n onChange={handleStepClick}\n />\n </div>\n <div className=\"px-8\">\n <CobraQeWizard\n onNextStep={onNextStep}\n onCancel={onWizardCancel}\n onSave={handleSave}\n />\n </div>\n </PageContentPaper>\n <CancelModal\n isOpen={showModal}\n onCancel={goToDashboard}\n onClose={closeModal}\n />\n {saving ? <Loading text=\"Submitting COBRA Qualifying Event\" /> : <></>}\n </>\n );\n}\n\nexport default EnterCobraQePage;\n","import { useState, ReactElement, PropsWithChildren } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport dayjs from 'dayjs';\nimport Alert from '@mui/material/Alert';\nimport Box from '@mui/material/Box';\nimport Collapse from '@mui/material/Collapse';\nimport IconButton from '@mui/material/IconButton';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableCell from '@mui/material/TableCell';\nimport TableContainer from '@mui/material/TableContainer';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport Paper from '@mui/material/Paper';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';\nimport { PayloadAction } from '@reduxjs/toolkit';\nimport { useDispatch } from 'react-redux';\nimport { always, compose, andThen, pipe } from 'ramda';\n\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport { currencyFormatter } from 'shared/utils';\nimport { ContributionsNotForwarded } from './contributions-not-forwarded.types';\nimport { fetchParticipant } from 'participant-search/participant.thunks';\nimport store from 'store';\nimport { setFetchParticipantStatus } from 'participant-search/participant.slice';\nimport { Participant } from 'participant-search/participant-list.types';\nimport { ApiStatus } from 'shared/types/api-status.types';\n\nfunction createData({\n employeeNumber,\n payrollId,\n name,\n amount,\n status,\n missingInfo,\n contributions,\n}: ContributionsNotForwarded) {\n return {\n employeeNumber,\n payrollId,\n name,\n amount,\n status,\n missingInfo,\n contributions,\n };\n}\n\ntype Props = {\n rows: ContributionsNotForwarded[];\n}\n\nfunction ContributionsNotForwardedTable({ rows }: Props): ReactElement {\n let data: ReturnType<typeof createData>[] = rows.map(createData);\n\n return (\n <PageContentPaper className=\"m-4\" data-testid=\"contributions-not-forwarded\">\n <TableContainer component={Paper}>\n <Table aria-label=\"collapsible table\">\n <TableHead>\n <TableRow>\n <TableCell />\n <TableCell>PID</TableCell>\n <TableCell align=\"right\">Name</TableCell>\n <TableCell align=\"right\">Contributions Not Forwarded</TableCell>\n <TableCell align=\"right\">Status</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {data.map((row) => (\n <Row key={row.name} row={row} />\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n </PageContentPaper>\n );\n}\n\nfunction StatusWarning({ children }: PropsWithChildren<Object>) {\n return (\n <div className=\"py-4 missing-info\">\n <Alert severity=\"error\">\n { children }\n </Alert>\n </div>\n );\n}\n\ntype UnwrapFunction<T> = () => Promise<T>;\ntype DispatchWithUnwrap = {unwrap: UnwrapFunction<Participant>;};\n\nfunction Row(props: { row: ReturnType<typeof createData>; }) {\n const dispatch = useDispatch<typeof store.dispatch>();\n const history = useHistory();\n const { row } = props;\n const [ open, setOpen ] = useState(false);\n\n let resetFetchStatus = compose<ApiStatus,PayloadAction<ApiStatus>,DispatchWithUnwrap>(\n dispatch,\n setFetchParticipantStatus,\n always<ApiStatus>('uninitialized'),\n );\n\n function navigateToOverview(participant: Participant) {\n resetFetchStatus();\n history.push(`/participant-overview/${participant.empno}/general-info`);\n }\n\n let doUnwrap = ({ unwrap } : DispatchWithUnwrap) => unwrap();\n\n const makeStatusWarning = () => {\n if (row.missingInfo?.length) {\n return (\n <StatusWarning>\n This participant is missing information that is required to set up their HSA Account.\n Please click\n <span\n className=\"text-primary-main cursor-pointer participant-link\"\n onClick={pipe(\n always(row.payrollId),\n fetchParticipant,\n dispatch,\n doUnwrap,\n andThen(navigateToOverview),\n )}\n > here\n </span> and confirm the participant has a full mailing address (no PO Box),\n Date of Birth, Email Address, Phone Number, and HSA enrollment. This data is currently\n missing, and is required to set up an account.\n </StatusWarning>\n );\n } else if (!row.missingInfo?.length && row.status === 'Not Sent To WealthCare Saver') {\n return (\n <StatusWarning>\n This participant's account cannot currently be established with our HSA partner. Please contact\n your account manager for more information.\n </StatusWarning>\n );\n } else if (row.status === 'CIP Testing Not Complete') {\n return (\n <StatusWarning>\n This participant needs to complete CIP Testing before their account can be marked as active.\n They can do so by logging in to our website,\n <a href=\"https://www.flores247.com\" className=\"text-blue-600\"> https://www.flores247.com</a>,\n and accessing their HSA account for more information. Learn more about CIP Testing by clicking\n <a href=\"/CIP Verification.pdf\" target=\"_blank\" className=\"text-blue-600\"> here</a>.\n </StatusWarning>\n );\n } else if (row.status === 'CIP Testing Failed-Participant must contact Flores') {\n return (\n <StatusWarning>\n This participant has failed CIP testing, and will need to contact Flores directly before their\n account can be opened. They can do so by calling 800-532-3327 or emailing\n <a href=\"mailto:customerservice@flores247.com\"> customerservice@flores247.com</a>.\n Learn more about CIP Testing by clicking\n <a href=\"/CIP Verification.pdf\" target=\"_blank\" className=\"text-blue-600\"> here</a>.\n </StatusWarning>\n );\n } else {\n return <></>;\n }\n };\n\n return (\n <>\n <TableRow className=\"table-row\" sx={ { '& > *': { borderBottom: 'unset' } } }>\n <TableCell>\n <IconButton\n aria-label=\"expand row\"\n size=\"small\"\n onClick={compose(setOpen, always(!open))}\n >\n {open ? <KeyboardArrowUpIcon /> : <KeyboardArrowDownIcon />}\n </IconButton>\n </TableCell>\n <TableCell component=\"th\" scope=\"row\">\n {row.employeeNumber}\n </TableCell>\n <TableCell align=\"right\">{row.name}</TableCell>\n <TableCell align=\"right\">{currencyFormatter.format(row.amount)}</TableCell>\n <TableCell align=\"right\">\n <span\n className=\"text-primary-main cursor-pointer status\"\n onClick={compose(setOpen, always(!open))}\n >{ row.status }\n </span>\n </TableCell>\n </TableRow>\n <TableRow>\n <TableCell style={ { paddingBottom: 0, paddingTop: 0 } } colSpan={6}>\n <Collapse in={open} timeout=\"auto\" unmountOnExit>\n <Box sx={ { margin: 1 } }>\n {makeStatusWarning()}\n <Table size=\"small\" aria-label=\"purchases\">\n <TableHead>\n <TableRow>\n <TableCell>Deduction Date</TableCell>\n <TableCell>Amount</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {row.contributions.map((contributionRow, i) => (\n <TableRow key={i} className=\"sub-table-row\">\n <TableCell component=\"th\" scope=\"row\">\n {dayjs(contributionRow.deductionDate).format('MM/DD/YYYY')}\n </TableCell>\n <TableCell>{currencyFormatter.format(contributionRow.amount)}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </Box>\n </Collapse>\n </TableCell>\n </TableRow>\n </>\n );\n}\n\nexport default ContributionsNotForwardedTable;\n","import React from 'react';\n\nimport ContributionsNotForwardedTable\n from 'reports/shared/ContributionsNotForwardedTable/ContributionsNotForwardedTable';\nimport contributions from 'server/fixtures/contributions-not-forwarded.json';\n\n/*\nNOTE: This is a placeholder component used for development. When you're making\na component that doesn't have a place elsewhere in the app, you can drop it in\nhere, yarn start, and navigate to localhost:3000/scratchpad to see how it's\nlooking and working.\n*/\nfunction Scratchpad(): React.ReactElement {\n return (\n <ContributionsNotForwardedTable rows={contributions} />\n );\n}\n\nexport default Scratchpad;\n","import { useRef } from 'react';\nimport InputLabel from '@mui/material/InputLabel';\nimport FormControl from '@mui/material/FormControl';\nimport Select from '@mui/material/Select';\nimport { compose, path } from 'ramda';\n\nimport { FileType } from './file-types';\n\ninterface FileTypeSelectProps {\n value?: string;\n onSelectChange: (fileDescription?: string) => void;\n fileTypes: FileType[];\n disabled?: boolean;\n}\n\nfunction FileTypeSelect({ value, onSelectChange, fileTypes, disabled = false }: FileTypeSelectProps) {\n const labelRef = useRef<HTMLLabelElement>(null);\n\n const { current: handleChange } = useRef(compose(onSelectChange,path([ 'target', 'value' ])));\n\n return (\n <FormControl variant=\"outlined\" className=\"w-full\">\n <InputLabel ref={labelRef}>File Type</InputLabel>\n <Select className=\"file-type-select\"\n label=\"File Type\"\n value={value ?? ''}\n onChange={handleChange}\n native\n disabled={disabled}\n >\n <option value=\"\" />\n {\n fileTypes.map(file => (\n <option key={file.fileType} value={file.description}>{file.description}</option>\n ))\n }\n </Select>\n </FormControl>\n );\n}\n\nexport default FileTypeSelect;\n","import { useState, useRef, useEffect, ChangeEvent } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport Button from '@mui/material/Button';\nimport LoopIcon from '@mui/icons-material/Loop';\n\nimport request, { ContentType } from 'shared/api-request';\nimport { NotificationType } from 'notifications/notification.types';\nimport { addNotification } from 'notifications/notifications.slice';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport { useFileTypes } from './useFileTypes';\nimport FileTypeSelect from './FileTypeSelect';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport safeFilename from 'shared/utils/safe-filename';\nimport store from 'store';\n\nconst maxAllowedFileSize = 52428800; // max allowed 50 MB\n\nfunction FileUpload() {\n const [ uploading, setUploading ] = useState(false);\n const [ selectedFileType, setSelectedFileType ] = useState<string>('');\n const [ formData, setFormData ] = useState<FormData | null>(null);\n const [ fileInputKey, setFileInputKey ] = useState<number>(-1);\n const availableFileTypes = useFileTypes();\n\n const { medplancd } = useSelector(selectSelectedCompany) ?? { medplancd: '0' };\n const dispatch = useDispatch<typeof store.dispatch>();\n\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n useEffect(() => {\n if (availableFileTypes?.length) {\n setSelectedFileType(availableFileTypes[0].description);\n } else {\n setSelectedFileType('');\n }\n }, [ availableFileTypes ]);\n\n function handleFileSelectionChange(fileType?: string) {\n setSelectedFileType(fileType ?? '');\n }\n\n function isValidInputs() {\n return (formData !== null && selectedFileType !== '');\n }\n\n async function submitFileUploadData(event: any) {\n event.preventDefault();\n\n if (isValidInputs()) {\n try {\n setUploading(true);\n const uri = `/api/file-upload/upload-files/${encodeURIComponent(selectedFileType)}/${medplancd}`;\n const status = await request(uri, {\n headers: { 'content-type': ContentType.FORM_DATA },\n method: 'POST',\n body: formData!,\n });\n\n if (mountedRef.current) {\n setUploading(false);\n\n if (status) {\n dispatchMessage('File uploaded successfully.', NotificationType.SUCCESS);\n setFormData(null);\n setFileInputKey(Math.random());\n } else {\n dispatchMessage('An error occured please try again.', NotificationType.ERROR);\n }\n }\n } catch (ex) {\n if (mountedRef.current) {\n setUploading(false);\n dispatchMessage(ex.message, NotificationType.ERROR);\n }\n }\n } else if (selectedFileType !== '') {\n dispatchMessage('Please select a valid file type.', NotificationType.WARNING);\n } else {\n dispatchMessage('Please select a file to upload.', NotificationType.WARNING);\n }\n }\n\n function dispatchMessage(text: string, notificationType: any) {\n dispatch(addNotification({\n message: text,\n type: notificationType,\n area: 'snackbar',\n key: performance.now().toString(),\n }));\n }\n\n function handleFileSelect(event: ChangeEvent<HTMLInputElement>) {\n event.preventDefault();\n\n const { files } = event.target;\n const data = new FormData();\n\n if (files !== null) {\n Array.from(files).forEach((file) => {\n if (getFileExtension(file.name) !== 'exe') {\n if (file.size <= maxAllowedFileSize) {\n data.append('file', file, safeFilename(file.name));\n setFormData(data);\n } else {\n dispatchMessage('File is too large to upload. Max size is 50MB.', NotificationType.WARNING);\n setFormData(null);\n }\n } else {\n dispatchMessage('Please select a valid file for upload.', NotificationType.WARNING);\n setFormData(null);\n }\n });\n }\n }\n\n function getFileExtension(filename: string) {\n return filename.split('.').pop();\n }\n\n const FileSelect = withLoopIcon(\n FileTypeSelect,\n 'Loading file types...',\n availableFileTypes === null,\n 'mr-4 file-upload-loading-file-types',\n );\n\n return (\n <div className=\"w-full flex flex-col p-4\">\n <h2 className=\"page-title\">File Upload</h2>\n <div className=\"w-full md:w-2/3\">\n <PageContentPaper className=\"flex flex-col\">\n <div className=\"flex flex-col ml-3 mt-5 space-y-4 w-1/3 file-upload\">\n <FileSelect\n value={selectedFileType}\n onSelectChange={handleFileSelectionChange}\n fileTypes={availableFileTypes ?? []}\n disabled={uploading}\n />\n\n <input\n accept=\"*\"\n id=\"file-input\"\n type=\"file\"\n onChange={handleFileSelect}\n disabled={uploading}\n key={fileInputKey}\n />\n\n <Button\n onClick={submitFileUploadData}\n disabled={!isValidInputs() || uploading}\n variant=\"contained\"\n color=\"primary\"\n className=\"upload-button\"\n >\n Upload\n {uploading && <LoopIcon className=\"animate-spin ml-2 file-upload-uploading\" />}\n </Button>\n </div>\n </PageContentPaper>\n </div>\n </div>\n );\n}\n\nexport default FileUpload;\n","import { useState, useRef, useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { compose, tap, always } from 'ramda';\n\nimport request, { APIOptions } from 'shared/api-request';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { FileType } from './file-types';\nimport store from 'store';\n\nexport function useFileTypes() {\n const dispatch = useDispatch<typeof store.dispatch>();\n\n const [ fileTypes, setFileTypes ] = useState<FileType[] | null>(null);\n\n const [ setDefault ] = useState(() => compose(setFileTypes, always([])));\n const [ handleError ] = useState(() => compose(\n tap(setDefault),\n dispatch,\n addHttpErrorNotification,\n ));\n const { current: abortCtrl } = useRef(new AbortController());\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n const uri = '/api/file-upload/file-types';\n const apiOpts: APIOptions = { method: 'GET', signal: abortCtrl.signal };\n request<FileType[]>(uri, apiOpts)\n .then((result) => {\n if (mountedRef.current) {\n setFileTypes(result ?? []);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n\n return () => {\n mountedRef.current = false;\n abortCtrl.abort();\n };\n }, [ handleError, abortCtrl ]);\n\n return fileTypes;\n}\n","import React, { ChangeEvent } from 'react';\nimport FormControl from '@mui/material/FormControl';\nimport InputLabel from '@mui/material/InputLabel';\nimport Select from '@mui/material/Select';\nimport dayjs from 'dayjs';\n\nimport { MonthAndYear } from 'shared/types/file-report-history.types';\n\nexport interface HistoryMonthSelectProp {\n monthYears: MonthAndYear[];\n value: string;\n onMonthYearChanged: (monthYear: string) => void;\n}\n\nfunction formatOption(option?: MonthAndYear) {\n if (!option) {\n return '';\n }\n\n return dayjs(`${option.year}-${option.month}`, 'YYYY-M').format('MMMM YYYY');\n}\n\nfunction HistoryMonthSelect({\n monthYears,\n onMonthYearChanged,\n value = '',\n}: HistoryMonthSelectProp): React.ReactElement {\n function handleChange({ target: { value: val } }: ChangeEvent<{ name?: string; value: unknown; }>) {\n onMonthYearChanged(val as string);\n }\n\n return (\n <FormControl variant=\"standard\" className=\"w-full\">\n <InputLabel shrink id=\"history-month-label\">Date</InputLabel>\n <Select\n label=\"Date\"\n labelId=\"history-month-label\"\n onChange={handleChange as any}\n value={value.length > 0 ? value : formatOption(monthYears[0])}\n native\n >\n {\n monthYears.length > 0\n ? monthYears.map((opt) => (\n <option value={`${opt.year}-${opt.month}`} key={`${opt.year}-${opt.month}`}>\n {formatOption(opt)}\n </option>\n ))\n : <option value=\"\"> </option>\n }\n </Select>\n </FormControl>\n );\n}\n\nexport default HistoryMonthSelect;\n","import Typography from '@mui/material/Typography';\nimport ViewIcon from '@mui/icons-material/Search';\nimport Button from '@mui/material/Button';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport dayjs from 'dayjs';\n\nimport { ReportHistory } from './report-history.types';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { downloadReportHistoryFile } from 'shared/api/reportHistoryApi';\n\ninterface ReportHistoryTableRowProp {\n rptHistory: ReportHistory;\n}\n\nfunction ReportHistoryTableRow({ rptHistory }: ReportHistoryTableRowProp) {\n const errorNotifier = useErrorNotifier();\n\n function handleViewClick() {\n downloadReportHistoryFile(rptHistory.compid, rptHistory.unqid, rptHistory.file_name)\n .catch(errorNotifier);\n }\n\n return (\n <TableRow>\n <TableCell>\n <Typography variant=\"body1\" className=\"text-black text-sm\">\n {rptHistory.description}\n </Typography>\n </TableCell>\n <TableCell>\n <Typography variant=\"body1\" className=\"text-black text-sm\">\n {dayjs(rptHistory.rundate).format('MM/DD/YYYY')}\n </Typography>\n </TableCell>\n <TableCell>\n <Button onClick={handleViewClick} className=\"text-sm\">\n <ViewIcon className=\"mr-1\" />View\n </Button>\n </TableCell>\n </TableRow>\n );\n}\n\nexport default ReportHistoryTableRow;\n","import React from 'react';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\n\nimport ReportHistoryTableRow from './ReportHistoryTableRow';\nimport { ReportHistory } from './report-history.types';\n\ninterface FileHistoryTableProp {\n reportHistory: ReportHistory[];\n reportType: string | null;\n}\n\nfunction FileHistoryTable({ reportHistory, reportType = '' }: FileHistoryTableProp) : React.ReactElement {\n return (\n <Table>\n <TableHead>\n <TableRow>\n <TableCell>Description</TableCell>\n <TableCell>Date</TableCell>\n <TableCell>Action</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {\n reportHistory\n .filter(rh => rh.description.includes(reportType ?? ''))\n .map((rh) => <ReportHistoryTableRow rptHistory={rh} key={rh.unqid} />)\n }\n </TableBody>\n </Table>\n );\n}\n\nexport default FileHistoryTable;\n","import { ChangeEvent, ReactElement } from 'react';\nimport FormControl from '@mui/material/FormControl';\nimport InputLabel from '@mui/material/InputLabel';\nimport Select from '@mui/material/Select';\n\nexport interface ReportTypeSelectProps {\n reportTypes: string[];\n value: string | null;\n onReportTypeChanged: (reportType: string) => void;\n}\n\nfunction HistoryReportTypeSelect({\n reportTypes,\n onReportTypeChanged,\n value = '',\n}: ReportTypeSelectProps): ReactElement {\n function handleChange({ target: { value: val } }: ChangeEvent<{ name?: string; value: unknown; }>) {\n onReportTypeChanged(val as string);\n }\n\n return (\n <FormControl variant=\"standard\" className=\"w-full\">\n <InputLabel shrink id=\"history-report-type-label\">Report Type</InputLabel>\n <Select\n label=\"Report Type\"\n labelId=\"history-report-type-label\"\n onChange={handleChange as any}\n value={value}\n native\n >\n <option value=\"\">All</option>\n {\n reportTypes.length > 0\n ? reportTypes.map((opt) => (\n <option value={opt}>{opt}</option>\n ))\n : <option value=\"\"> </option>\n }\n </Select>\n </FormControl>\n );\n}\n\nexport default HistoryReportTypeSelect;\n","import React, { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport LoopIcon from '@mui/icons-material/Loop';\nimport { uniq } from 'ramda';\n\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport HistoryMonthSelect, { HistoryMonthSelectProp } from 'components/shared/HistoryMonthSelect';\nimport ReportHistoryTable from './ReportHistoryTable';\nimport {\n loadReportMonthYears,\n loadReports,\n selectReportMonthYears,\n selectReports,\n selectSelectedMonthYear,\n setSelectedMonthYear,\n selectSelectedReportType,\n setSelectedReportType,\n} from 'report-history/report-history.slice';\nimport { getYearAndMonth } from 'shared/utils';\nimport HistoryReportTypeSelect, { ReportTypeSelectProps } from 'components/shared/HistoryReportTypeFilter';\nimport store from 'store';\n\nfunction ReportHistory() {\n const monthYears = useSelector(selectReportMonthYears);\n const reports = useSelector(selectReports);\n const selectedMonthYear = useSelector(selectSelectedMonthYear);\n const selectedReportType = useSelector(selectSelectedReportType);\n const [ reportTypes, setReportTypes ] = useState<string[]>([]);\n\n const dispatch = useDispatch<typeof store.dispatch>();\n\n useEffect(() => {\n const uniqueReportTypes = uniq(\n reports?.map(\n (report) => report.file_name.substring(0, report.file_name.lastIndexOf(' ')),\n ) ?? [],\n );\n setReportTypes(uniqueReportTypes);\n }, [ reports ]);\n\n useEffect(() => {\n dispatch(loadReportMonthYears());\n }, [ dispatch ]);\n\n useEffect(() => {\n if (selectedMonthYear) {\n dispatch(loadReports(selectedMonthYear.year, selectedMonthYear.month));\n }\n }, [ dispatch, selectedMonthYear ]);\n\n function handleMonthChange(monthYear: string) {\n const yearAndMonth = getYearAndMonth(monthYear);\n dispatch(setSelectedMonthYear(yearAndMonth));\n }\n\n function handleReportTypeChange(type: string) {\n dispatch(setSelectedReportType(type || null));\n }\n\n function content(): React.ReactElement {\n if (reports === null) {\n return (\n <div className=\"flex justify-center items-center flex-grow report-history-files-loading\">\n <LoopIcon className=\"animate-spin\" data-testid=\"reportLoadingIcon\" />\n </div>\n );\n }\n\n return (\n <ReportHistoryTable reportType={selectedReportType} reportHistory={reports} />\n );\n }\n\n const ReportTypes = withLoopIcon<ReportTypeSelectProps>(\n HistoryReportTypeSelect,\n 'Loading Report Types...',\n reports === null,\n 'report-types-loading',\n );\n\n const ReportHistoryFiles = withLoopIcon<HistoryMonthSelectProp>(\n HistoryMonthSelect,\n 'Loading Report History...',\n monthYears === null,\n 'report-history-months-loading',\n );\n\n return (\n <div className=\"w-full flex flex-col p-4\">\n <h2 className=\"page-title\">Report History</h2>\n <div className=\"w-full md:w-2/3\">\n <PageContentPaper className=\"flex flex-col\">\n <div className=\"flex flex-row justify-between\">\n <div>\n <ReportHistoryFiles\n monthYears={monthYears!}\n onMonthYearChanged={handleMonthChange}\n value={selectedMonthYear ? `${selectedMonthYear.year}-${selectedMonthYear.month}` : ''}\n />\n </div>\n <div>\n <ReportTypes\n reportTypes={reportTypes}\n onReportTypeChanged={handleReportTypeChange}\n value={selectedReportType}\n />\n </div>\n </div>\n <div className=\"flex flex-wrap xl:divide-x flex-grow\" >{content()}</div>\n </PageContentPaper>\n </div>\n </div>\n );\n}\n\nexport default ReportHistory;\n","import dayjs from 'dayjs';\nimport Typography from '@mui/material/Typography';\nimport ViewIcon from '@mui/icons-material/Search';\nimport Button from '@mui/material/Button';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\n\nimport { WebFile } from './file-history.types';\nimport { downloadFileHistoryFile } from 'shared/api/fileHistoryApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\n\ninterface FileHistoryTableRowProp {\n webfile: WebFile;\n}\n\nfunction FileHistoryTableRow({ webfile }: FileHistoryTableRowProp) {\n const errorNotifier = useErrorNotifier();\n\n function handleOnClick() {\n downloadFileHistoryFile(webfile.compid, webfile.fileid, webfile.filename)\n .catch(errorNotifier);\n }\n\n return (\n <TableRow>\n <TableCell>\n <Typography variant=\"body1\" className=\"text-black text-sm\">\n {webfile.description}\n </Typography>\n </TableCell>\n <TableCell>\n <Typography variant=\"body1\" className=\"text-black text-sm\">\n {dayjs(webfile.dateadded).format('MM/DD/YYYY')}\n </Typography>\n </TableCell>\n <TableCell>\n <Typography variant=\"body1\" className=\"text-black text-sm\">\n <Button onClick={handleOnClick} className=\"p-0\">\n <p className=\"flex flex-row justify-center text-high-em text-sm\">\n <ViewIcon className=\"mr-1\" />View\n </p>\n </Button>\n </Typography>\n </TableCell>\n </TableRow>\n );\n}\n\nexport default FileHistoryTableRow;\n","import React from 'react';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\n\nimport FileHistoryTableRow from './FileHistoryTableRow';\nimport { WebFile } from './file-history.types';\n\ninterface FileHistoryTableProp {\n webFiles: WebFile[];\n reportType: string | null;\n}\n\nfunction FileHistoryTable({ webFiles, reportType = '' }: FileHistoryTableProp) : React.ReactElement {\n return (\n <Table>\n <TableHead>\n <TableRow>\n <TableCell>Description</TableCell>\n <TableCell>Date</TableCell>\n <TableCell>Action</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {\n webFiles\n .filter(wf => wf.description?.includes(reportType ?? ''))\n .map((wf) => (\n <FileHistoryTableRow\n webfile={wf}\n key={wf.unqid}\n />\n ))\n }\n </TableBody>\n </Table>\n );\n}\n\nexport default FileHistoryTable;\n","import React, { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport LoopIcon from '@mui/icons-material/Loop';\nimport { uniq } from 'ramda';\n\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport HistoryMonthSelect, { HistoryMonthSelectProp } from 'components/shared/HistoryMonthSelect';\nimport FileHistoryTable from './FileHistoryTable';\nimport {\n loadMonthYears, loadWebFiles,\n selectMonthYears,\n selectSelectedMonthYear, selectSelectedReportType,\n selectWebFiles, setSelectedMonthYear, setSelectedReportType,\n} from 'file-history/file-history.slice';\nimport { getYearAndMonth } from 'shared/utils';\nimport HistoryReportTypeSelect, { ReportTypeSelectProps } from 'components/shared/HistoryReportTypeFilter';\nimport store from 'store';\n\nfunction FileHistory() {\n const monthYears = useSelector(selectMonthYears);\n const historyFiles = useSelector(selectWebFiles);\n const selectedMonthYear = useSelector(selectSelectedMonthYear);\n const selectedReportType = useSelector(selectSelectedReportType);\n const [ reportTypes, setReportTypes ] = useState<string[]>([]);\n\n const dispatch = useDispatch<typeof store.dispatch>();\n\n useEffect(() => {\n const uniqueReportTypes = uniq(\n historyFiles?.filter(({ description }) => !!description)\n .map((report) => report.description?.substring(0, report.description.lastIndexOf(' ')) ?? '')\n ?? []);\n setReportTypes(uniqueReportTypes);\n }, [ historyFiles ]);\n\n useEffect(() => {\n dispatch(loadMonthYears());\n }, [ dispatch ]);\n\n useEffect(() => {\n if (selectedMonthYear) {\n dispatch(loadWebFiles(selectedMonthYear.year, selectedMonthYear.month));\n }\n }, [ dispatch, selectedMonthYear ]);\n\n function handleMonthChange(monthYear: string) {\n const yearAndMonth = getYearAndMonth(monthYear);\n dispatch(setSelectedMonthYear(yearAndMonth));\n }\n\n function handleReportTypeChange(type: string) {\n dispatch(setSelectedReportType(type || null));\n }\n\n function content() {\n if (historyFiles === null) {\n return (\n <div className=\"flex justify-center items-center flex-grow file-history-files-loading\">\n <LoopIcon className=\"animate-spin \" data-testid=\"reportLoadingIcon\" />\n </div>\n );\n }\n\n return (\n <FileHistoryTable reportType={selectedReportType} webFiles={historyFiles} />\n );\n }\n\n const FileHistories = withLoopIcon<HistoryMonthSelectProp>(\n HistoryMonthSelect,\n 'Loading File History...',\n monthYears === null,\n 'file-history-months-loading',\n );\n\n const ReportTypes = withLoopIcon<ReportTypeSelectProps>(\n HistoryReportTypeSelect,\n 'Loading Report Types...',\n historyFiles === null,\n 'report-types-loading',\n );\n\n return (\n <div className=\"w-full flex flex-col p-4\">\n <h2 className=\"page-title\">File History</h2>\n <div className=\"w-full md:w-2/3\">\n <PageContentPaper className=\"flex flex-col\">\n <div className=\"flex flex-row justify-between\">\n <div>\n <FileHistories\n monthYears={monthYears!}\n onMonthYearChanged={handleMonthChange}\n value={selectedMonthYear ? `${selectedMonthYear.year}-${selectedMonthYear.month}` : ''}\n />\n </div>\n <div>\n <ReportTypes\n reportTypes={reportTypes}\n onReportTypeChanged={handleReportTypeChange}\n value={selectedReportType}\n />\n </div>\n </div>\n <div className=\"flex flex-wrap xl:divide-x flex-grow\" >{content()}</div>\n </PageContentPaper>\n </div>\n </div>\n );\n}\n\nexport default FileHistory;\n","import React, { ReactElement, ReactNode } from 'react';\n\ninterface TabPanelNumberProps {\n children: ReactNode;\n index: number;\n value: number;\n}\n\ninterface TabPanelStringProps {\n children: ReactNode;\n index: string;\n value: string;\n}\n\ntype TabPanelProps = TabPanelNumberProps | TabPanelStringProps;\n\nfunction TabPanel(props: TabPanelProps): ReactElement {\n const { children, value, index } = props;\n\n return (\n <div\n role=\"tabpanel\"\n hidden={value !== index}\n id={`simple-tabpanel-${index}`}\n aria-labelledby={`simple-tab-${index}`}\n >\n {children}\n </div>\n );\n}\n\nexport default TabPanel;\n\n","import dayjs from 'dayjs';\nimport * as yup from 'yup';\nimport {\n fname,\n lname,\n hphone,\n hstreet1,\n hstreet2,\n hcity,\n hstate,\n hzip,\n email,\n} from '../shared/common-validators';\n\nexport const validationSchema = yup.object({\n ...fname,\n ...lname,\n ...hphone,\n ...hstreet1,\n ...hstreet2,\n ...hcity,\n ...hstate,\n ...hzip,\n ...email,\n birthdate: yup\n .date()\n .nullable()\n .max(dayjs(), 'Birthdate must be before today')\n .typeError('Invalid Date Format'),\n payfreq: yup\n .string()\n .nullable(),\n payfreq2: yup\n .string()\n .nullable(),\n\n});\n","import * as yup from 'yup';\nimport { validationSchema as piSchema } from '../shared/participant-info.validators';\nimport { requiredText } from '../shared/common-validators';\n\nexport const validationSchema = (requirePayFreq = true) => {\n if (requirePayFreq) {\n return piSchema.concat(\n yup.object({\n payfreq: yup\n .string()\n .trim()\n .nullable()\n .required(requiredText),\n }),\n );\n }\n\n return piSchema;\n};\n","import { useRef } from 'react';\nimport FormControl from '@mui/material/FormControl';\nimport InputLabel from '@mui/material/InputLabel';\nimport Select from '@mui/material/Select';\n\nimport { SelectOption, SelectChangeEvent } from 'shared/types/form.types';\nimport FormErrorText from 'components/shared/FormErrorText';\n\nexport interface CommonSelectClasses {\n control?: string;\n label?: string;\n select?: string;\n error?: string;\n}\n\ninterface CommonSelectProps {\n options: SelectOption[];\n value: string;\n label: string;\n name: string;\n error?: boolean;\n errorMessage?: string;\n classes?: CommonSelectClasses;\n disabled?: boolean;\n emptyOption?: {\n label?: string;\n value?: string;\n };\n onSelectChange: (value: string) => void;\n onSelectBlur?: (e: React.FocusEvent<any, Element>) => void;\n}\n\nfunction CommonSelect({\n options,\n onSelectChange,\n onSelectBlur,\n value,\n label,\n name,\n error = false,\n errorMessage,\n disabled = false,\n classes = {\n control: 'w-full common-select',\n },\n emptyOption = { label: '', value: '' },\n}: CommonSelectProps) {\n const labelRef = useRef<HTMLLabelElement>(null);\n\n function handleChange({ target: { value: val } }: SelectChangeEvent) {\n onSelectChange(val as string);\n }\n\n return (\n <FormControl variant=\"outlined\" className={classes.control}>\n <InputLabel ref={labelRef} className={classes.label}><span className=\"bg-white px-2\">{label}</span></InputLabel>\n <Select\n onChange={handleChange as any}\n onBlur={onSelectBlur}\n name={name}\n value={value}\n native\n fullWidth\n error={error}\n className={classes.select}\n disabled={disabled}\n >\n <option value={emptyOption.value}>{emptyOption.label}</option>\n {options.map((opt) => <option value={opt.value} key={opt.value}>{opt.label}</option>)}\n </Select>\n <FormErrorText show={error} className={classes.error}>\n {errorMessage ?? `${label} is required.`}\n </FormErrorText>\n </FormControl>\n );\n}\n\nexport default CommonSelect;\n","import CommonSelect from './form/CommonSelect';\nimport { mapToSelectOption } from 'shared/form-helpers';\n\nexport interface PayFreqSelectOption {\n pfqid: string;\n pfqdesc: string;\n}\n\nexport interface PayFreqSelectProps {\n payFreqs: PayFreqSelectOption[] | null;\n value: string;\n label?: string;\n name: string;\n onPayFreqChanged: (PayFreq: string) => void;\n error?: boolean;\n className?: string;\n isRequired?: boolean;\n disabled?: boolean;\n}\n\nfunction PayFreqSelect({\n payFreqs,\n value,\n label = 'Pay Frequency',\n name,\n onPayFreqChanged,\n error = false,\n className = '',\n isRequired = true,\n disabled = false,\n}: PayFreqSelectProps) {\n const options = mapToSelectOption(payFreqs ?? [], 'pfqdesc', 'pfqid');\n\n function handleChange(val: string) {\n onPayFreqChanged(val);\n }\n\n return (\n <CommonSelect\n options={options}\n label={label}\n name={name}\n value={value}\n onSelectChange={handleChange}\n error={isRequired && error}\n classes={ {\n control: `${className} w-full`,\n error: className,\n } }\n />\n );\n}\n\nexport default PayFreqSelect;\n","import { useState, useRef, useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { compose, tap, always } from 'ramda';\n\nimport request, { APIOptions } from 'shared/api-request';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { PayFreqSelectOption } from 'components/shared/PayFreqSelect';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport store from 'store';\n\nexport function usePayFrequencies() {\n const dispatch = useDispatch<typeof store.dispatch>();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n\n const [ payFrequencies, setPayFrequencies ] = useState<PayFreqSelectOption[] | null>(null);\n\n const { current: abortCtrl } = useRef(new AbortController());\n const { current: setDefault } = useRef(compose(setPayFrequencies, always([])));\n const { current: handleError } = useRef(compose(\n tap(setDefault),\n dispatch,\n addHttpErrorNotification,\n ));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n const uri = `/api/companies/${compid}/payfreqs`;\n const apiOpts: APIOptions = { method: 'GET', signal: abortCtrl.signal };\n request<PayFreqSelectOption[]>(uri, apiOpts)\n .then((result) => {\n if (mountedRef.current) {\n setPayFrequencies(result ?? []);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n\n return () => {\n mountedRef.current = false;\n abortCtrl.abort();\n };\n }, [ handleError, abortCtrl, compid ]);\n\n return payFrequencies;\n}\n","import { ReactElement } from 'react';\nimport Button from '@mui/material/Button';\nimport { useFormik, FormikProps } from 'formik';\nimport { compose, pipe, tap, T } from 'ramda';\n\nimport { Participant } from 'participant-search/participant-list.types';\nimport { validationSchema } from './general-info.validators';\nimport PayFreqSelect, { PayFreqSelectProps } from 'components/shared/PayFreqSelect';\nimport ParticipantDetails from 'components/shared/ParticipantDetails';\nimport { OnSubmit } from './participant-overview.types';\nimport { noop } from 'shared/utils';\nimport { ChangeNotifier } from 'shared/types/form.types';\nimport { defaultParticipant } from 'shared/constants';\nimport { usePayFrequencies } from 'shared/custom-hooks/usePayFrequencies';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\n\ninterface GeneralInfoProps extends ChangeNotifier {\n details?: Participant;\n onSubmit: OnSubmit<Participant>;\n}\n\nfunction GeneralInfo({ details, onSubmit, onHasChanged = noop }: GeneralInfoProps): ReactElement {\n const payFreqs = usePayFrequencies();\n\n const form = useFormik({\n enableReinitialize: true,\n initialValues: {\n ...defaultParticipant,\n ...details,\n },\n validationSchema: validationSchema(payFreqs !== null && payFreqs.length > 0),\n onSubmit: (values) => {\n onSubmit(values as Participant);\n onHasChanged(false);\n },\n });\n\n function handleCustomFieldChange(field: string) {\n return (value: string) => form.setFieldValue(field, value);\n }\n\n const PayFrequencies = withLoopIcon<PayFreqSelectProps>(\n PayFreqSelect,\n 'Loading Pay Frequencies...',\n payFreqs === null,\n 'pay-frequencies-loading',\n );\n\n return (\n /* eslint-disable @typescript-eslint/no-unnecessary-condition */\n <form data-testid=\"generalInfo\" className=\"mt-8\">\n <div className=\"flex flex-col space-y-8\">\n <ParticipantDetails\n form={form as FormikProps<Partial<Participant>>}\n onHasChanged={onHasChanged}\n />\n <div className=\"flex flex-row space-x-8\">\n <div data-testid=\"payfreq\" className=\"w-1/5\">\n <PayFrequencies\n isRequired\n payFreqs={payFreqs}\n name=\"payfreq\"\n label=\"Pay Frequency\"\n value={form.values.payfreq ?? ''}\n error={form.touched.payfreq && !!form.errors.payfreq}\n onPayFreqChanged={pipe(tap(compose(onHasChanged, T)), handleCustomFieldChange('payfreq'))}\n />\n </div>\n\n <div data-testid=\"payfreq2\" className=\"w-1/5\">\n <PayFrequencies\n isRequired={false}\n payFreqs={payFreqs}\n name=\"payfreq2\"\n label=\"Pay Frequency 2 (Optional)\"\n value={form.values.payfreq2 ?? ''}\n error={form.touched.payfreq2 && !!form.errors.payfreq2}\n onPayFreqChanged={pipe(tap(compose(onHasChanged, T)), handleCustomFieldChange('payfreq2'))}\n />\n </div>\n </div>\n </div>\n <div className=\"flex justify-end my-4\">\n <Button\n color=\"primary\"\n data-testid=\"cancelGeneralInfo\"\n onClick={form.handleReset}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"button\"\n onClick={form.submitForm}\n data-testid=\"saveGeneralInfo\"\n className=\"ml-4\"\n disabled={!!Object.values(form.touched).length && !!Object.values(form.errors).length}\n >\n Save Participant\n </Button>\n </div>\n </form>\n /* eslint-enable @typescript-eslint/no-unnecessary-condition */\n );\n}\n\nexport default GeneralInfo;\n","import * as yup from 'yup';\n\nexport const validationSchema = yup.object({\n covend: yup\n .date()\n .nullable(),\n});\n","import React, { ReactElement } from 'react';\nimport { useFormik } from 'formik';\nimport dayjs from 'dayjs';\nimport Button from '@mui/material/Button';\nimport { always, compose } from 'ramda';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport withModal from 'components/shared/HOC/WithModal';\nimport { validationSchema } from './cancel-billing-event.validators';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { addHttpErrorNotification, addHttpSuccessNotification } from 'notifications/notifications.slice';\nimport { CobraEnrollment } from 'participant-overview/enrollment/enrollment.types';\nimport { handleDateChange } from 'shared/form-helpers';\nimport { cancelDirectBillingEvent } from 'shared/api/directBillingApi';\nimport { selectParticipant } from 'participant-search/participant.slice';\nimport { loadLoaEnrollments, loadRetireeEnrollments } from 'participant-overview/participant-overview.slice';\n\nimport AdapterDayJS from '@mui/lab/AdapterDayjs';\nimport LocalizationProvider from '@mui/lab/LocalizationProvider';\nimport DatePicker from '@mui/lab/DatePicker';\nimport TextField from '@mui/material/TextField';\nimport store from 'store';\n\nexport interface InvoiceTableProps {\n enrollment: CobraEnrollment | null;\n onCancel: () => void;\n}\n\nfunction formatDateValue(val?: string) {\n return val ? dayjs(val, 'YYYY-MM-DD').format('MM/DD/YYYY') : null;\n}\n\nfunction CancelDirectBillingEvent({ enrollment, onCancel }: InvoiceTableProps): ReactElement {\n const dispatch = useDispatch<typeof store.dispatch>();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n const selectedParticipant = useSelector(selectParticipant);\n const handleError = compose(\n onCancel,\n dispatch,\n addHttpErrorNotification,\n );\n\n const handleSuccess = compose(\n compose(dispatch, always(loadLoaEnrollments(compid!, selectedParticipant!.empno))),\n compose(dispatch, always(loadRetireeEnrollments(compid!, selectedParticipant!.empno))),\n onCancel,\n dispatch,\n addHttpSuccessNotification,\n always('Successfully cancelled the event.'),\n );\n\n const form = useFormik({\n initialValues: {\n covend: '',\n },\n validationSchema,\n onSubmit: (values) => {\n cancelDirectBillingEvent(compid!, {\n participant: selectedParticipant,\n covend: values.covend,\n r_qualid: enrollment?.cQualId,\n }).then(handleSuccess).catch(handleError);\n },\n });\n\n return (\n <div>\n <p>Cancel billing event by specifying a new period end:</p>\n\n <form onSubmit={form.handleSubmit} className=\"mt-4\">\n\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n label=\"New Period End Date\"\n value={formatDateValue(form.values.covend)}\n onChange={handleDateChange('covend', form)}\n InputProps={\n {\n className: !form.values.covend ? 'MuiFormLabel-root' : '',\n tabIndex: -1,\n }\n }\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n data-testid=\"cancel-date\"\n variant=\"outlined\"\n className=\"w-full\"\n {...params}\n error={form.touched.covend && Boolean(form.errors.covend)}\n helperText={form.touched.covend && form.errors.covend}\n />\n )}\n />\n </LocalizationProvider>\n\n <div className=\"flex flex-row-reverse mt-4\">\n <Button\n variant=\"contained\"\n className={'ml-2 text-sm bg-danger text-white'}\n type=\"submit\"\n >Cancel Billing Event\n </Button>\n <Button\n variant=\"text\"\n color=\"primary\"\n onClick={onCancel}\n >Cancel\n </Button>\n </div>\n </form>\n </div>\n );\n}\n\nexport const CancelDirectBillingEventModal = withModal(CancelDirectBillingEvent);\n\nexport default CancelDirectBillingEvent;\n","import React, { useState } from 'react';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport Button from '@mui/material/Button';\nimport GetAppIcon from '@mui/icons-material/GetApp';\nimport EditIcon from '@mui/icons-material/Edit';\nimport Tooltip from '@mui/material/Tooltip';\nimport CancelIcon from '@mui/icons-material/Cancel';\nimport dayjs from 'dayjs';\nimport { compose, F, T, isNil } from 'ramda';\nimport { useHistory } from 'react-router-dom';\n\nimport { CobraEnrollment } from './enrollment.types';\nimport { CancelDirectBillingEventModal } from 'participant-overview/enrollment/CancelBillingEvent';\n\ninterface DisplayCobRetLoaEnrollmentRowProps {\n enrollment: CobraEnrollment;\n onPrintNotice: (e: CobraEnrollment) => Promise<any>;\n}\n\nfunction DisplayCobRetLoaEnrollmentRow({\n enrollment,\n onPrintNotice,\n}: DisplayCobRetLoaEnrollmentRowProps): React.ReactElement {\n const [ isOpen, setIsOpen ] = useState(false);\n const history = useHistory();\n\n const [ downloading, setDownloading ] = useState(false);\n\n function handlePrint() {\n setDownloading(true);\n onPrintNotice(enrollment).finally(compose(setDownloading, F));\n }\n\n function handleUpdateClick() {\n if (enrollment.cQualId) {\n if (!isNil(enrollment.arpaEnrolled)) {\n history.push(`/update-cobra-qe/${enrollment.cQualId}`);\n } else {\n history.push(`/update-direct-billing-event/${enrollment.cQualId}`);\n }\n }\n }\n\n return (\n <TableRow className=\"participant-overview-crl-enrollments-row\">\n <TableCell>\n <p className=\"text-black text-sm\">\n {dayjs(enrollment.eventDate).format('MM/DD/YYYY')}\n </p>\n </TableCell>\n <TableCell>\n <p className=\"text-black text-sm\">\n {enrollment.reason}\n </p>\n </TableCell>\n <TableCell>\n <p className=\"text-black text-sm\">\n {enrollment.status}\n </p>\n {\n !!enrollment.arpaEnrolled\n ? <p className=\"text-black text-sm font-bold\">{enrollment.arpaEnrolled}</p>\n : <></>\n }\n </TableCell>\n <TableCell>\n <p className=\"text-black text-sm\">\n {dayjs(enrollment.startDate).format('MM/DD/YYYY')}\n </p>\n </TableCell>\n <TableCell>\n <p className=\"text-black text-sm\">\n {enrollment.endDate ? dayjs(enrollment.endDate).format('MM/DD/YYYY') : ''}\n </p>\n </TableCell>\n <TableCell>\n <p className=\"text-black text-sm\">\n {enrollment.lastPaymentDate ? dayjs(enrollment.lastPaymentDate).format('MM/DD/YYYY') : ''}\n </p>\n </TableCell>\n <TableCell>\n {\n !!enrollment.cQualId\n ? (\n <>\n <Button\n color=\"primary\"\n type=\"button\"\n className=\"cobra-enrollment-update\"\n tabIndex={-1}\n onClick={handleUpdateClick}\n >\n <Tooltip title=\"Update\" aria-label=\"update\">\n <EditIcon />\n </Tooltip>\n </Button>\n </>\n )\n : <></>\n }\n {\n (isNil(enrollment.docNumber) || enrollment.docNumber === 0)\n ? (\n <Button\n color=\"primary\"\n type=\"button\"\n data-testid=\"cobra-enrollment-print\"\n tabIndex={-1}\n disabled={downloading}\n onClick={handlePrint}\n >\n <Tooltip title=\"Print Notice\" aria-label=\"print notice\">\n <GetAppIcon />\n </Tooltip>\n </Button>\n )\n : <></>\n }\n {\n isNil(enrollment.arpaEnrolled)\n ? (\n <Button\n type=\"button\"\n className=\"text-danger\"\n tabIndex={-1}\n onClick={compose(setIsOpen, T)}\n >\n <Tooltip title=\"Cancel Billing\" aria-label=\"cancel billing\">\n <CancelIcon />\n </Tooltip>\n </Button>\n )\n : <></>\n }\n </TableCell>\n <CancelDirectBillingEventModal\n enrollment={enrollment}\n title=\"Cancel Direct Billing Event\"\n isOpen={isOpen}\n onClose={compose(setIsOpen, F)}\n onCancel={compose(setIsOpen, F)}\n />\n </TableRow>\n );\n}\n\nexport default DisplayCobRetLoaEnrollmentRow;\n","import React from 'react';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\n\nimport { NonPlanYearInvoiceDetail } from './view-invoices.types';\nimport { currencyFormatter } from 'shared/utils';\n\ninterface InvoiceDetailTableRowProps {\n invoiceDetail: NonPlanYearInvoiceDetail;\n}\n\nfunction InvoiceDetailTableRow({ invoiceDetail }: InvoiceDetailTableRowProps): React.ReactElement {\n return (\n <TableRow className=\"invoice-detail-row\">\n <TableCell>{invoiceDetail.planName}</TableCell>\n <TableCell>{invoiceDetail.levelDescription}</TableCell>\n <TableCell>{currencyFormatter.format(invoiceDetail.detailAmount)}</TableCell>\n </TableRow>\n );\n}\n\nexport default InvoiceDetailTableRow;\n","import React, { useState } from 'react';\nimport Table from '@mui/material/Table';\nimport TableHead from '@mui/material/TableHead';\nimport TableBody from '@mui/material/TableBody';\nimport TableFooter from '@mui/material/TableFooter';\nimport TablePagination from '@mui/material/TablePagination';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport Collapse from '@mui/material/Collapse';\nimport { compose, nthArg } from 'ramda';\n\nimport { NonPlanYearInvoiceDetail } from './view-invoices.types';\nimport InvoiceDetailTableRow from './InvoiceDetailTableRow';\n\nexport interface InvoiceTableProps {\n invoiceDetails: NonPlanYearInvoiceDetail[] | null;\n isExpanded: boolean;\n}\n\nfunction InvoicesTable({ invoiceDetails, isExpanded = false }: InvoiceTableProps): React.ReactElement {\n const [ page, setPage ] = useState(0);\n\n return (\n <>\n <TableRow>\n <TableCell colSpan={5} className={isExpanded ? '' : 'p-0'}>\n <Collapse in={isExpanded} collapsedSize={0}>\n <Table className=\"border\">\n <TableHead>\n <TableRow>\n <TableCell>Plan</TableCell>\n <TableCell>Level</TableCell>\n <TableCell>Amount</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {\n invoiceDetails && invoiceDetails.length > 0\n ? invoiceDetails\n .slice(page * 5, page * 5 + 5)\n .map(\n (invoiceDetail) => (\n <InvoiceDetailTableRow\n invoiceDetail={invoiceDetail}\n key={invoiceDetail.detailNumber}\n />\n ),\n )\n : <TableRow><TableCell colSpan={3}><p>No details to display.</p></TableCell></TableRow>\n }\n </TableBody>\n <TableFooter>\n <TableRow>\n <TablePagination\n rowsPerPage={5}\n rowsPerPageOptions={[ 5 ]}\n colSpan={6}\n count={invoiceDetails?.length ?? 0}\n page={page}\n onPageChange={compose(setPage, nthArg(1))}\n SelectProps={ { native: true } }\n />\n </TableRow>\n </TableFooter>\n </Table>\n </Collapse>\n </TableCell>\n </TableRow>\n </>\n );\n}\n\nexport default InvoicesTable;\n","import { useState, useRef, useEffect } from 'react';\nimport { compose, tap, always } from 'ramda';\n\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { useSelector } from 'react-redux';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { selectParticipant } from 'participant-search/participant.slice';\nimport { getInvoiceDetails } from 'shared/api/invoicesApi';\nimport { NonPlanYearInvoiceDetail } from './view-invoices.types';\n\nexport function useInvoiceDetails(isCobra: boolean, invoiceNumber: number) {\n const errorNotifier = useErrorNotifier();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const { empno } = useSelector(selectParticipant) ?? { empno: 0 };\n\n const [ invoiceDetails, setInvoiceDetails ] = useState<NonPlanYearInvoiceDetail[] | null>(null);\n\n const [ setDefault ] = useState(() => compose(setInvoiceDetails, always([])));\n const [ handleError ] = useState(() => compose(tap(setDefault), errorNotifier));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n getInvoiceDetails(compid, isCobra, empno.toString(), invoiceNumber)\n .then((result) => {\n if (mountedRef.current) {\n setInvoiceDetails(result ?? []);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n\n return () => {\n mountedRef.current = false;\n };\n }, [ handleError, compid, isCobra, empno, invoiceNumber ]);\n\n return invoiceDetails;\n}\n","import\n{\n NonPlanYearInvoice,\n NonPlanYearInvoiceDetail,\n} from 'participant-overview/enrollment/view-invoices/view-invoices.types';\nimport request from 'shared/api-request';\n\nexport function getInvoices(companyId: number, isCobra: boolean, employeeNumber: string) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load invoices for invalid company.'));\n }\n\n if (!employeeNumber) {\n return Promise.reject(new Error('Cannot load invoices with invalid employee id.'));\n }\n\n return request<NonPlanYearInvoice[]>(`/api/companies/${companyId}/qualifying-events/`\n + `${isCobra ? 'c' : 'r'}/invoices/${employeeNumber}`);\n}\n\nexport function getInvoiceDetails(companyId: number, isCobra: boolean, employeeNumber: string, invoiceNumber: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load invoice details for invalid company.'));\n }\n\n if (!employeeNumber) {\n return Promise.reject(new Error('Cannot load invoice details with invalid employee id.'));\n }\n\n if (invoiceNumber <= 0) {\n return Promise.reject(new Error('Cannot load invoice details with invalid invoice number.'));\n }\n\n return request<NonPlanYearInvoiceDetail[]>(`/api/companies/${companyId}/qualifying-events/` +\n `${isCobra ? 'c' : 'r'}/invoice-details/${employeeNumber}/${invoiceNumber}`);\n}\n","import React from 'react';\n\nimport InvoiceDetailsTable from './InvoiceDetailsTable';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport { useInvoiceDetails } from './useInvoiceDetails';\n\ninterface ViewInvoiceDetailsProps {\n isCobra: boolean;\n invoiceNumber: number;\n isExpanded: boolean;\n}\n\nfunction ViewInvoiceDetails({ isCobra, invoiceNumber, isExpanded }: ViewInvoiceDetailsProps): React.ReactElement {\n const invoiceDetails = useInvoiceDetails(isCobra, invoiceNumber);\n\n const InvoiceDetails = withLoopIcon(\n InvoiceDetailsTable,\n 'Loading invoice details...',\n invoiceDetails === null && isExpanded,\n );\n\n return <InvoiceDetails invoiceDetails={invoiceDetails} isExpanded={isExpanded} />;\n}\n\nexport default ViewInvoiceDetails;\n","import React, { useState } from 'react';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport InvoiceDetails from './ViewInvoiceDetails';\n\nimport dayjs from 'dayjs';\n\nimport { NonPlanYearInvoice } from './view-invoices.types';\nimport { currencyFormatter } from 'shared/utils';\n\ninterface InvoiceTableRowProps {\n invoice: NonPlanYearInvoice;\n isCobra: boolean;\n}\n\nfunction InvoiceTableRow({ invoice, isCobra }: InvoiceTableRowProps): React.ReactElement {\n const [ invoiceDetailsOpen, setInvoiceDetailsOpen ] = useState(false);\n\n function handleOnClick() {\n setInvoiceDetailsOpen(!invoiceDetailsOpen);\n }\n\n return (\n <>\n <TableRow onClick={handleOnClick} className=\"invoice-row\">\n <TableCell>{invoice.invoiceNumber}</TableCell>\n <TableCell>{dayjs(invoice.generated).format('M/D/YYYY')}</TableCell>\n <TableCell>{dayjs(invoice.periodStart).format('M/D/YYYY')}</TableCell>\n <TableCell>{dayjs(invoice.periodEnd).format('M/D/YYYY')}</TableCell>\n <TableCell>{currencyFormatter.format(invoice.amount)}</TableCell>\n <TableCell>{currencyFormatter.format(invoice.paid)}</TableCell>\n <TableCell>{currencyFormatter.format(invoice.open)}</TableCell>\n </TableRow>\n <InvoiceDetails\n isCobra={isCobra}\n invoiceNumber={invoice.invoiceNumber}\n isExpanded={invoiceDetailsOpen}\n />\n </>\n );\n}\n\nexport default InvoiceTableRow;\n","import React, { useState } from 'react';\nimport Table from '@mui/material/Table';\nimport TableHead from '@mui/material/TableHead';\nimport TableBody from '@mui/material/TableBody';\nimport TableFooter from '@mui/material/TableFooter';\nimport TablePagination from '@mui/material/TablePagination';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport { compose, nthArg } from 'ramda';\n\nimport { NonPlanYearInvoice } from './view-invoices.types';\nimport InvoiceTableRow from './InvoiceTableRow';\n\nexport interface InvoiceTableProps {\n invoices: NonPlanYearInvoice[] | null;\n isCobra: boolean;\n}\n\nfunction InvoicesTable({ invoices, isCobra }: InvoiceTableProps): React.ReactElement {\n const [ page, setPage ] = useState(0);\n\n return (\n <>\n <Table className=\"invoice-table\">\n <TableHead>\n <TableRow>\n <TableCell>Invoice #</TableCell>\n <TableCell>Generated</TableCell>\n <TableCell>Period Start</TableCell>\n <TableCell>Period End</TableCell>\n <TableCell>Amount</TableCell>\n <TableCell>Paid</TableCell>\n <TableCell>Open</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {\n invoices && invoices.length > 0\n ? invoices\n .slice(page * 10, page * 10 + 10)\n .map((invoice) => (\n <InvoiceTableRow\n invoice={invoice}\n isCobra={isCobra}\n key={invoice.invoiceNumber}\n />\n ),\n )\n : <TableRow><TableCell colSpan={7}><p>No invoices to display.</p></TableCell></TableRow>\n }\n </TableBody>\n <TableFooter>\n <TableRow>\n <TablePagination\n rowsPerPage={10}\n rowsPerPageOptions={[ 10 ]}\n colSpan={8}\n count={invoices?.length ?? 0}\n page={page}\n onPageChange={compose(setPage, nthArg(1))}\n SelectProps={ { native: true } }\n />\n </TableRow>\n </TableFooter>\n </Table>\n\n </>\n );\n}\n\nexport default InvoicesTable;\n","import { useState, useRef, useEffect } from 'react';\nimport { compose, tap, always } from 'ramda';\nimport { useSelector } from 'react-redux';\n\nimport { getInvoices } from 'shared/api/invoicesApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { NonPlanYearInvoice } from './view-invoices.types';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { selectParticipant } from 'participant-search/participant.slice';\n\nexport function useInvoices(isCobra = true) {\n const errorNotifier = useErrorNotifier();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const { empno } = useSelector(selectParticipant) ?? { empno: 0 };\n\n const [ invoices, setInvoices ] = useState<NonPlanYearInvoice[] | null>(null);\n\n const [ setDefault ] = useState(() => compose(setInvoices, always([])));\n const [ handleError ] = useState(() => compose(tap(setDefault), errorNotifier));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n getInvoices(compid, isCobra, empno.toString())\n .then((result) => {\n if (mountedRef.current) {\n setInvoices(result ?? []);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n\n return () => {\n mountedRef.current = false;\n };\n }, [ handleError, compid, empno, isCobra ]);\n\n return invoices;\n}\n","import React from 'react';\n\nimport InvoicesTable from './InvoicesTable';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport withModal from 'components/shared/HOC/WithModal';\nimport { useInvoices } from './useInvoices';\n\ninterface ViewInvoicesProps {\n isCobra: boolean;\n}\n\nfunction ViewInvoices({ isCobra }: ViewInvoicesProps): React.ReactElement {\n const invoices = useInvoices(isCobra);\n\n const Invoices = withLoopIcon(\n InvoicesTable,\n 'Loading invoices...',\n invoices === null,\n );\n\n return <Invoices invoices={invoices} isCobra={isCobra} />;\n}\n\nexport const InvoicesModal = withModal<ViewInvoicesProps>(ViewInvoices);\n\nexport default ViewInvoices;\n","import React, { ReactElement, useState } from 'react';\nimport Collapse from '@mui/material/Collapse';\nimport Link from '@mui/material/Link';\nimport Table from '@mui/material/Table';\nimport TableHead from '@mui/material/TableHead';\nimport TableBody from '@mui/material/TableBody';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport dayjs from 'dayjs';\nimport { compose } from 'ramda';\n\nimport { Check } from './view-checks.types';\nimport { currencyFormatter } from 'shared/utils';\n\ninterface CheckTableRowProps {\n check: Check;\n}\n\nfunction CheckTableRow({ check }: CheckTableRowProps): ReactElement {\n const [ isExpanded, setIsExpanded ] = useState(false);\n\n return (\n <>\n <TableRow className=\"check-row\">\n <TableCell className=\"border-0\">{check.checkNumber}</TableCell>\n <TableCell className=\"border-0\">{currencyFormatter.format(check.checkAmount)}</TableCell>\n <TableCell className=\"border-0\">{dayjs(check.postDate).format('M/D/YYYY')}</TableCell>\n <TableCell className=\"border-0\">{currencyFormatter.format(check.appliedAmount)}</TableCell>\n <TableCell className=\"border-0\">{currencyFormatter.format(check.creditRemaining)}</TableCell>\n <TableCell className=\"border-0\">\n <Link\n className=\"cursor-pointer\"\n onClick={compose(setIsExpanded, () => !isExpanded)}\n underline=\"hover\"\n >View\n </Link>\n </TableCell>\n </TableRow>\n <TableRow>\n <TableCell colSpan={6} className={isExpanded ? '' : 'p-0'}>\n <Collapse in={isExpanded} collapsedSize={0}>\n <Table className=\"border\">\n <TableHead>\n <TableRow>\n <TableCell>Invoice</TableCell>\n <TableCell>Amount</TableCell>\n <TableCell>Applied</TableCell>\n <TableCell>Period Start</TableCell>\n <TableCell>Period End</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {\n check.invoices.map(invoice => (\n <TableRow className=\"invoice-row\"\n key={`${check.unqid}-${invoice.invoiceNumber}-${invoice.payAmount}`}\n >\n <TableCell>{invoice.invoiceNumber}</TableCell>\n <TableCell>{currencyFormatter.format(invoice.invoiceAmount)}</TableCell>\n <TableCell>{currencyFormatter.format(invoice.payAmount)}</TableCell>\n <TableCell>{dayjs(invoice.periodStart).format('M/D/YYYY')}</TableCell>\n <TableCell>{dayjs(invoice.periodEnd).format('M/D/YYYY')}</TableCell>\n </TableRow>\n ))\n }\n </TableBody>\n </Table>\n </Collapse>\n </TableCell>\n </TableRow>\n </>\n );\n}\n\nexport default CheckTableRow;\n","import React, { useState } from 'react';\nimport Table from '@mui/material/Table';\nimport TableHead from '@mui/material/TableHead';\nimport TableBody from '@mui/material/TableBody';\nimport TableFooter from '@mui/material/TableFooter';\nimport TablePagination from '@mui/material/TablePagination';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport { compose, nthArg } from 'ramda';\n\nimport { Check } from './view-checks.types';\nimport CheckTableRow from './CheckTableRow';\n\nexport interface InvoiceTableProps {\n checks: Check[] | null;\n}\n\nfunction CheckTable({ checks }: InvoiceTableProps): React.ReactElement {\n const [ page, setPage ] = useState(0);\n\n return (\n <Table className=\"checks-table\">\n <TableHead>\n <TableRow>\n <TableCell>Check Number</TableCell>\n <TableCell>Check Amount</TableCell>\n <TableCell>Payment Postmarked</TableCell>\n <TableCell>Amount Applied</TableCell>\n <TableCell>Credit Remaining</TableCell>\n <TableCell>Invoices</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {\n checks && checks.length > 0\n ? checks\n .slice(page * 10, page * 10 + 10)\n .map((check) => <CheckTableRow check={check} key={check.unqid} />)\n : <TableRow><TableCell colSpan={6}><p>No checks to display.</p></TableCell></TableRow>\n }\n </TableBody>\n <TableFooter>\n <TableRow>\n <TablePagination\n rowsPerPage={10}\n rowsPerPageOptions={[ 10 ]}\n colSpan={7}\n count={checks?.length ?? 0}\n page={page}\n onPageChange={compose(setPage, nthArg(1))}\n SelectProps={ { native: true } }\n />\n </TableRow>\n </TableFooter>\n </Table>\n );\n}\n\nexport default CheckTable;\n","import React from 'react';\n\nimport CheckTable from './CheckTable';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport { useChecks } from './useChecks';\nimport withModal from 'components/shared/HOC/WithModal';\n\ninterface ViewChecksProps {\n isCobra: boolean;\n}\n\nfunction ViewChecks({ isCobra }: ViewChecksProps): React.ReactElement {\n const checks = useChecks(isCobra);\n\n const Checks = withLoopIcon(\n CheckTable,\n 'Loading checks...',\n checks === null,\n );\n\n return <Checks checks={checks} />;\n}\n\nexport const ChecksModal = withModal(ViewChecks);\n\nexport default ViewChecks;\n","import { useState, useRef, useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { compose, tap, always } from 'ramda';\n\nimport { Check } from './view-checks.types';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { selectParticipant } from 'participant-search/participant.slice';\nimport request, { APIOptions } from 'shared/api-request';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport store from 'store';\n\nexport function useChecks(isCobra: boolean) {\n const dispatch = useDispatch<typeof store.dispatch>();\n\n const [ checks, setChecks ] = useState<Check[] | null>(null);\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n const { empno } = useSelector(selectParticipant) ?? { empno: undefined };\n\n const { current: abortCtrl } = useRef(new AbortController());\n const { current: setDefault } = useRef(compose(setChecks, always([])));\n const { current: handleError } = useRef(compose(\n tap(setDefault),\n dispatch,\n addHttpErrorNotification,\n ));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n const uri = `/api/companies/${compid}/qualifying-events/${isCobra ? 'c' : 'r'}/checks/${empno}`;\n const apiOpts: APIOptions = { method: 'GET', signal: abortCtrl.signal };\n\n request<Check[]>(uri, apiOpts)\n .then((result) => {\n if (mountedRef.current) {\n setChecks(result ?? []);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n\n return () => {\n mountedRef.current = false;\n abortCtrl.abort();\n };\n }, [ dispatch, compid, empno, setDefault, handleError, abortCtrl, isCobra ]);\n\n return checks;\n}\n","import React, { useState } from 'react';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport dayjs from 'dayjs';\nimport Button from '@mui/material/Button';\nimport GetAppIcon from '@mui/icons-material/GetApp';\nimport { compose, F } from 'ramda';\n\nimport { FloresDocument } from './view-documents.types';\n\ninterface DocumentTableRowProps {\n document: FloresDocument;\n onDownloadDocument: (e: FloresDocument) => Promise<any>;\n}\n\nfunction InvoiceTableRow({ document, onDownloadDocument }: DocumentTableRowProps): React.ReactElement {\n const [ downloading, setDownloading ] = useState(false);\n\n function handleDownload() {\n setDownloading(true);\n onDownloadDocument(document).finally(compose(setDownloading, F));\n }\n\n return (\n <TableRow>\n <TableCell>{dayjs(document.receivedDate).format('M/D/YYYY')}</TableCell>\n <TableCell>{document.description}</TableCell>\n <TableCell>{document.documentNumber}</TableCell>\n <TableCell>\n <Button\n color=\"primary\"\n type=\"button\"\n data-testid=\"document-export\"\n tabIndex={-1}\n disabled={downloading}\n onClick={handleDownload}\n >\n <GetAppIcon />Export\n </Button>\n </TableCell>\n </TableRow>\n );\n}\n\nexport default InvoiceTableRow;\n","import React, { useState } from 'react';\nimport Table from '@mui/material/Table';\nimport TableHead from '@mui/material/TableHead';\nimport TableBody from '@mui/material/TableBody';\nimport TableFooter from '@mui/material/TableFooter';\nimport TablePagination from '@mui/material/TablePagination';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport { compose, nthArg } from 'ramda';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport { FloresDocument } from './view-documents.types';\nimport DocumentTableRow from './DocumentTableRow';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { selectParticipant } from 'participant-search/participant.slice';\nimport request from 'shared/api-request';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport store from 'store';\n\nexport interface DocumentTableProps {\n documents: FloresDocument[] | null;\n}\n\nfunction DocumentsTable({ documents }: DocumentTableProps): React.ReactElement {\n const dispatch = useDispatch<typeof store.dispatch>();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n const { empno } = useSelector(selectParticipant) ?? { empno: undefined };\n const [ page, setPage ] = useState(0);\n\n function handleDownloadDocument(e: FloresDocument): Promise<any> {\n return request<string>(`/api/companies/${compid}/qualifying-events/documents/${empno}/${e.documentNumber}`)\n .catch(compose(dispatch, addHttpErrorNotification));\n }\n\n return (\n <Table>\n <TableHead>\n <TableRow>\n <TableCell>Received</TableCell>\n <TableCell>Description</TableCell>\n <TableCell>Document</TableCell>\n <TableCell>Action</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {\n documents && documents.length > 0\n ? documents\n .slice(page * 10, page * 10 + 10)\n .map((document) => (\n <DocumentTableRow\n document={document}\n key={document.documentNumber}\n onDownloadDocument={handleDownloadDocument}\n />\n ))\n : <TableRow><TableCell><p>No Documents to display.</p></TableCell></TableRow>\n }\n </TableBody>\n <TableFooter>\n <TableRow>\n <TablePagination\n rowsPerPage={10}\n rowsPerPageOptions={[ 10 ]}\n colSpan={4}\n count={documents?.length ?? 0}\n page={page}\n onPageChange={compose(setPage, nthArg(1))}\n SelectProps={ { native: true } }\n />\n </TableRow>\n </TableFooter>\n </Table>\n );\n}\n\nexport default DocumentsTable;\n","import React from 'react';\n\nimport DocumentsTable from './DocumentsTable';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport { useDocuments } from './useDocuments';\nimport withModal from 'components/shared/HOC/WithModal';\n\ninterface ViewDocumentsProps {\n isCobra: boolean;\n}\n\nfunction ViewDocuments({ isCobra }: ViewDocumentsProps): React.ReactElement {\n const documents = useDocuments(isCobra);\n\n const Documents = withLoopIcon(\n DocumentsTable,\n 'Loading Documents...',\n documents === null,\n );\n\n return <Documents documents={documents} />;\n}\n\nexport const DocumentsModal = withModal<ViewDocumentsProps>(ViewDocuments);\n\nexport default ViewDocuments;\n","import { useState, useRef, useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { compose, tap, always } from 'ramda';\n\nimport { FloresDocument } from './view-documents.types';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { selectParticipant } from 'participant-search/participant.slice';\nimport request, { APIOptions } from 'shared/api-request';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport store from 'store';\n\nexport function useDocuments(isCobra: boolean) {\n const dispatch = useDispatch<typeof store.dispatch>();\n\n const [ documents, setDocuments ] = useState<FloresDocument[] | null>(null);\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n const { empno } = useSelector(selectParticipant) ?? { empno: undefined };\n\n const { current: abortCtrl } = useRef(new AbortController());\n const { current: setDefault } = useRef(compose(setDocuments, always([])));\n const { current: handleError } = useRef(compose(\n tap(setDefault),\n dispatch,\n addHttpErrorNotification,\n ));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n const uri = `/api/companies/${compid}/qualifying-events/${isCobra ? 'c' : 'r'}/documents/${empno}`;\n const apiOpts: APIOptions = { method: 'GET', signal: abortCtrl.signal };\n\n request<FloresDocument[]>(uri, apiOpts)\n .then((result) => {\n if (mountedRef.current) {\n setDocuments(result ?? []);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n\n return () => {\n mountedRef.current = false;\n abortCtrl.abort();\n };\n }, [ dispatch, compid, empno, setDefault, handleError, abortCtrl, isCobra ]);\n\n return documents;\n}\n","/* eslint-disable no-console */\nimport React, { useState } from 'react';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport { compose, T, F } from 'ramda';\n\nimport { CobraEnrollment } from './enrollment.types';\nimport DisplayCobRetLoaEnrollmentRow from './DisplayCobRetLoaEnrollmentRow';\nimport request from 'shared/api-request';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport Button from '@mui/material/Button';\nimport { InvoicesModal } from './view-invoices/ViewInvoices';\nimport { ChecksModal } from './view-checks/ViewChecks';\nimport { DocumentsModal } from './view-documents/ViewDocuments';\nimport store from 'store';\n\nexport interface DisplayCobRetLoaEnrollmentProps {\n enrollment: CobraEnrollment[];\n title: string;\n type?: 'r' | 'c' | 'l';\n}\n\nconst invoiceModalTitles = {\n c: 'COBRA Invoices',\n r: 'Retiree Invoices',\n l: 'LOA Invoices',\n};\n\nfunction DisplayCobRetLoaEnrollment({\n enrollment,\n title,\n type = 'r',\n}: DisplayCobRetLoaEnrollmentProps): React.ReactElement {\n const dispatch = useDispatch<typeof store.dispatch>();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n const [ invoicesOpen, setInvoicesOpen ] = useState(false);\n const [ documentsOpen, setDocumentsOpen ] = useState(false);\n const [ checksOpen, setChecksOpen ] = useState(false);\n\n function handlePrintNotice(e: CobraEnrollment): Promise<any> {\n return request<string>(`/api/companies/${compid}/qualifying-events/${type !== 'c' ? 'r' : 'c'}/print/${e.unqid}`)\n .catch((err) => {\n compose(dispatch, addHttpErrorNotification)(err);\n });\n }\n\n function content() {\n if (enrollment.length > 0) {\n return (\n <>\n <h6 className=\"text-primary-light ml-4 mt-4 participant-overview-crl-enrollments\">{title}</h6>\n <Table>\n <TableHead>\n <TableRow>\n <TableCell>Event Date</TableCell>\n <TableCell>Event Reason</TableCell>\n <TableCell>Event Status</TableCell>\n <TableCell>Period Start</TableCell>\n <TableCell>Period End</TableCell>\n <TableCell>Last Payment</TableCell>\n <TableCell>Action</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {enrollment.map((e) => (\n <DisplayCobRetLoaEnrollmentRow\n enrollment={e}\n key={e.unqid}\n onPrintNotice={handlePrintNotice}\n />\n ))}\n </TableBody>\n </Table>\n <div className=\"flex justify-end mt-8 plan-enrollment-crl-enrollments-btn\">\n <Button onClick={compose(setInvoicesOpen, T)} variant=\"outlined\" color=\"primary\" className=\"mr-8\">\n View Invoices\n </Button>\n <Button onClick={compose(setDocumentsOpen, T)} variant=\"outlined\" color=\"primary\" className=\"mr-8\">\n View Documents\n </Button>\n <Button onClick={compose(setChecksOpen, T)} variant=\"outlined\" color=\"primary\" className=\"mr-8\">\n View Checks\n </Button>\n </div>\n <InvoicesModal\n title={invoiceModalTitles[type]}\n isCobra={type === 'c'}\n isOpen={invoicesOpen}\n onClose={compose(setInvoicesOpen, F)}\n />\n <DocumentsModal\n title=\"View Documents\"\n isCobra={type === 'c'}\n isOpen={documentsOpen}\n onClose={compose(setDocumentsOpen, F)}\n />\n <ChecksModal\n title=\"View Checks\"\n isCobra={type === 'c'}\n isOpen={checksOpen}\n onClose={compose(setChecksOpen, F)}\n />\n </>\n );\n } else {\n return <></>;\n }\n }\n\n return (\n <>\n {content()}\n </>\n );\n}\n\nexport default DisplayCobRetLoaEnrollment;\n","import React from 'react';\nimport dayjs from 'dayjs';\n\ninterface PayDeductionValueProps {\n beginning: string;\n amount: string;\n}\n\nfunction PayDeductionValue({ beginning, amount }: PayDeductionValueProps): React.ReactElement {\n return (\n <div className=\"flex flex-row my-2\">\n <div className=\"w-1/2 text-base text-low-em flex flex-col justify-end leading-tight\">\n {dayjs(beginning).format('M/D/YYYY')}\n </div>\n <div className=\"w-1/2 text-2-5/8xl text-high-em font-medium leading-none\" >\n {amount}\n </div>\n </div>\n );\n}\n\nexport default PayDeductionValue;\n","import React from 'react';\nimport Divider from '@mui/material/Divider';\n\nimport { PayPeriodDeduction } from './enrollment.types';\nimport PayDeductionValue from './PayDeductionValue';\nimport { currencyFormatter } from 'shared/utils';\n\ninterface PayPeriodDeductionsProps {\n deductions: PayPeriodDeduction[];\n}\n\nfunction PayPeriodDeductions({ deductions }: PayPeriodDeductionsProps): React.ReactElement {\n return (\n <div className=\"w-full flex flex-col border-2 border-neutral5 rounded-5 border-solid p-4\">\n <h6 className=\"text-base text-high-em mb-5\">Pay Period Deduction</h6>\n <div className=\"flex mb-4\">\n <div className=\"w-1/2 text-base text-med-em font-normal\">Beginning</div>\n <div className=\"w-1/2 text-base text-med-em font-normal\">Amount</div>\n </div>\n <div className=\"w-full flex flex-col\">\n {\n deductions.length === 0\n ? <p>No records to display.</p>\n : deductions.map((deduction, idx) => {\n const amount = currencyFormatter.format(deduction.amount);\n\n return (\n <div key={deduction.beginning}>\n {idx !== 0 ? <Divider className=\"my-2 -mx-4\" /> : <></>}\n <PayDeductionValue beginning={deduction.beginning} amount={amount} />\n </div>\n );\n })\n }\n </div>\n </div>\n );\n}\n\nexport default PayPeriodDeductions;\n","import React from 'react';\n\ninterface PlanValueProps {\n label: string;\n value: string;\n labelClassName?: string;\n valueClassName?: string;\n}\n\nexport const defaultLabelClass = 'text-lg text-high-em font-normal';\n\nexport const defaultValueClass = 'text-3xl text-high-em font-medium';\n\nfunction PlanValue({\n label,\n value,\n labelClassName = defaultLabelClass,\n valueClassName = defaultValueClass,\n}: PlanValueProps): React.ReactElement {\n return (\n <div className=\"w-full flex flex-col\">\n <div className={labelClassName}>{label}</div>\n <div className={valueClassName}>{value}</div>\n </div>\n );\n}\n\nexport default PlanValue;\n","import React, { ComponentType, ReactElement, useEffect, useRef, useState } from 'react';\nimport { always, andThen, assocPath, compose, otherwise, pipe, tap } from 'ramda';\nimport { useDispatch } from 'react-redux';\n\nimport request from 'shared/api-request';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { EnrollmentTransaction } from '../enrollment.types';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport withModal from 'components/shared/HOC/WithModal';\nimport store from 'store';\n\ninterface Props {\n pyrid: string;\n empno: string;\n compid: number;\n plccode: string;\n isOpen: boolean;\n transactions: EnrollmentTransaction[];\n onClose: (args?: unknown) => void;\n}\n\nfunction makeUri({ compid, empno, pyrid, plccode }: Partial<Props>) {\n return `/api/companies/${compid}/plan-enrollment/${pyrid}/transactions/${empno}/plan/${plccode}`;\n}\n\nfunction withTransactionModal<P extends Props>(WrappedComponent: ComponentType<React.PropsWithChildren<P>>) {\n function WithTransactionModal (\n { compid, empno, pyrid, plccode, ...props }: P,\n ): ReactElement {\n const dispatch = useDispatch<typeof store.dispatch>();\n const [ transactions, setTransactions ] = useState<EnrollmentTransaction[] | null>(null);\n const { current: handleError } = useRef(\n compose(\n tap<unknown>(compose(setTransactions, always([]))),\n dispatch,\n addHttpErrorNotification,\n ),\n );\n const { current: setLoading } = useRef(compose(setTransactions, always(null)));\n\n useEffect(() => {\n pipe(\n tap(setLoading),\n makeUri,\n request,\n andThen(setTransactions),\n otherwise(handleError),\n )({ compid, empno, pyrid, plccode });\n }, [ setLoading, handleError, compid, empno, pyrid, plccode ]);\n\n const TransactionsList = withLoopIcon<P>(\n WrappedComponent,\n 'Loading transactions...',\n !transactions,\n );\n\n return (\n <TransactionsList {...props as P} transactions={transactions} />\n );\n }\n\n const wrappedComponentName = WrappedComponent.displayName ?? WrappedComponent.name;\n WithTransactionModal.displayName = `withTransactionModal(${wrappedComponentName})`;\n\n // add extra withModal props w/o having to do it in jsx for everything that uses WithTransactionModal\n return compose(\n withModal(WithTransactionModal),\n assocPath([ 'title' ], 'Transactions'),\n assocPath([ 'classes', 'modalContainer' ], 'modal'),\n );\n}\n\nexport default withTransactionModal;\n","import React, { ReactElement } from 'react';\nimport TableCell from '@mui/material/TableCell';\nimport TableRow from '@mui/material/TableRow';\n\nfunction TransactionRow({ cells }: { cells: string[]; }): ReactElement {\n return (\n <TableRow>\n {\n cells.map((v, i) => (\n <TableCell key={i}>\n <p className=\"text-black text-sm\">\n {v}\n </p>\n </TableCell>\n ))\n }\n </TableRow>\n );\n}\n\nexport default TransactionRow;\n","import React, { ReactElement } from 'react';\nimport { PDFDownloadLink } from '@react-pdf/renderer';\nimport GetAppIcon from '@mui/icons-material/GetApp';\nimport Button from '@mui/material/Button';\n\ninterface Props {\n document: ReactElement;\n fileName: string;\n}\n\nfunction TransactionExportButton({ document, fileName }: Props) {\n return (\n <Button\n variant=\"outlined\"\n color=\"primary\"\n type=\"button\"\n data-testid=\"export-transactions\"\n className=\"\"\n tabIndex={-1}\n >\n <PDFDownloadLink\n document={document}\n fileName={fileName}\n ><GetAppIcon /> Export\n </PDFDownloadLink>\n </Button>\n );\n}\n\nexport default TransactionExportButton;\n","import { PdfTableBorder } from './PdfTableCell';\n\n/**\n * Return whether particular borders need to be included.\n * If the value is undefined then return true for that border.\n *\n * @param border the border item to parse.\n */\nexport function getDefaultBorderIncludes(border: PdfTableBorder): PdfTableBorder {\n return {\n includeBottomBorder: border.includeBottomBorder === undefined ? true : border.includeBottomBorder,\n includeTopBorder: border.includeTopBorder === undefined ? true : border.includeTopBorder,\n includeLeftBorder: border.includeLeftBorder === undefined ? true : border.includeLeftBorder,\n includeRightBorder: border.includeRightBorder === undefined ? true : border.includeRightBorder,\n };\n}\n\n/**\n * Transform a single item to an array (with one element).\n * Or return the array.\n *\n * @param items the item or items to transform to an array.\n * @return an array of items or an empty array.\n */\nexport function transformToArray<T>(items?: T | T[]): T[] {\n if (items === undefined) {\n return [];\n }\n\n if (Array.isArray(items)) {\n return items;\n }\n\n return [ items ];\n}\n","import * as React from 'react';\nimport ReactPDF, { Text, View } from '@react-pdf/renderer';\nimport { getDefaultBorderIncludes, transformToArray } from './utils';\n\n/**\n * Whether to include borders or not.\n * Depending on the context some toggles will not have any effect.\n */\nexport interface PdfTableBorder {\n /**\n * Include the top border. Default true.\n */\n includeTopBorder?: boolean;\n\n /**\n * Include the right border. Default true.\n */\n includeRightBorder?: boolean;\n\n /**\n * Include the bottom border. Default true.\n */\n includeBottomBorder?: boolean;\n\n /**\n * Include the left border. Default true.\n */\n includeLeftBorder?: boolean;\n}\n\nexport interface PdfTableCellProps extends PdfTableBorder {\n /**\n * The weighting of a cell based on the flex layout style.\n * This value is between 0..1, if not specified 1 is assumed, this will take up the remaining available space.\n */\n weighting?: number;\n\n /**\n * Extra styling to apply. These will override existing style with the same key.\n */\n style?: ReactPDF.Style | ReactPDF.Style[];\n\n /**\n * How to align the text\n */\n textAlign?: 'left' | 'center' | 'right';\n\n /**\n * Whether this is a header cell or not. If not defined it will be false.\n */\n isHeader?: boolean;\n\n /**\n * The font-size to apply to the cell.\n */\n fontSize?: number | string;\n}\n\n/**\n * This component displays the associated content of it's children.\n */\n// eslint-disable-next-line react/prefer-stateless-function\nexport class PdfTableCell extends React.PureComponent<PdfTableCellProps> {\n render() {\n let content: any;\n\n if (typeof (this.props as any).children === 'string') {\n content = (\n <Text>{(this.props as any).children}</Text>\n );\n } else if (typeof (this.props as any).children === 'number') {\n content = (\n <Text>{(this.props as any).children.toString()}</Text>\n );\n } else {\n content = (this.props as any).children;\n }\n\n const { includeRightBorder } = getDefaultBorderIncludes(this.props);\n const defaultStyle: ReactPDF.Style = {\n flex: this.props.weighting ?? 1,\n // @ts-expect-error\n justifyContent: 'stretch',\n padding: '5px',\n textAlign: this.props.textAlign ?? 'left',\n fontSize: this.props.fontSize ?? (this.props.isHeader === true ? 14 : 12),\n borderRight: includeRightBorder && '1pt solid #E5E5E5' as any,\n wordWrap: 'break-word',\n whiteSpace: 'pre-wrap',\n };\n\n const mergedStyles: ReactPDF.Style[] = [\n defaultStyle,\n ...transformToArray(this.props.style),\n ];\n\n return (\n <View\n style={mergedStyles}\n wrap\n >\n {content}\n </View>\n );\n }\n}\n","import * as React from 'react';\nimport { PdfTableCell, PdfTableCellProps } from './PdfTableCell';\n\ninterface PdfDataTableCellProps extends PdfTableCellProps {\n /**\n * The data associated with the cell.\n */\n data?: any;\n\n /**\n * The content to display for this cell.\n * @param data the data passed in.\n */\n getContent: (data: any) => React.ReactNode | JSX.Element | string | number;\n}\n\n/**\n * This component is used to display data in the the {@see TableRow} component.\n */\n// eslint-disable-next-line react/prefer-stateless-function\nexport class PdfDataTableCell extends React.PureComponent<PdfDataTableCellProps> {\n render() {\n return (\n <PdfTableCell\n {...this.props}\n >\n {this.props.getContent(this.props.data)}\n </PdfTableCell>\n );\n }\n}\n","import * as React from 'react';\nimport { PdfTableBorder, PdfTableCell } from './PdfTableCell';\nimport { PdfDataTableCell } from './PdfDataTableCell';\nimport { View } from '@react-pdf/renderer';\nimport { getDefaultBorderIncludes } from './utils';\nimport { PdfTableBodyProps } from './PdfTableBody';\n\nexport interface PdfTableRowProps extends PdfTableBorder {\n /**\n * The font size as a valid unit defined in react-pdf.\n */\n fontSize?: number | string;\n\n /**\n * Whether to align the text. Defaults to left.\n */\n textAlign?: 'left' | 'center' | 'right';\n\n /**\n * Any data associated, relevant if the parent is a {@see DataTableCell}.\n */\n data?: any;\n}\n\n/**\n * This component describes how to display a row.\n */\n// eslint-disable-next-line react/prefer-stateless-function\nexport class PdfTableRow extends React.PureComponent<Partial<PdfTableBodyProps>> {\n render() {\n const rowCells: any[] = React.Children.toArray((this.props as any).children);\n const {\n includeLeftBorder,\n includeBottomBorder,\n includeRightBorder,\n includeTopBorder,\n } = getDefaultBorderIncludes(this.props);\n\n let remainingWeighting = 1;\n let numberOfWeightingsDefined = 0;\n rowCells.forEach((i: PdfTableCell | PdfDataTableCell) => {\n if (i.props.weighting !== undefined) {\n remainingWeighting -= i.props.weighting;\n numberOfWeightingsDefined++;\n }\n });\n\n const weightingsPerNotSpecified = Math.ceil(remainingWeighting / (rowCells.length - numberOfWeightingsDefined));\n\n return (\n <View\n // @ts-expect-error\n style={ {\n borderBottom: includeBottomBorder && '1pt solid #E5E5E5',\n borderRight: includeRightBorder && '1pt solid #E5E5E5',\n borderLeft: includeLeftBorder && '1pt solid #E5E5E5',\n borderTop: includeTopBorder && '1pt solid #E5E5E5',\n width: '100%',\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'stretch',\n } }\n >\n {\n rowCells.map((rc, columnIndex) => React.cloneElement(rc, {\n weighting: rc.props.weighting ?? weightingsPerNotSpecified,\n data: this.props.data,\n key: columnIndex,\n fontSize: this.props.fontSize,\n textAlign: this.props.textAlign,\n includeLeftBorder: columnIndex === 0,\n includeRightBorder: false,\n }))\n }\n </View>\n );\n }\n}\n","import * as React from 'react';\nimport { getDefaultBorderIncludes } from './utils';\nimport { PdfTableRow as _PdfTableRow, PdfTableRowProps } from './PdfTableRow';\n\ntype PdfTableHeaderProps = PdfTableRowProps\n\nconst PdfTableRow = _PdfTableRow as any;\n\n/**\n * This component displays the titles for the rows.\n */\n// eslint-disable-next-line react/prefer-stateless-function\nexport class PdfTableHeader extends React.PureComponent<PdfTableHeaderProps> {\n render() {\n let {\n includeLeftBorder,\n includeBottomBorder,\n includeRightBorder,\n includeTopBorder,\n } = getDefaultBorderIncludes(this.props);\n\n const rowCells: any[] = React.Children.toArray((this.props as any).children);\n\n return (\n <PdfTableRow\n {...this.props}\n key={'header'}\n includeLeftBorder={includeLeftBorder}\n includeBottomBorder={includeBottomBorder}\n includeRightBorder={includeRightBorder}\n includeTopBorder={includeTopBorder}\n >\n {\n rowCells.map((rc, columnIndex) => React.cloneElement(rc, {\n key: columnIndex,\n isHeader: true,\n fontSize: this.props.fontSize,\n textAlign: this.props.textAlign,\n includeLeftBorder: columnIndex === 0,\n includeRightBorder: columnIndex !== (rowCells.length - 1),\n }))\n }\n </PdfTableRow>\n );\n }\n}\n","import * as React from 'react';\nimport { PdfTableRow as _PdfTableRow, PdfTableRowProps } from './PdfTableRow';\nimport { getDefaultBorderIncludes } from './utils';\n\nexport interface PdfTableBodyProps extends PdfTableRowProps {\n /**\n * The data associated with the table.\n */\n data?: any[];\n}\n\nconst PdfTableRow = _PdfTableRow as any;\n\n/**\n * This component displays the data as {@see TableRow}s.\n */\nexport class PdfTableBody extends React.PureComponent<PdfTableBodyProps> {\n render() {\n const rowCells: any[] = React.Children.toArray((this.props as any).children);\n const { includeLeftBorder, includeBottomBorder, includeRightBorder } = getDefaultBorderIncludes(this.props);\n const dataRows = this.props.data ?? [];\n\n return (\n (dataRows).map((data, rowIndex) => (\n <PdfTableRow\n {...this.props}\n key={rowIndex}\n data={data}\n includeLeftBorder={includeLeftBorder}\n includeBottomBorder={includeBottomBorder}\n includeRightBorder={includeRightBorder}\n includeTopBorder={false}\n >\n {rowCells}\n </PdfTableRow>\n ))\n );\n }\n}\n","import * as React from 'react';\nimport { PdfTableHeader } from './PdfTableHeader';\nimport { PdfTableBody } from './PdfTableBody';\nimport { View } from '@react-pdf/renderer';\n\ninterface PdfTableProps {\n data?: any[];\n}\n\n// eslint-disable-next-line react/prefer-stateless-function\nexport class PdfTable extends React.PureComponent<PdfTableProps> {\n render() {\n let tableHeader = null;\n let tableBody = null;\n\n React.Children.forEach((this.props as any).children, (c: any) => {\n if (c.type === PdfTableHeader) {\n tableHeader = c;\n } else if (c.type === PdfTableBody) {\n tableBody = React.cloneElement(c, {\n data: c.props.data ?? this.props.data ?? [],\n });\n }\n });\n\n return (\n <View\n style={ {\n width: '90%',\n margin: '5%',\n } }\n >\n {tableHeader}\n {tableBody}\n </View>\n );\n }\n}\n","import React from 'react';\nimport { Document as _Document, Page as _Page, Text as _Text, StyleSheet as _StyleSheet } from '@react-pdf/renderer';\nimport {\n PdfTable as _PdfTable,\n PdfTableHeader as _PdfTableHeader,\n PdfTableCell as _PdfTableCell,\n PdfTableBody as _PdfTableBody,\n PdfDataTableCell as _PdfDataTableCell,\n} from 'shared/pdf-data-table';\nimport { EnrollmentTransaction } from '../enrollment.types';\nimport dayjs from 'dayjs';\nimport { currencyFormatter } from 'shared/utils';\n\ninterface Props {\n cells: EnrollmentTransaction[];\n}\n\nconst Document = _Document as any;\nconst Page = _Page as any;\nconst Text = _Text as any;\nconst StyleSheet = _StyleSheet as any;\nconst PdfTable = _PdfTable as any;\nconst PdfTableHeader = _PdfTableHeader as any;\nconst PdfTableCell = _PdfTableCell as any;\nconst PdfTableBody = _PdfTableBody as any;\nconst PdfDataTableCell = _PdfDataTableCell as any;\n\nconst styles = StyleSheet.create({\n title: { margin: '5% 5% 0' },\n});\n\n// Create Document Component\nfunction MraPdf({ cells }: Props) {\n return (\n <Document>\n <Page>\n <Text style={styles.title}>Transactions</Text>\n <PdfTable\n data={cells}\n >\n <PdfTableHeader>\n <PdfTableCell>\n Effective\n </PdfTableCell>\n <PdfTableCell>\n Incurred\n </PdfTableCell>\n <PdfTableCell>\n Amount\n </PdfTableCell>\n <PdfTableCell>\n Ref#\n </PdfTableCell>\n <PdfTableCell>\n Type\n </PdfTableCell>\n </PdfTableHeader>\n <PdfTableBody>\n {/* eslint-disable react/jsx-no-bind */}\n <PdfDataTableCell\n getContent={\n (r: EnrollmentTransaction) => dayjs(r.effectiveDate, 'YYYY-MM-DD').format('MM/DD/YYYY')\n }\n />\n <PdfDataTableCell\n getContent={\n (r: EnrollmentTransaction) => dayjs(r.incurredDate, 'YYYY-MM-DD').format('MM/DD/YYYY')\n }\n />\n <PdfDataTableCell getContent={(r: EnrollmentTransaction) => currencyFormatter.format(r.amount)} />\n <PdfDataTableCell getContent={(r: EnrollmentTransaction) => r.referenceNumber} />\n <PdfDataTableCell getContent={(r: EnrollmentTransaction) => r.type} />\n {/* eslint-enable react/jsx-no-bind */}\n </PdfTableBody>\n </PdfTable>\n </Page>\n </Document>\n );\n}\n\nexport default MraPdf;\n","import React from 'react';\nimport TableFooter from '@mui/material/TableFooter';\nimport TablePagination from '@mui/material/TablePagination';\nimport TableRow from '@mui/material/TableRow';\n\ninterface TransactionPaginatorProps {\n count: number;\n page: number; // 0-based index\n pageSize: number;\n colSpan?: number;\n pageSizeOptions?: number[];\n onChangePage: (newPage: number) => void;\n onChangePageSize: (newPageSize: number) => void;\n}\n\nfunction TransactionPaginator({\n count,\n page,\n pageSize,\n colSpan = 5,\n pageSizeOptions = [ 10 ],\n onChangePage,\n onChangePageSize,\n}: TransactionPaginatorProps): React.ReactElement {\n function handleChangePage(event: React.MouseEvent<HTMLButtonElement> | null, newPage: number) {\n onChangePage(newPage);\n }\n\n function handleChangePageSize(event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) {\n onChangePageSize(parseInt(event.target.value, 10));\n onChangePage(0);\n }\n\n return (\n <TableFooter>\n <TableRow>\n <TablePagination\n rowsPerPage={pageSize}\n rowsPerPageOptions={pageSizeOptions}\n colSpan={colSpan}\n count={count}\n page={page}\n onPageChange={handleChangePage}\n onRowsPerPageChange={handleChangePageSize}\n SelectProps={ { native: true } }\n />\n </TableRow>\n </TableFooter>\n );\n}\n\nexport default TransactionPaginator;\n","import React, { ReactElement, useState } from 'react';\nimport Table from '@mui/material/Table';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport TableBody from '@mui/material/TableBody';\nimport dayjs from 'dayjs';\n\nimport withTransactionModal from './WithTransactionModal';\nimport { EnrollmentTransaction } from '../enrollment.types';\nimport { currencyFormatter } from 'shared/utils';\nimport TransactionRow from './TransactionRow';\nimport TransactionExportButton from './TransactionExportButton';\nimport Pdf from './MraPdf';\nimport TransactionPaginator from './TransactionPaginator';\n\ninterface MraTransactionsProps {\n transactions: EnrollmentTransaction[];\n}\n\nexport function MraTransactions({ transactions }: MraTransactionsProps): ReactElement {\n const [ page, setPage ] = useState(0);\n const [ pageSize, setPageSize ] = useState(10);\n\n return (\n <>\n <div className=\"flex justify-end\">\n <TransactionExportButton document={<Pdf cells={transactions} />} fileName=\"Transactions\" />\n </div>\n <Table>\n <TableHead>\n <TableRow>\n <TableCell>Effective</TableCell>\n <TableCell>Incurred</TableCell>\n <TableCell>Amount</TableCell>\n <TableCell>Ref#</TableCell>\n <TableCell>Type</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {\n transactions\n .slice(page * pageSize, page * pageSize + pageSize)\n .map(\n (t, i) => (\n <TransactionRow key={i} cells={[\n dayjs(t.effectiveDate, 'YYYY-MM-DD').format('MM/DD/YYYY'),\n dayjs(t.incurredDate, 'YYYY-MM-DD').format('MM/DD/YYYY'),\n currencyFormatter.format(t.amount),\n t.referenceNumber,\n t.type ]}\n />\n ),\n )\n }\n </TableBody>\n <TransactionPaginator\n count={transactions.length}\n page={page}\n pageSize={pageSize}\n onChangePage={setPage}\n onChangePageSize={setPageSize}\n />\n </Table>\n </>\n );\n}\n\nexport default withTransactionModal(MraTransactions);\n","import React from 'react';\nimport { Document as _Document, Page as _Page, Text as _Text } from '@react-pdf/renderer';\nimport {\n PdfTable as _PdfTable,\n PdfTableHeader as _PdfTableHeader,\n PdfTableCell as _PdfTableCell,\n PdfTableBody as _PdfTableBody,\n PdfDataTableCell as _PdfDataTableCell,\n} from 'shared/pdf-data-table';\nimport { EnrollmentTransaction } from '../enrollment.types';\nimport dayjs from 'dayjs';\nimport { currencyFormatter } from 'shared/utils';\n\ninterface Props {\n cells: EnrollmentTransaction[];\n}\n\nconst Document = _Document as any;\nconst Page = _Page as any;\nconst Text = _Text as any;\nconst PdfTable = _PdfTable as any;\nconst PdfTableHeader = _PdfTableHeader as any;\nconst PdfTableCell = _PdfTableCell as any;\nconst PdfTableBody = _PdfTableBody as any;\nconst PdfDataTableCell = _PdfDataTableCell as any;\n\n// Create Document Component\nfunction HsaPdf ({ cells }: Props) {\n return (\n <Document>\n <Page>\n <Text>Transactions</Text>\n <PdfTable\n data={cells}\n >\n <PdfTableHeader>\n <PdfTableCell>\n Posted\n </PdfTableCell>\n <PdfTableCell>\n Pay Date\n </PdfTableCell>\n <PdfTableCell>\n Amount\n </PdfTableCell>\n <PdfTableCell>\n Type\n </PdfTableCell>\n <PdfTableCell>\n Status\n </PdfTableCell>\n </PdfTableHeader>\n <PdfTableBody>\n {/* eslint-disable react/jsx-no-bind */}\n <PdfDataTableCell\n getContent={\n (r: EnrollmentTransaction) => dayjs(r.effectiveDate, 'YYYY-MM-DD').format('MM/DD/YYYY')\n }\n />\n <PdfDataTableCell\n getContent={\n (r: EnrollmentTransaction) => dayjs(r.incurredDate, 'YYYY-MM-DD').format('MM/DD/YYYY')\n }\n />\n <PdfDataTableCell getContent={(r: EnrollmentTransaction) => currencyFormatter.format(r.amount)} />\n <PdfDataTableCell getContent={(r: EnrollmentTransaction) => r.type} />\n <PdfDataTableCell getContent={(r: EnrollmentTransaction) => r.referenceNumber} />\n {/* eslint-enable react/jsx-no-bind */}\n </PdfTableBody>\n </PdfTable>\n </Page>\n </Document>\n );\n}\n\nexport default HsaPdf;\n","import React, { ReactElement, useState } from 'react';\nimport Table from '@mui/material/Table';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport TableBody from '@mui/material/TableBody';\nimport dayjs from 'dayjs';\n\nimport withTransactionModal from './WithTransactionModal';\nimport { EnrollmentTransaction } from '../enrollment.types';\nimport { currencyFormatter } from 'shared/utils';\nimport TransactionRow from './TransactionRow';\nimport Pdf from './HsaPdf';\nimport TransactionExportButton from './TransactionExportButton';\nimport TransactionPaginator from './TransactionPaginator';\n\ninterface HsaTransactionsProps {\n transactions: EnrollmentTransaction[];\n}\n\nexport function HsaTransactions({ transactions }: HsaTransactionsProps): ReactElement {\n const [ page, setPage ] = useState(0);\n const [ pageSize, setPageSize ] = useState(10);\n\n return (\n <>\n <div className=\"flex justify-end\">\n <TransactionExportButton document={<Pdf cells={transactions} />} fileName=\"HSA Transactions\" />\n </div>\n\n <Table>\n <TableHead>\n <TableRow>\n <TableCell>Posted</TableCell>\n <TableCell>Pay Date</TableCell>\n <TableCell>Amount</TableCell>\n <TableCell>Type</TableCell>\n <TableCell>Status</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {\n transactions\n .slice(page * pageSize, page * pageSize + pageSize)\n .map(\n (t, i) => (\n <TransactionRow key={i} cells={[\n dayjs(t.effectiveDate, 'YYYY-MM-DD').format('MM/DD/YYYY'),\n dayjs(t.incurredDate, 'YYYY-MM-DD').format('MM/DD/YYYY'),\n currencyFormatter.format(t.amount),\n t.type,\n t.referenceNumber ]}\n />\n ),\n )\n }\n </TableBody>\n <TransactionPaginator\n count={transactions.length}\n page={page}\n pageSize={pageSize}\n onChangePage={setPage}\n onChangePageSize={setPageSize}\n />\n </Table>\n </>\n );\n}\n\nexport default withTransactionModal(HsaTransactions);\n","import React from 'react';\n\nimport { Dependent } from 'shared/types/non-plan-year.types';\n\ninterface CoveredDependentBoxProps {\n dependents: Dependent[];\n}\n\nfunction CoveredDependentBox({ dependents }: CoveredDependentBoxProps): React.ReactElement {\n return (\n <div className=\"w-full flex flex-col border-2 border-neutral5 rounded-5 border-solid p-4\">\n <h6 className=\"text-base text-high-em mb-5\">Covered Dependents</h6>\n <ul className=\"list-none list-inside\">\n {dependents.map((dep, idx) => <li key={`${idx}-${dep.name}`}>{dep.name}</li>)}\n </ul>\n </div>\n );\n}\n\nexport default CoveredDependentBox;\n","export const CUSTOM_PLCCODE = '0';\n\n","import Button from '@mui/material/Button';\nimport { F, T, compose, pipe } from 'ramda';\n\nimport { CUSTOM_PLCCODE } from '../../../components/shared/GlobalConstants';\n\ninterface Props {\n planCode: string;\n setIsModalOpen: any;\n setIsPending: any;\n}\n\nfunction ViewTransactionButton({ planCode, setIsModalOpen, setIsPending }: Props) {\n return (\n <div className=\"w-full flex justify-end\" >\n {\n planCode === CUSTOM_PLCCODE\n ? (\n <div className=\"flex w-1/2\">\n <Button\n variant=\"outlined\"\n color=\"primary\"\n type=\"button\"\n data-testid=\"export-custom-paid-transactions\"\n className=\"m-8\"\n fullWidth\n tabIndex={-1}\n onClick={pipe(compose(setIsModalOpen, T), compose(setIsPending, F))}\n >\n View Paid Transactions\n </Button>\n <Button\n variant=\"outlined\"\n color=\"primary\"\n type=\"button\"\n data-testid=\"export-custom-pending-transactions\"\n className=\"m-8\"\n fullWidth\n tabIndex={-1}\n onClick={pipe(compose(setIsModalOpen, T), compose(setIsPending, T))}\n >\n View Pending Transactions\n </Button>\n </div>\n )\n : (\n <div className=\"flex w-1/5\">\n <Button\n variant=\"outlined\"\n color=\"primary\"\n type=\"button\"\n data-testid=\"export-transactions\"\n className=\"mt-5\"\n fullWidth\n tabIndex={-1}\n onClick={compose(setIsModalOpen, T)}\n >\n View Transactions\n </Button>\n </div>\n )\n }\n </div>\n );\n}\n\nexport default ViewTransactionButton;\n","import React, { ReactElement, useState } from 'react';\nimport Table from '@mui/material/Table';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport TableBody from '@mui/material/TableBody';\nimport TableFooter from '@mui/material/TableFooter';\nimport TablePagination from '@mui/material/TablePagination';\nimport { addIndex, always, compose, equals, map as nonIndexedMap, nthArg, pipe, slice, when } from 'ramda';\n\ninterface DataTableProps<T> {\n headers: string[];\n cells: T[];\n isPaginated?: boolean;\n pageSize?: number;\n initialPage?: number;\n}\n\nexport function DataTable<T extends {}>(\n { headers, cells, pageSize = 10, initialPage = 0, isPaginated = false }: DataTableProps<T>,\n): ReactElement {\n const [ page, setPage ] = useState(initialPage);\n const [ size ] = useState(pageSize);\n\n const map = addIndex(nonIndexedMap);\n const sliceWhenPaginated = when(\n compose(equals(true), always(isPaginated)),\n slice(page * size, page * size + size),\n );\n\n function makeTableCell(t: unknown, i: number) {\n return (\n <TableRow key={`row${i}`}>\n {\n Object.values(t as T).map((v, ii) => (\n <TableCell className=\"data-table-cell\" key={`row${i}cell${ii}`}>\n <p className=\"text-black text-sm\">\n {v as any}\n </p>\n </TableCell>\n ))\n }\n </TableRow>\n );\n }\n\n return (\n <>\n <Table>\n <TableHead>\n <TableRow>\n {headers.map((th, i) => <TableCell key={`${th}${i}`}>{th}</TableCell>)}\n </TableRow>\n </TableHead>\n <TableBody>\n {\n cells.length > 0\n ? pipe(\n sliceWhenPaginated,\n map(makeTableCell),\n )(cells) as any\n : <TableRow><TableCell colSpan={headers.length}><p>No transactions to display</p></TableCell></TableRow>\n }\n </TableBody>\n {\n isPaginated && cells.length > 0\n ? (\n <TableFooter>\n <TableRow>\n <TablePagination\n rowsPerPage={size}\n rowsPerPageOptions={[ size ]}\n colSpan={headers.length}\n count={cells.length}\n page={page}\n onPageChange={compose(setPage, nthArg(1))}\n SelectProps={ { native: true } }\n />\n </TableRow>\n </TableFooter>\n )\n : <></>\n }\n </Table>\n </>\n );\n}\n\nexport default DataTable;\n","import React from 'react';\nimport { Document as _Document, Page as _Page, Text as _Text, StyleSheet as _StyleSheet } from '@react-pdf/renderer';\nimport {\n PdfTable as _PdfTable,\n PdfTableHeader as _PdfTableHeader,\n PdfTableCell as _PdfTableCell,\n PdfTableBody as _PdfTableBody,\n PdfDataTableCell as _PdfDataTableCell,\n} from 'shared/pdf-data-table';\nimport { identity } from 'ramda';\n\ninterface Props<T> {\n title: string;\n headers: string[];\n cells: T[];\n}\n\nconst Document = _Document as any;\nconst Page = _Page as any;\nconst Text = _Text as any;\nconst StyleSheet = _StyleSheet as any;\nconst PdfTable = _PdfTable as any;\nconst PdfTableHeader = _PdfTableHeader as any;\nconst PdfTableCell = _PdfTableCell as any;\nconst PdfTableBody = _PdfTableBody as any;\nconst PdfDataTableCell = _PdfDataTableCell as any;\n\nconst styles = StyleSheet.create({\n title: { margin: '5% 5% 0' },\n});\n\nfunction PdfDataTableGenerator<T>({ title, headers, cells }: Props<T>) {\n return (\n <Document>\n <Page>\n <Text style={styles.title}>{ title }</Text>\n <PdfTable data={cells}>\n <PdfTableHeader>\n { headers.map((h, i) => <PdfTableCell key={`pdfHeader${i}`}>{h}</PdfTableCell>) }\n </PdfTableHeader>\n <PdfTableBody>\n {\n cells.length > 0\n ? (Object.keys(cells[0]) as any).map((c: keyof T, i: number) => {\n return <PdfDataTableCell key={`pdfCell${i}`} getContent={identity((r: T) => r[c])} />;\n })\n : <PdfDataTableCell getContent={identity(() => 'No transactions to display.')} />\n }\n </PdfTableBody>\n </PdfTable>\n </Page>\n </Document>\n );\n}\n\nexport default PdfDataTableGenerator;\n","import React, { ReactElement } from 'react';\nimport dayjs from 'dayjs';\n\nimport DataTable from 'components/shared/DataTable';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport { useCustomTransactions } from './useCustomTransactions';\nimport withModal from 'components/shared/HOC/WithModal';\nimport TransactionExportButton from 'participant-overview/enrollment/view-transactions/TransactionExportButton';\nimport PdfDataTableGenerator from 'components/shared/PdfDataTableGenerator';\nimport { currencyFormatter } from 'shared/utils';\n\ninterface ViewCustomTransactionsProps {\n pyrid: string;\n customPlanId: string;\n isPending?: boolean;\n}\n\nconst paidTableHeaders = [\n 'Plan',\n 'Participant',\n 'Service Date',\n 'Date Paid',\n 'Submitted',\n 'Paid',\n];\n\nconst pendingTableHeaders = [\n 'Plan',\n 'Participant',\n 'Service Date',\n 'Paid',\n 'Rejection Reason',\n];\n\nfunction CustomTransactionsTable({ headers, transactions, isPending }:\n { headers: string[]; transactions: (string | number)[]; isPending: boolean; }) {\n return (\n <>\n {\n isPending\n ? (<h6>Pending Transactions</h6>)\n :\n (\n <>\n <h6>Paid Transactions</h6>\n <div className=\"flex justify-end\">\n <TransactionExportButton\n document={\n <PdfDataTableGenerator\n title=\"View Paid Transactions\"\n headers={headers}\n cells={transactions}\n />\n }\n fileName=\"Transactions\"\n />\n </div>\n </>\n )\n }\n <DataTable headers={headers} cells={transactions} isPaginated pageSize={10} />\n </>\n );\n}\n\nexport function ViewCustomTransactions({ pyrid, customPlanId, isPending }: ViewCustomTransactionsProps): ReactElement {\n const transactions = useCustomTransactions(pyrid, customPlanId, !!isPending);\n\n let formattedTransactions = null;\n\n if (isPending) {\n formattedTransactions = transactions?.map(({ participantName, planName, ...t }) => ({\n planName,\n participantName,\n serviceDate: dayjs(t.serviceDate, 'YYYY-MM-DD').format('MM/DD/YYYY'),\n submittedAmount: currencyFormatter.format(t.submittedAmount ?? 0),\n rejectionReason: t.rejectionReason,\n }));\n } else {\n formattedTransactions = transactions?.map(({ participantName, planName, ...t }) => ({\n planName,\n participantName,\n serviceDate: dayjs(t.serviceDate, 'YYYY-MM-DD').format('MM/DD/YYYY'),\n paidDate: dayjs(t.paidDate, 'YYYY-MM-DD').format('MM/DD/YYYY'),\n submittedAmount: currencyFormatter.format(t.submittedAmount ?? 0),\n paid: currencyFormatter.format(t.paid ?? 0),\n }));\n }\n\n const CustomTransactions = withLoopIcon(\n CustomTransactionsTable,\n 'Loading ' + (isPending ? 'pending' : 'paid') + ' transactions...',\n transactions === null,\n );\n\n return (\n <CustomTransactions\n transactions={formattedTransactions as any[]}\n headers={isPending ? pendingTableHeaders : paidTableHeaders}\n isPending={!!isPending}\n />\n );\n}\n\nexport default withModal(ViewCustomTransactions);\n","import { useState, useRef, useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { compose, tap, always } from 'ramda';\n\nimport { CustomPlanTransaction } from '../enrollment.types';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { selectParticipant } from 'participant-search/participant.slice';\nimport request, { APIOptions } from 'shared/api-request';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport store from 'store';\n\nexport function useCustomTransactions(pyrid: string, customPlanId: string, isPending: boolean) {\n const dispatch = useDispatch<typeof store.dispatch>();\n\n const [ transactions, setTransactions ] = useState<CustomPlanTransaction[] | null>(null);\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n const { empno } = useSelector(selectParticipant) ?? { empno: undefined };\n\n const { current: abortCtrl } = useRef(new AbortController());\n const { current: setDefault } = useRef(compose(setTransactions, always([])));\n const { current: handleError } = useRef(compose(\n tap(setDefault),\n dispatch,\n addHttpErrorNotification,\n ));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n const uri = `api/companies/${compid}/plan-enrollment/transactions/custom/` +\n `${empno}/plan/${customPlanId}/type/${isPending ? 'pending' : 'paid'}`;\n const apiOpts: APIOptions = { method: 'GET', signal: abortCtrl.signal };\n\n request<CustomPlanTransaction[]>(uri, apiOpts)\n .then((result) => {\n if (mountedRef.current) {\n setTransactions(result ?? []);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n\n return () => {\n mountedRef.current = false;\n abortCtrl.abort();\n };\n }, [ compid, empno, isPending, pyrid, customPlanId, handleError, abortCtrl ]);\n\n return transactions;\n}\n","import React, { useState } from 'react';\nimport dayjs from 'dayjs';\nimport EditIcon from '@mui/icons-material/Edit';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport Button from '@mui/material/Button';\nimport { useHistory } from 'react-router';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { compose, isNil, F, T, tap } from 'ramda';\n\nimport { Enrollment } from './enrollment.types';\nimport PayPeriodDeductions from './PayPeriodDeductions';\nimport PlanValue, { defaultValueClass } from './PlanValue';\nimport { currencyFormatter } from 'shared/utils';\nimport { selectParticipant } from 'participant-search/participant.slice';\nimport MraTransactions from './view-transactions/MraTransactions';\nimport HsaTransactions from './view-transactions/HsaTransactions';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport CoveredDependentBox from './CoveredDependents';\nimport { CUSTOM_PLCCODE } from 'components/shared/GlobalConstants';\nimport ViewTransactionButton from './view-transactions/ViewTransactionButton';\nimport ViewCustomTransactions from 'participant-overview/enrollment/custom-transactions/ViewCustomTransactions';\nimport { deleteRegularEnrollment, selectDeletingEnrollment } from './enrollments.slice';\nimport CancelModal from 'components/shared/CancelModal';\nimport store from 'store';\n\nconst cancelPrompt = `Are you sure you want to delete this participant's enrollment? Enrollment should only be deleted\n if it was originally entered in error. If a benefit end date is needing to be added to the participant's account,\n select 'Cancel' and then select 'Update Enrollment' to enter the appropriate benefit end date.`;\ninterface EnrolledPlanProps {\n enrollment: Enrollment;\n}\n\nfunction EnrolledPlan({ enrollment }: EnrolledPlanProps): React.ReactElement {\n const dispatch = useDispatch<typeof store.dispatch>();\n const deleting = useSelector(selectDeletingEnrollment);\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const [ showCancelModal, setShowCancelModal ] = useState<boolean>(false);\n const [ isModalOpen, setIsModalOpen ] = useState<boolean>(false);\n const [ isPending, setIsPending ] = useState<boolean>(false);\n const { empno } = useSelector(selectParticipant) ?? { empno: undefined };\n const company = useSelector(selectSelectedCompany);\n const history = useHistory();\n\n function formatDateRange(start: string, end: string): string {\n return `${dayjs(start).format('M/D/YYYY')}-${dayjs(end).format('M/D/YYYY')}`;\n }\n\n function formatValue(label: string, value?: number, valueClass = defaultValueClass) {\n if (isNil(value)) {\n return <></>;\n }\n\n return (\n <div className=\"w-1/4 my-4\">\n <PlanValue label={label} valueClassName={valueClass} value={currencyFormatter.format(value)} />\n </div>\n );\n }\n\n function makeTransactionButton() {\n if (empno && company) {\n switch (enrollment.planCode) {\n case 'S':\n return (\n <HsaTransactions\n pyrid={enrollment.pyrid}\n empno={empno}\n compid={company.compid}\n plccode={enrollment.planCode}\n onClose={compose(setIsModalOpen, F)}\n isOpen={isModalOpen}\n transactions={[]}\n />\n );\n case CUSTOM_PLCCODE:\n return (\n <ViewCustomTransactions\n pyrid={enrollment.pyrid}\n isPending={isPending}\n customPlanId={enrollment.customPlanId ?? ''}\n onClose={compose(setIsModalOpen, F)}\n isOpen={isModalOpen}\n />\n );\n default:\n return (\n <MraTransactions\n pyrid={enrollment.pyrid}\n empno={empno}\n compid={company.compid}\n plccode={enrollment.planCode}\n onClose={compose(setIsModalOpen, F)}\n isOpen={isModalOpen}\n transactions={[]}\n />\n );\n }\n }\n\n return <></>;\n }\n\n function handleUpdateClick() {\n const { pyrid, planCode, customPlanId } = enrollment;\n\n history.push(`/update-plan-enrollment/${empno}/${pyrid}/${planCode}`\n + (planCode === CUSTOM_PLCCODE ? `/${customPlanId}` : '') + `/plan-details`);\n }\n\n function confirmedDelete() {\n dispatch(deleteRegularEnrollment(compid, empno ?? '', enrollment));\n }\n\n function debitCardStatus(status: string | null) {\n if (isNil(status)) {\n return (<></>);\n }\n const firstIndexOfSpace = status.indexOf(' ');\n\n return (\n <div className=\"w-full flex flex-row\">\n <div className=\"text-lg text-high-em font-normal\">Debit Card Status:</div>\n <div className={`${statusColor(status)} text-lg font-bold ml-2`}>\n {status.substring(0, firstIndexOfSpace)}\n </div>\n <div className={`text-lg text-high-em font-normal ml-2`}>{status.substring(firstIndexOfSpace)}</div>\n </div>\n );\n }\n\n function statusColor(status: string) {\n if (/^Suspended/i.test(status)) {\n return 'text-danger';\n }\n\n if (/^Active/i.test(status)) {\n return 'text-green-500';\n }\n\n return '';\n }\n\n return (\n <section className=\"flex flex-wrap w-full participant-overview-enrolled-plan\">\n <h6 className=\"w-1/2 text-lg text-primary-main\">{enrollment.planName}</h6>\n <div className=\"w-1/2 flex flex-col items-end\">\n {\n !enrollment.isRollIn\n ? (\n <Button className=\"text-sm w-1/3\" onClick={handleUpdateClick} disabled={deleting}>\n <EditIcon className=\"text-md mr-2\" /> Update Enrollment\n </Button>\n )\n : <></>\n }\n <Button className=\"text-sm w-1/3 text-danger\" onClick={compose(setShowCancelModal, T)} disabled={deleting}>\n <DeleteIcon className={`text-md mr-2 ${deleting && 'animate-ping'}`} /> Delete Enrollment\n </Button>\n </div>\n <div className=\"flex w-full mt-10\" >\n <div className=\"w-4/5 flex flex-wrap\">\n <div className=\"w-full mb-4\">\n <p>\n <b className=\"text-high-em\">Plan Year </b>\n {formatDateRange(enrollment.planYearStart, enrollment.planYearEnd)}\n </p>\n <p>\n <b className=\"text-high-em\">Enrollment Period </b>\n {formatDateRange(enrollment.enrollmentStart, enrollment.enrollmentEnd)}\n </p>\n </div>\n {formatValue('Annual Allocation', enrollment.annualAllocation, `${defaultValueClass} text-3-1/2xl`)}\n {formatValue('Contributions', enrollment.totalContributions)}\n {formatValue('Reimbursements', enrollment.totalReimbursements)}\n {formatValue('Forfeitures', enrollment.totalForfeitures)}\n {formatValue('Rolled In', enrollment.totalRolledIn)}\n {formatValue('Rolled Out', enrollment.totalRolledOut)}\n {formatValue('Remaining', enrollment.remainingAllocation)}\n {formatValue('Balance', enrollment.balance)}\n {formatValue('Pending', enrollment.pending)}\n {formatValue('Processed', enrollment.processed)}\n {formatValue('Paid', enrollment.paid)}\n {debitCardStatus(enrollment.debitCardStatus || null)}\n </div>\n <div className=\"w-1/5\">\n {\n isNil(enrollment.payPeriodDeductions)\n ? <></>\n : <PayPeriodDeductions deductions={enrollment.payPeriodDeductions} />\n }\n {\n isNil(enrollment.dependents)\n ? <></>\n : <CoveredDependentBox dependents={enrollment.dependents} />\n }\n {makeTransactionButton()}\n </div>\n </div>\n <ViewTransactionButton\n planCode={enrollment.planCode}\n setIsModalOpen={setIsModalOpen}\n setIsPending={setIsPending}\n />\n <CancelModal\n isOpen={showCancelModal}\n onCancel={compose(tap(confirmedDelete), setShowCancelModal, F)}\n onClose={compose(setShowCancelModal, F)}\n title=\"Are you sure you want to delete?\"\n prompt={cancelPrompt}\n cancelText=\"Yes, delete enrollment\"\n closeText=\"Cancel\"\n />\n </section>\n );\n}\n\nexport default EnrolledPlan;\n","import { ReactElement } from 'react';\nimport EnrolledPlan from './EnrolledPlan';\nimport { Enrollment } from './enrollment.types';\n\nexport interface ListEnrollmentsProps {\n enrollments: Enrollment[];\n divider: () => ReactElement;\n}\n\nfunction ListEnrollments({ enrollments, divider }: ListEnrollmentsProps): ReactElement {\n const last = enrollments.length - 1;\n\n function key(e: Enrollment) {\n return `${e.planYearStart}${e.planYearEnd}${e.planName}`;\n }\n\n return (\n <>\n {\n enrollments.map((enrollment, idx) => (\n <div key={key(enrollment)}>\n <EnrolledPlan enrollment={enrollment} />\n {idx !== last ? divider() : <></>}\n </div>\n ))\n }\n </>\n );\n}\n\nexport default ListEnrollments;\n","import { useEffect } from 'react';\nimport PersonAddIcon from '@mui/icons-material/PersonAdd';\nimport Button from '@mui/material/Button';\nimport { useHistory } from 'react-router-dom';\nimport Divider from '@mui/material/Divider';\n\nimport DisplayCobRetLoaEnrollment, { DisplayCobRetLoaEnrollmentProps } from './enrollment/DisplayCobRetLoaEnrollment';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport ListEnrollments, { ListEnrollmentsProps } from './enrollment/ListEnrollments';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { loadEnrollments, selectRegularEnrollments } from './enrollment/enrollments.slice';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport {\n loadCobraEnrollments,\n loadLoaEnrollments,\n loadRetireeEnrollments,\n selectCobraEnrollments,\n selectLoaEnrollments,\n selectRetireeEnrollments,\n} from 'participant-overview/participant-overview.slice';\nimport store from 'store';\n\nfunction PlanDivider() {\n return <Divider className=\"my-10 text-neutral5 -mx-4\" />;\n}\n\ninterface PlanEnrollmentProps {\n employeeNumber: string;\n}\n\nfunction PlanEnrollmentTab({ employeeNumber }: PlanEnrollmentProps) {\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const cobEnrollment = useSelector(selectCobraEnrollments);\n const retEnrollment = useSelector(selectRetireeEnrollments);\n const loaEnrollment = useSelector(selectLoaEnrollments);\n const planEnrollments = useSelector(selectRegularEnrollments);\n\n useEffect(() => {\n dispatch(loadEnrollments(compid, employeeNumber));\n dispatch(loadCobraEnrollments(compid, employeeNumber));\n dispatch(loadRetireeEnrollments(compid, employeeNumber));\n dispatch(loadLoaEnrollments(compid, employeeNumber));\n }, [ dispatch, compid, employeeNumber ]);\n\n function handleClick() {\n history.push(`/plan-enrollment/${employeeNumber}/plan-type`);\n }\n\n const CobraEnrollments = withLoopIcon<DisplayCobRetLoaEnrollmentProps>(\n DisplayCobRetLoaEnrollment,\n 'Loading COBRA Enrollments...',\n cobEnrollment === null,\n );\n\n const RetireeEnrollments = withLoopIcon<DisplayCobRetLoaEnrollmentProps>(\n DisplayCobRetLoaEnrollment,\n 'Loading Retiree Enrollments...',\n retEnrollment === null,\n );\n\n const LOAEnrollments = withLoopIcon<DisplayCobRetLoaEnrollmentProps>(\n DisplayCobRetLoaEnrollment,\n 'Loading LOA Enrollments...',\n loaEnrollment === null,\n );\n\n const PlanEnrollments = withLoopIcon<ListEnrollmentsProps>(\n ListEnrollments,\n 'Loading Plan Enrollments...',\n planEnrollments === null,\n );\n\n function planDivider() {\n return <PlanDivider />;\n }\n\n return (\n <>\n <h6 className=\"mb-4\" data-testid=\"planEnrollment\">Plan Enrollment</h6>\n <p>To enroll this employee in a benefit Flores administers click enroll participant.</p>\n <Button\n variant=\"contained\"\n color=\"primary\"\n className=\"uppercase mt-8 font-normal enroll-participant-btn\"\n onClick={handleClick}\n >\n <PersonAddIcon className=\"mr-1\" /> Enroll Participant\n </Button>\n {cobEnrollment?.length ? <PlanDivider /> : <></>}\n <CobraEnrollments enrollment={cobEnrollment ?? []} title=\"COBRA\" type=\"c\" />\n {retEnrollment?.length ? <PlanDivider /> : <></>}\n <RetireeEnrollments enrollment={retEnrollment ?? []} title=\"Retiree Billing\" type=\"r\" />\n {loaEnrollment?.length ? <PlanDivider /> : <></>}\n <LOAEnrollments enrollment={loaEnrollment ?? []} title=\"LOA Billing\" type=\"l\" />\n {planEnrollments?.length ? <PlanDivider /> : <></>}\n <PlanEnrollments enrollments={planEnrollments ?? []} divider={planDivider} />\n </>\n );\n}\n\nexport default PlanEnrollmentTab;\n","import React, { useEffect, useState } from 'react';\nimport Tabs from '@mui/material/Tabs';\nimport Tab from '@mui/material/Tab';\nimport { compose, F } from 'ramda';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport withLoopIcon from '../components/shared/HOC/WithLoopIcon';\nimport LoopIcon from '@mui/icons-material/Loop';\n\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport TabPanel from 'components/shared/TabPanel';\nimport GeneralInfo from './GeneralInfo';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { addHttpErrorNotification, addHttpSuccessNotification } from 'notifications/notifications.slice';\nimport { selectParticipant, setSelectedParticipant } from 'participant-search/participant.slice';\nimport { Participant } from 'participant-search/participant-list.types';\nimport Dependents from 'components/shared/dependents/Dependents';\nimport Loading from 'components/shared/Loading';\nimport { Dependent } from 'shared/types/non-plan-year.types';\nimport PlanEnrollmentTab from './PlanEnrollmentTab';\nimport ParticipantSubHeader from 'components/shared/ParticipantSubHeader';\nimport CancelModal from 'components/shared/CancelModal';\nimport { getDependents, saveDependents } from 'shared/api/dependentsApi';\nimport { updateParticipant } from 'shared/api/participantApi';\nimport store from 'store';\n\nexport interface DependentsState {\n initialDependents: Dependent[] | null;\n addedDependents: Dependent[] | null;\n}\n\ntype PoTab = 'general-info' | 'dependents' | 'plan-enrollment';\n\nfunction ParticipantOverview() {\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n const { employeeNumber, tab = 'general-info' } = useParams<{employeeNumber: string; tab?: PoTab;}>();\n const selectedParticipant = useSelector(selectParticipant);\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const [ nextTab, setNextTab ] = useState<PoTab>(tab);\n const [ showModal, setShowModal ] = useState(false);\n const [ tabHasChanges, setTabHasChanges ] = useState(false);\n const [ saving, setSaving ] = useState(false);\n const [ participant, setParticipant ] = useState<Participant | null>(selectedParticipant);\n const [ dependents, setDependents ] = useState<DependentsState>({\n initialDependents: null,\n addedDependents: null,\n });\n\n function updateDependents(\n values: DependentsState,\n ) {\n if (values.addedDependents?.length) {\n setSaving(true);\n saveDependents(compid, participant!.empno, values.addedDependents)\n .then(() => setDependents({\n initialDependents: [ ...(values.initialDependents ?? []), ...(values.addedDependents ?? []) ],\n addedDependents: [],\n }))\n .catch(compose(dispatch, addHttpErrorNotification))\n .then(() => setSaving(false));\n }\n }\n\n function onSubmit(p: Participant) {\n setSaving(true);\n\n updateParticipant(compid, p)\n .then(() => {\n dispatch(setSelectedParticipant(p));\n setParticipant(p);\n dispatch(addHttpSuccessNotification('Saved!'));\n })\n .catch(compose(dispatch, addHttpErrorNotification))\n .finally(() => setSaving(false));\n }\n\n useEffect(() => {\n if (participant?.empno !== employeeNumber) {\n setParticipant(selectedParticipant);\n setDependents({ initialDependents: null, addedDependents: null });\n }\n }, [ employeeNumber, participant, selectedParticipant ]);\n\n useEffect(() => {\n if (tab === 'dependents' && !dependents.initialDependents && participant) {\n getDependents(compid, participant.empno)\n .then((data) => setDependents({ initialDependents: data ?? [], addedDependents: [] }))\n .catch(compose(dispatch, addHttpErrorNotification));\n }\n }, [ dependents.initialDependents, dispatch, tab, participant, compid ]);\n\n function onChangeTab(event: React.ChangeEvent<{}>, newValue: PoTab) {\n if (newValue !== tab) {\n setNextTab(newValue);\n\n if (tabHasChanges) {\n setShowModal(true);\n } else {\n history.push(`/participant-overview/${employeeNumber}/${newValue}`);\n }\n }\n }\n\n function switchTabsAfterModal() {\n setShowModal(false);\n setTabHasChanges(false);\n history.push(`/participant-overview/${employeeNumber}/${nextTab}`);\n }\n\n const Subheader = withLoopIcon(\n ParticipantSubHeader,\n 'Loading',\n !participant,\n 'po-loading',\n );\n\n return (\n <>\n <div className=\"flex flex-col m-4 w-full po-container\">\n <h5 className=\"mb-4\">Participant Overview</h5>\n <div className=\"w-1/2 pb-4\">\n <Subheader participant={participant!} />\n </div>\n <PageContentPaper className=\"flex flex-col\">\n <Tabs\n indicatorColor=\"primary\"\n textColor=\"primary\"\n className=\"-ml-4 -mt-4\"\n value={tab}\n onChange={onChangeTab}\n >\n <Tab data-testid=\"general-info-tab\" value=\"general-info\" label=\"General Info\" />\n <Tab data-testid=\"dependents-tab\" value=\"dependents\" label=\"Dependents\" />\n <Tab data-testid=\"plan-enrollment-tab\" value=\"plan-enrollment\" label=\"Plan Enrollment\" />\n </Tabs>\n <TabPanel value={tab} index=\"general-info\">\n {\n tab !== 'general-info' || !participant\n ? <div className=\"general-info-loading\"><LoopIcon className=\"animate-spin\" /> Loading</div>\n : (\n <div data-testid=\"general-info-content\">\n <GeneralInfo\n details={participant}\n onSubmit={onSubmit}\n onHasChanged={setTabHasChanges}\n />\n </div>\n )\n }\n </TabPanel>\n <TabPanel value={tab} index=\"dependents\">\n <div data-testid=\"dependents-content\">\n {\n tab !== 'dependents' || !dependents.initialDependents\n ? <div className=\"deps-loading\"><LoopIcon className=\"animate-spin\" /> Loading</div>\n : (\n <Dependents\n submitText=\"Save Dependents\"\n onNextStep={updateDependents}\n onHasChanged={setTabHasChanges}\n dependents={dependents.initialDependents}\n initialAddedDependents={dependents.addedDependents ?? []}\n saving={saving}\n />\n )\n }\n </div>\n </TabPanel>\n <TabPanel value={tab} index=\"plan-enrollment\">\n <div data-testid=\"plan-enrollment-content\">\n {\n tab !== 'plan-enrollment' || !participant\n ? <><LoopIcon className=\"animate-spin\" /> Loading</>\n : <PlanEnrollmentTab employeeNumber={participant.empno} />\n }\n </div>\n </TabPanel>\n </PageContentPaper>\n </div>\n <CancelModal\n isOpen={showModal}\n onCancel={switchTabsAfterModal}\n onClose={compose(setShowModal, F)}\n title=\"Are you sure you want to navigate away?\"\n />\n {saving ? <Loading text=\"Saving...\" /> : <></>}\n </>\n );\n}\n\nexport default ParticipantOverview;\n","import * as yup from 'yup';\n\nexport const validationSchema = yup.object({\n planId: yup\n .number()\n .moreThan(-1, 'Please select a plan.')\n .required('Please select a plan.'),\n});\n","import { useState, useRef, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { compose, tap, always } from 'ramda';\n\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { OpenPlan } from 'plan-enrollment/plan-enrollment.types';\nimport { getOpenPlans } from 'shared/api/openPlansApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\n\nexport function useOpenPlans() {\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n\n const [ openPlans, setOpenPlans ] = useState<OpenPlan[] | null>(null);\n const [ setDefault ] = useState(() => compose(setOpenPlans, always([])));\n const { current: handleError } = useRef(compose(\n tap(setDefault),\n useErrorNotifier(),\n ));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n getOpenPlans(compid)\n .then((result) => {\n if (mountedRef.current) {\n setOpenPlans(result?.map((n, i) => ({ ...n, unqid: i })) ?? []);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n\n return () => {\n mountedRef.current = false;\n };\n }, [ compid, setOpenPlans, handleError ]);\n\n return openPlans;\n}\n","import request from '../api-request';\nimport { OpenPlan } from 'plan-enrollment/plan-enrollment.types';\n\nexport function getOpenPlans(companyId?: number) {\n if (!companyId || companyId <= 0) {\n return Promise.reject(new Error('Cannot load plans for invalid company'));\n }\n\n return request<OpenPlan[]>(`/api/companies/${companyId}/open-plans`);\n}\n\nexport function getOpenCustomPlans(companyId?: number) {\n if (!companyId || companyId <= 0) {\n return Promise.reject(new Error('Cannot load custom plans for invalid company'));\n }\n\n return request<OpenPlan[]>(`/api/companies/${companyId}/open-plans/custom`);\n}\n\n","import { ChangeEvent } from 'react';\nimport FormControl from '@mui/material/FormControl';\nimport Select from '@mui/material/Select';\n\nimport { OpenPlan } from 'plan-enrollment/plan-enrollment.types';\nimport FormErrorText from 'components/shared/FormErrorText';\n\ninterface PlanSelectProps {\n value?: number;\n plans: OpenPlan[];\n onPlanSelected: (planId?: number) => void;\n error: boolean;\n name?: string;\n showSubPlan: boolean;\n}\n\nfunction PlanSelect({\n value = -1,\n plans,\n onPlanSelected,\n error,\n name = 'planId',\n showSubPlan }: PlanSelectProps) {\n function handleChange({ target: { value: val } }: ChangeEvent<{ name?: string; value: unknown; }>) {\n const planId = parseInt(val as string);\n onPlanSelected(planId);\n }\n\n return (\n <FormControl variant=\"outlined\" className=\"w-full plan-enrollment-plan-select\">\n <Select\n onChange={handleChange as any}\n value={value}\n name={name}\n native\n >\n <option value={-1} />\n {plans.map((p) => (\n <option\n value={p.unqid}\n key={p.unqid}\n >{showSubPlan ? `${p.planYearName} - ${p.subName ?? ''}` : p.planYearName}\n </option>\n ))}\n </Select>\n <FormErrorText show={error} message=\"Please select a plan\" />\n </FormControl>\n );\n}\n\nexport default PlanSelect;\n","import React from 'react';\nimport Button from '@mui/material/Button';\nimport { useFormik } from 'formik';\nimport { isNil } from 'ramda';\n\nimport { OpenPlan, PlanEnrollmentFormProps } from 'plan-enrollment/plan-enrollment.types';\nimport { validationSchema } from './plan-selection.validators';\nimport { useOpenPlans } from 'shared/custom-hooks/useOpenPlans';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport PlanSelect from './PlanSelect';\n\ninterface EnrollmentPlanSelectionProps extends PlanEnrollmentFormProps {\n plan?: OpenPlan;\n}\n\nfunction EnrollmentPlanSelection({\n plan,\n onNextStep,\n onCancel,\n}: EnrollmentPlanSelectionProps): React.ReactElement {\n const form = useFormik<{planId?: number;}>({\n initialValues: { planId: plan?.unqid },\n validationSchema,\n onSubmit: ({ planId }) => {\n if (!isNil(planId)) {\n const found = plans?.find((p) => p.unqid === planId);\n\n if (found) {\n onNextStep(found);\n }\n }\n },\n });\n\n const plans = useOpenPlans();\n\n function handlePlanSelected(planId?: number) {\n form.setFieldValue('planId', planId);\n }\n\n const PlanSelectWithLoader = withLoopIcon(\n PlanSelect,\n 'Loading plans...',\n plans === null,\n 'w-full plan-enrollment-plans-loading',\n );\n\n return (\n <div className=\"w-full\">\n <h6>Participant Enrollment</h6>\n <p className=\"my-8\">Select from the list below the plan in which the employee should be enrolled.</p>\n <form>\n <div className=\"w-full\">\n <PlanSelectWithLoader\n name=\"planId\"\n plans={plans ?? []}\n value={form.values.planId}\n error={!!form.touched.planId && !!form.errors.planId}\n onPlanSelected={handlePlanSelected}\n showSubPlan={false}\n />\n </div>\n <div className=\"wizard-buttons\" >\n <Button\n color=\"primary\"\n onClick={onCancel}\n className=\"plan-enrollment-cancel\"\n tabIndex={-1}\n >\n Cancel\n </Button>\n <Button\n color=\"primary\"\n variant=\"contained\"\n className=\"ml-8 plan-enrollment-next\"\n onClick={form.submitForm}\n disabled={!form.isValid}\n tabIndex={-1}\n >\n Next Step\n </Button>\n </div>\n </form>\n </div>\n );\n}\n\nexport default EnrollmentPlanSelection;\n","import * as yup from 'yup';\nimport { isNil } from 'ramda';\nimport dayjs from 'dayjs';\n\nimport { isWithinDateRange } from 'shared/utils';\n\nconst requiredText = 'This field is required';\n\nexport const validationSchema = (isEdit: boolean) => (\n yup\n .object({\n partStart: yup\n .date()\n .nullable()\n .typeError('Invalid Date Format')\n .required(requiredText),\n partEnd: isEdit\n ? yup\n .date()\n .typeError('Invalid Date Format')\n .when('partStart', (start: string, schema: any) => {\n return schema.test({\n test: (end: string) => !!start && (dayjs(start).isSame(dayjs(end)) || dayjs(start).isBefore(dayjs(end))),\n message: 'End date must be after start date',\n });\n })\n .nullable()\n .required(requiredText)\n : yup.date(),\n yearBeg: yup.string(),\n yearEnd: yup.string(),\n })\n .test(\n 'plan-year-provided',\n 'Error: No plan year can be determined.',\n ({ yearBeg, yearEnd }) => !(isNil(yearBeg) || isNil(yearEnd)),\n )\n // Skip the next validation if partStart\n // is nil because .required() will catch that\n // skip partEnd validation if nil or not in edit mode\n .test(\n 'dates-within-plan-year',\n 'Start and end dates must be within the open plan year.',\n ({\n yearBeg, yearEnd, partStart, partEnd,\n }) => (isNil(partStart) || isWithinDateRange(yearBeg!, yearEnd!, partStart)())\n && (!isEdit || isNil(partEnd) || isWithinDateRange(yearBeg!, yearEnd!, partEnd)()),\n )\n);\n","import React, { useState } from 'react';\nimport Button from '@mui/material/Button';\nimport dayjs from 'dayjs';\nimport { useFormik } from 'formik';\n\nimport { handleDateChange } from 'shared/form-helpers';\nimport { validationSchema } from './plan-enrollment-hsa.validators';\nimport { PlanEnrollmentFormProps } from '../plan-enrollment.types';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport AdapterDayJS from '@mui/lab/AdapterDayjs';\nimport LocalizationProvider from '@mui/lab/LocalizationProvider';\nimport DatePicker from '@mui/lab/DatePicker';\nimport TextField from '@mui/material/TextField';\n\ninterface Props extends PlanEnrollmentFormProps {\n partStart?: string;\n partEnd?: string;\n yearBeg?: string;\n yearEnd?: string;\n planName?: string;\n}\n\nfunction PlanEnrollmentHsa({\n partStart = '',\n partEnd,\n yearBeg,\n yearEnd,\n planName,\n isEdit = false,\n onNextStep,\n onCancel,\n}: Props) {\n const form = useFormik({\n validationSchema: validationSchema(isEdit),\n initialValues: {\n partStart,\n partEnd,\n yearBeg,\n yearEnd,\n },\n onSubmit: (values) => {\n try {\n validationSchema(isEdit).validateSync(\n values,\n {\n abortEarly: false,\n stripUnknown: false,\n },\n );\n\n onNextStep({\n partStart: values.partStart,\n partEnd: values.partEnd,\n type: 'HSA',\n });\n } catch (err) {\n setWholeFormErrors(err.errors);\n }\n },\n });\n const [ wholeFormErrors, setWholeFormErrors ] = useState<string[]>([]);\n\n return (\n <>\n <h6>{isEdit && 'Update '}Participant Enrollment</h6>\n <p className=\"my-8\">Enter the employee's HSA effective date.</p>\n <p className=\"my-8\">{planName}</p>\n <form className=\"plan-enrollment-hsa-form space-y-8\">\n {\n wholeFormErrors.length\n ? wholeFormErrors.map((m, i) => (\n <FormHelperText\n className=\"text-base pb-5\"\n key={i}\n disabled\n error\n >\n {m}\n </FormHelperText>\n ))\n : <></>\n }\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n label=\"Begin Date\"\n inputFormat=\"MM/DD/YYYY\"\n value={form.values.partStart ? dayjs(form.values.partStart, 'YYYY-MM-DD')\n .format('MM/DD/YYYY') : null}\n onChange={handleDateChange('partStart', form)}\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n variant=\"outlined\"\n name=\"partStart\"\n className=\"w-full\"\n {...params}\n error={form.touched.partStart && !!form.errors.partStart}\n helperText={form.touched.partStart && form.errors.partStart}\n />\n )}\n />\n </LocalizationProvider>\n\n {\n isEdit\n ? (\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n label=\"End Date\"\n inputFormat=\"MM/DD/YYYY\"\n value={form.values.partEnd ? dayjs(form.values.partEnd, 'YYYY-MM-DD')\n .format('MM/DD/YYYY') : null}\n onChange={handleDateChange('partEnd', form)}\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n variant=\"outlined\"\n name=\"partEnd\"\n className=\"w-full\"\n {...params}\n error={form.touched.partEnd && !!form.errors.partEnd}\n helperText={form.touched.partEnd && form.errors.partEnd}\n />\n )}\n />\n </LocalizationProvider>\n )\n : <></>\n }\n\n <div className=\"wizard-buttons\">\n <Button\n color=\"primary\"\n onClick={onCancel}\n className=\"plan-enrollment-cancel\"\n tabIndex={-1}\n >\n Cancel\n </Button>\n <Button\n color=\"primary\"\n variant=\"contained\"\n className=\"ml-8 plan-enrollment-next\"\n onClick={form.submitForm}\n tabIndex={-1}\n >\n Next Step\n </Button>\n </div>\n </form>\n </>\n );\n}\n\nexport default PlanEnrollmentHsa;\n","import { Dependent } from 'shared/types/non-plan-year.types';\n\n// kind of a combination of bits of PlanYear and PlanService\nexport interface OpenPlan {\n unqid?: number;\n pyrid: number;\n yearbeg: string;\n yearend: string;\n medmax: number;\n depmax: number;\n plcid: number;\n plcdesc: string;\n plccode: string;\n subPlanId?: number;\n subName?: string;\n subPlanName: string;\n isBalance: boolean;\n planYearName: string;\n hasFloresHSA: boolean;\n hasOtherHSA: boolean;\n}\n\nexport type PlanLevel = 10 | 11;\n\nexport const planLevelMap: Map<PlanLevel, string> = new Map([\n [ 10, 'Employee Only' ],\n [ 11, 'Family' ],\n]);\n\nexport interface MRABase {\n type: 'MRA';\n partStart: string; // begin date\n partEnd: string; // end date\n partAnn: number; // annual allocation\n firstPayDateOfChange: string;\n payPeriodDeduction: number;\n totalContributions?: number;\n}\n\nexport interface MRADetails extends MRABase {\n lfsa: false;\n}\n\nexport interface MRADetailsWithLFSA extends MRABase {\n lfsa: true;\n planLevel?: PlanLevel;\n}\n\nexport interface HSADetails {\n type: 'HSA';\n partStart: string; // begin date\n partEnd?: string; // end date\n}\n\nexport interface CustomDetails {\n type: 'CUSTOM';\n partStart: string; // begin date\n partEnd: string; // end date\n partAnn?: number; // annual allocation\n currentContributions?: number;\n additionalContributions?: number;\n coveredDependents: Dependent[];\n}\n\nexport type PlanDetails = MRADetails | MRADetailsWithLFSA | HSADetails | CustomDetails;\n\nexport interface PlanEnrollmentPayload {\n medplancd: string; // from companiesSlice.selectedCompany\n empno: string; // from participantSlice.selected\n\n // from thisSlice.plan\n pyrid: number;\n plcid: number;\n plccode: string;\n\n // from thisSlice.planDetails\n partStart: string;\n partEnd?: string;\n partAnn?: number;\n firstPayDateOfChange?: string;\n payPeriodDeduction?: number;\n planLevel?: PlanLevel;\n\n //Custom\n currentContributions?: number;\n additionalContributions?: number;\n coveredDependents?: Dependent[];\n}\n\nexport interface PlanEnrollmentState {\n plan?: OpenPlan;\n planDetails?: PlanDetails;\n}\n\nexport interface PlanEnrollmentFormProps {\n isEdit?: boolean;\n onNextStep: (data: OpenPlan | PlanDetails) => void;\n onCancel: () => void;\n}\n","import React, { ReactElement } from 'react';\nimport dayjs from 'dayjs';\n\nimport { Props } from './plan-enrollment-summary.types';\nimport Button from '@mui/material/Button';\nimport { PlanLevel, planLevelMap } from 'plan-enrollment/plan-enrollment.types';\n\nconst buttonText = 'Save Enrollment';\n\ninterface DefinitionProps {\n dd: string;\n dt: string;\n}\n\nfunction Definition({ dd, dt }: DefinitionProps) {\n return (\n <>\n <dt className=\"pt-3 text-sm text-med-em\">{dt}</dt>\n <dd className=\"font-bold\">{dd}</dd>\n </>\n );\n}\n\n/**\n * Generate markup based on discriminated union\n */\nfunction MakeMRAMarkup(props: Props): ReactElement {\n if (props.type === 'MRA') {\n const { payPeriodDeduction, firstPayDateOfChange, partAnn } = props;\n const doc = dayjs(firstPayDateOfChange, 'YYYY-MM-DD').format('MM/DD/YYYY');\n\n return (\n <>\n <Definition dt=\"Pay Period Deduction\" dd={`$${payPeriodDeduction}`} />\n <Definition dt=\"Annual Allocation\" dd={`$${partAnn}`} />\n <Definition dt=\"First Pay Date of Change\" dd={doc} />\n {\n props.lfsa\n ? <Definition dt=\"Level\" dd={planLevelMap.get(props.planLevel as PlanLevel) ?? ''} />\n : <></>\n }\n </>\n );\n }\n\n return <></>;\n}\n\nfunction MakeCustomMarkup(props: Props): ReactElement {\n if (props.type === 'CUSTOM') {\n const { coveredDependents } = props;\n\n return (\n <>\n {\n props.isBalance\n ?\n <>\n <Definition dt=\"Total Current Contributions\" dd={`$${props.currentContributions}`} />\n <Definition dt=\"Additional Contributions\" dd={`$${props.additionalContributions}`} />\n </>\n : <></>\n }\n <dt className=\"pt-3 text-sm text-med-em\">Covered Dependents</dt>\n {coveredDependents.map((m, i) => (<dd className=\"font-bold\" key={i}>{m.name}</dd>))}\n </>\n );\n }\n\n return <></>;\n}\n\nfunction PlanEnrollmentSummary(props: Props): ReactElement {\n const {\n type,\n partStart,\n partEnd,\n plcdesc,\n yearbeg,\n yearend,\n lfsa = false,\n isEdit = false,\n onCancel,\n onSubmit,\n } = props;\n const start = dayjs(partStart, 'YYYY-MM-DD').format('MM/DD/YYYY');\n const end = dayjs(partEnd, 'YYYY-MM-DD').format('MM/DD/YYYY');\n const yearStart = dayjs(yearbeg, 'YYYY-MM-DD').format('MM/DD/YYYY');\n const yearEnd = dayjs(yearend, 'YYYY-MM-DD').format('MM/DD/YYYY');\n\n return (\n <>\n <h5>{isEdit && 'Update '}Participant Enrollment</h5>\n <p>\n {`Please review the enrollment information below for accuracy. Once confirmed, click \"${buttonText}\" \\n` +\n ` to add the employee's plan enrollment to the system.`}\n </p>\n <div className=\"pt-4 pl-2\">\n <h6>Summary</h6>\n <dl>\n <dt className=\"pt-3 text-sm text-med-em\">Plan Type</dt>\n <dd className=\"font-bold\">\n <span className=\"font-medium\">{`${yearStart} - ${yearEnd}`}\n </span> {plcdesc}{lfsa ? ' - Limited Purpose' : ''}\n </dd>\n\n <Definition dt=\"Begin Date\" dd={start} />\n\n {\n type !== 'HSA' || !!partEnd\n ? <Definition dt=\"End Date\" dd={end} />\n : <></>\n }\n\n {MakeMRAMarkup(props)}\n {MakeCustomMarkup(props)}\n </dl>\n </div>\n\n <div className=\"flex justify-end my-4\">\n <Button\n color=\"primary\"\n onClick={onCancel}\n data-testid=\"cancel\"\n className=\"plan-enrollment-cancel\"\n tabIndex={-1}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"button\"\n onClick={onSubmit}\n data-testid=\"save-enrollment\"\n className=\"plan-enrollment-save ml-4\"\n tabIndex={-1}\n >\n {buttonText}\n </Button>\n </div>\n </>\n\n );\n}\n\nexport default PlanEnrollmentSummary;\n","import * as yup from 'yup';\nimport dayjs from 'dayjs';\nimport { both, isNil } from 'ramda';\n\nimport { isWithinDateRange } from 'shared/utils';\n\nconst requiredText = 'This field is required';\n\nexport const validationSchema = yup\n .object({\n partStart: yup\n .date()\n .typeError('Invalid Date Format')\n .nullable()\n .required(requiredText),\n partEnd: yup\n .date()\n .typeError('Invalid Date Format')\n .when('partStart', (start: string, schema: any) => {\n return schema.test({\n test: (end: string) => !!start && (dayjs(start).isSame(dayjs(end)) || dayjs(start).isBefore(dayjs(end))),\n message: 'End date must be after start date',\n });\n })\n .nullable()\n .required(requiredText),\n payPeriodDeduction: yup\n .number()\n .nullable()\n .min(0, 'Must be a positive number')\n .when('isHra', {\n is: (isHra: boolean) => !isHra,\n then: yup\n .number()\n .min(0, 'Must be a positive number')\n .typeError('Please enter a valid number')\n .required(requiredText),\n }),\n partAnn: yup\n .number()\n .positive('Must be a positive number')\n .typeError('Please enter a valid number')\n .required(requiredText)\n .test({\n name: 'max',\n exclusive: false,\n params: { },\n message: 'Cannot exceed maximum.',\n test: function (value) {\n return (value ?? 0) <= parseFloat(this.parent.allocationMax ?? Number.MAX_SAFE_INTEGER);\n },\n }),\n firstPayDateOfChange: yup\n .string()\n .trim()\n .nullable()\n .when('isHra', {\n is: (isHra: boolean) => !isHra,\n then: yup\n .string()\n .trim()\n .nullable()\n .required(requiredText),\n }),\n yearBeg: yup.string(),\n yearEnd: yup.string(),\n payDates: yup.array(),\n limitedPurpose: yup.boolean(),\n level: yup\n .number()\n .when('limitedPurpose', {\n is: (limitedPurpose: boolean) => limitedPurpose,\n then: yup\n .number()\n .required('Level is required when Limited Purpose is checked.'),\n }),\n })\n // Begin full form tests\n .test(\n 'plan-year-provided',\n 'Error: No plan year can be determined.',\n ({ yearBeg, yearEnd }) => !(isNil(yearBeg) || isNil(yearEnd)),\n )\n // Skip the next validation if either partStart or partEnd\n // is nil because .required() will catch that\n .test(\n 'dates-within-plan-year',\n 'Start and end dates must be within the open plan year.',\n ({\n yearBeg, yearEnd, partStart, partEnd,\n }) => isNil(partStart) || isNil(partEnd) || both(\n isWithinDateRange(yearBeg as string, yearEnd as string, partStart),\n isWithinDateRange(yearBeg as string, yearEnd as string, partEnd),\n )(),\n );\n","import React from 'react';\nimport FormControl from '@mui/material/FormControl';\nimport InputLabel from '@mui/material/InputLabel';\nimport Select from '@mui/material/Select';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport LoopIcon from '@mui/icons-material/Loop';\n\nimport { SelectOption, SelectChangeEvent } from 'shared/types/form.types';\n\ninterface PayDateSelectProps {\n payDates: SelectOption[];\n loading: boolean;\n selected: string;\n error?: boolean;\n onPayDateSelected: (payDate: string) => void;\n name?: string;\n}\n\nfunction PayDateSelect({\n payDates,\n loading,\n selected,\n error,\n onPayDateSelected,\n}: PayDateSelectProps): React.ReactElement {\n function handleChange({ target: { value: val } }: SelectChangeEvent) {\n onPayDateSelected(val as string);\n }\n\n function loadingIcon() {\n return (\n <div className=\"w-full plan-enrollment-pay-dates-loading\">\n <LoopIcon className=\"animate-spin\" /> Loading pay dates...\n </div>\n );\n }\n\n function selectField() {\n return (\n <FormControl variant=\"outlined\" className=\"w-full plan-enrollment-pay-date-select\">\n <InputLabel>First Pay Date Of Change</InputLabel>\n <Select\n label=\"First Pay Date of Change\"\n onChange={handleChange as any}\n value={selected}\n native\n fullWidth\n error={error}\n >\n <option value=\"\" />\n {payDates.map((pd) => <option value={pd.value} key={pd.value}>{pd.label}</option>)}\n </Select>\n {\n error\n ? <FormHelperText disabled error>Please select a pay date.</FormHelperText>\n : (\n <FormHelperText>\n Pay date in which the employee will have the amount entered in the \"Pay Period Deduction\" field first\n deducted from their paycheck. If this date is not listed, please contact your Account Manager.\n </FormHelperText>\n )\n }\n </FormControl>\n );\n }\n\n return loading ? loadingIcon() : selectField();\n}\n\nexport default PayDateSelect;\n","import React, { useRef } from 'react';\nimport Checkbox from '@mui/material/Checkbox';\nimport Select from '@mui/material/Select';\nimport FormControl from '@mui/material/FormControl';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport FormGroup from '@mui/material/FormGroup';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport InputLabel from '@mui/material/InputLabel';\n\ninterface LFSAFieldsProps {\n showLFSA: boolean;\n form: any;\n floresAdministered: boolean;\n}\n\nfunction LFSAFields({ showLFSA, form, floresAdministered }: LFSAFieldsProps): React.ReactElement {\n const labelRef = useRef<HTMLLabelElement>(null);\n\n function handleLevelChange({ target: { value: val } }: React.ChangeEvent<{ name?: string; value: unknown; }>) {\n form.setFieldValue('level', val);\n }\n\n function limitedPurposeCheck() {\n return (\n <FormGroup>\n <FormControlLabel\n control={\n <Checkbox\n name=\"limitedPurpose\"\n color=\"primary\"\n value\n checked={form.values.limitedPurpose}\n onChange={form.handleChange}\n className=\"plan-enrollment-limited-purpose-checkbox\"\n />\n }\n label=\"Limited Purpose\"\n labelPlacement=\"end\"\n />\n <FormHelperText>Select if employee is also enrolled in HSA</FormHelperText>\n </FormGroup>\n );\n }\n\n function levelSelect() {\n return (\n <FormControl\n variant=\"outlined\"\n className={`${!form.values.limitedPurpose ? 'invisible' : ''} plan-enrollment-plan-level-select`}\n >\n <InputLabel ref={labelRef}>Level</InputLabel>\n <Select\n label=\"Level\"\n native\n fullWidth\n name=\"level\"\n value={form.values.level ?? ''}\n error={!!form.touched.level && !!form.errors.level}\n onChange={handleLevelChange as any}\n >\n <option />\n <option value=\"10\">Employee Only</option>\n <option value=\"11\">Family</option>\n </Select>\n {\n !!form.touched.level && !!form.errors.level\n ? <FormHelperText disabled error>{form.errors.level}</FormHelperText>\n : <></>\n }\n </FormControl>\n );\n }\n\n if (!showLFSA) {\n return <></>;\n }\n\n if (floresAdministered) {\n return (\n <p>\n Please note the Health Care FSA will be a Limited Purpose\n FSA if this participant is also enrolled in the HSA.\n </p>\n );\n }\n\n return (\n <>\n {limitedPurposeCheck()}\n {levelSelect()}\n </>\n );\n}\n\nexport default LFSAFields;\n","import { useState, useRef, useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { compose, tap, always } from 'ramda';\nimport dayjs from 'dayjs';\n\nimport request from 'shared/api-request';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { SelectOption } from 'shared/types/form.types';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport store from 'store';\n\nfunction payDateQueryString(startDate?: string, endDate?: string) {\n const start = startDate ? dayjs(startDate) : dayjs('');\n const end = endDate ? dayjs(endDate) : dayjs('');\n\n if (start.isValid() && end.isValid()) {\n return `?startDate=${start.format('YYYY-MM-DD')}&endDate=${end.format('YYYY-MM-DD')}`;\n } else if (start.isValid()) {\n return `?startDate=${start.format('YYYY-MM-DD')}`;\n } else if (end.isValid()) {\n return `?endDate=${end.format('YYYY-MM-DD')}`;\n }\n\n return '';\n}\n\nexport function usePayDates(payFreq: string, startDate?: string, endDate?: string) {\n const dispatch = useDispatch<typeof store.dispatch>();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n\n const [ payDates, setPayDates ] = useState<SelectOption[] | null>(null);\n\n const { current: setDefault } = useRef(compose(setPayDates, always([])));\n const { current: handleError } = useRef(compose(\n tap(setDefault),\n dispatch,\n addHttpErrorNotification,\n ));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n if (payFreq.length > 0) {\n const uri = `/api/companies/${compid}/pay-dates/${payFreq}`;\n const qs = payDateQueryString(startDate, endDate);\n request<string[]>(uri + qs)\n .then((dates) => {\n if (mountedRef.current) {\n const options = (dates ?? []).map((date) => ({\n value: dayjs(date).format('YYYY-MM-DD'),\n label: dayjs(date).format('M/D/YYYY'),\n }));\n\n setPayDates(options);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n } else {\n setPayDates([]);\n }\n\n return () => {\n mountedRef.current = false;\n };\n }, [ handleError, compid, payFreq, startDate, endDate ]);\n\n return payDates;\n}\n","import React, { useState } from 'react';\nimport dayjs from 'dayjs';\nimport { useFormik } from 'formik';\nimport Button from '@mui/material/Button';\nimport TextField from '@mui/material/TextField';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport FormControl from '@mui/material/FormControl';\nimport { pick, pipe, tap, isNil } from 'ramda';\nimport { useSelector } from 'react-redux';\n\nimport { MRADetails, OpenPlan, PlanEnrollmentFormProps, PlanLevel } from 'plan-enrollment/plan-enrollment.types';\nimport { handleDateChange } from 'shared/form-helpers';\nimport { currencyFormatter } from 'shared/utils';\nimport { validationSchema } from './plan-enrollment-mra.validators';\nimport { selectParticipant } from 'participant-search/participant.slice';\nimport PayDateSelect from './PayDateSelect';\nimport LFSAFields from './LFSAFields';\nimport { usePayDates } from 'shared/custom-hooks/usePayDates';\nimport FormErrorText from '../../components/shared/FormErrorText';\nimport AdapterDayJS from '@mui/lab/AdapterDayjs';\nimport LocalizationProvider from '@mui/lab/LocalizationProvider';\nimport DatePicker from '@mui/lab/DatePicker';\n\ninterface MRAForm extends Partial<MRADetails> {\n payDates?: string[];\n yearBeg: string;\n yearEnd: string;\n limitedPurpose?: boolean;\n level?: string;\n isHra?: boolean;\n allocationMax? : number | null;\n}\n\ninterface PlanEnrollmentMraProps extends PlanEnrollmentFormProps {\n plan: OpenPlan;\n lfsa: boolean;\n partStart: string; // begin date\n partEnd: string; // end date\n partAnn: number; // annual allocation\n firstPayDateOfChange: string;\n payPeriodDeduction: number;\n totalContributions?: number;\n showLFSA?: boolean;\n planLevel?: PlanLevel;\n}\n\nfunction getAllocationMax(plan?: OpenPlan) {\n if (!plan) {\n return null;\n }\n\n if (plan.plccode === 'M') {\n return plan.medmax;\n }\n\n if (plan.plccode === 'D') {\n return plan.depmax;\n }\n\n return null;\n}\n\nfunction PlanEnrollmentMra({\n plan,\n lfsa = false,\n partStart,\n partEnd,\n partAnn,\n firstPayDateOfChange,\n payPeriodDeduction,\n totalContributions = 0,\n showLFSA = false,\n planLevel = 10,\n isEdit = false,\n onNextStep,\n onCancel,\n}: PlanEnrollmentMraProps): React.ReactElement {\n const form = useFormik<MRAForm>({\n initialValues: {\n payDates: [],\n yearBeg: plan.yearbeg,\n yearEnd: plan.yearend,\n partStart,\n partEnd,\n firstPayDateOfChange,\n partAnn: partAnn || undefined, // so the initial 0 value isn't populated\n payPeriodDeduction,\n level: showLFSA ? planLevel.toString() : undefined,\n // let the user select if not flores administered, and it doesn't exist otherwise\n limitedPurpose: showLFSA ? lfsa : undefined,\n isHra: plan.plccode === 'H',\n allocationMax: getAllocationMax(plan),\n },\n validationSchema,\n onSubmit: async (values: MRAForm) => {\n try {\n validationSchema.validateSync(\n {\n ...values,\n },\n {\n abortEarly: false,\n stripUnknown: false,\n },\n );\n\n if (values.limitedPurpose) {\n onNextStep({\n type: 'MRA',\n lfsa: true,\n planLevel: parseInt(values.level ?? '10') as PlanLevel,\n partStart: values.partStart ?? '',\n partEnd: values.partEnd ?? '',\n partAnn: values.partAnn ?? 0,\n firstPayDateOfChange: values.firstPayDateOfChange ?? '',\n payPeriodDeduction: values.payPeriodDeduction ?? 0,\n });\n } else {\n onNextStep({\n type: 'MRA',\n lfsa: false,\n partStart: values.partStart ?? '',\n partEnd: values.partEnd ?? '',\n partAnn: values.partAnn ?? 0,\n firstPayDateOfChange: values.firstPayDateOfChange ?? '',\n payPeriodDeduction: values.payPeriodDeduction ?? 0,\n });\n }\n } catch (err: any) {\n setWholeFormErrors(err.errors);\n }\n },\n });\n\n const [ wholeFormErrors, setWholeFormErrors ] = useState<string[]>([]);\n const { payfreq, payfreq2 } = useSelector(selectParticipant) ?? { payfreq: '', payfreq2: '' };\n const [ calculatedDeduction, setCalculatedDeduction ] = useState<string>();\n\n const payDates = usePayDates((payfreq || payfreq2 || ''), form.values.partStart, plan.yearend);\n\n function disableNextButton() {\n const fields = [ 'partStart', 'partEnd', 'partAnn' ];\n\n if (!form.values.isHra) {\n fields.push('payPeriodDeduction');\n fields.push('firstPayDateOfChange');\n }\n\n const allFilled = Object\n .values(pick(fields, form.values))\n .map((v) => !isNil(v) ? v.toString() : '')\n .filter((v) => isNil(v) || v === '')\n .length === 0;\n\n return !form.isValid || !allFilled;\n }\n\n function handlePayDateSelected(payDate: string) {\n form.setFieldValue('firstPayDateOfChange', payDate);\n }\n\n function calculateAllocation(\n formikForm: typeof form,\n ) {\n return (event: any) => {\n const {\n partAnn: allocation,\n firstPayDateOfChange: firstDate,\n } = formikForm.values;\n const incomingField = typeof event === 'string' ? 'date' : 'allocation';\n\n if (\n // Make sure the other field is set, and the incoming value\n // meets the type of the other field. Otherwise we won't\n // capture the first change\n (allocation && incomingField === 'date') ||\n (firstDate && incomingField === 'allocation')\n ) {\n // Form.values does not contain the incoming change, so we\n // need to determine which value to take from the form and\n // which to take from the incoming change\n const { dofc, alloc } = incomingField === 'date'\n ? { dofc: event, alloc: allocation }\n : { dofc: firstDate, alloc: event.target.value };\n const index = payDates ? payDates.findIndex(d => d.value === dofc) : -1;\n\n if (index === -1 || !alloc) {\n setCalculatedDeduction('');\n\n return;\n }\n\n const dates = index > -1 ? payDates!.slice(index) : [];\n\n setCalculatedDeduction(\n ((alloc - totalContributions) / dates.length).toFixed(2),\n );\n }\n };\n }\n\n function getAnnualAllocationMax() {\n const allocation = 'Annual Allocation';\n\n if (plan.plccode === 'M') {\n return `${allocation} (Max: ${currencyFormatter.format(plan.medmax)})`;\n } else if (plan.plccode === 'D') {\n return `${allocation} (Max: ${currencyFormatter.format(plan.depmax)})`;\n }\n\n return allocation;\n }\n\n return (\n <>\n <h6>{isEdit && 'Update '}Participant Enrollment</h6>\n <p className=\"my-8\">Enter the employee's enrollment by completing the form below.</p>\n <p className=\"my-8\">{plan.planYearName}</p>\n <form className=\"plan-enrollment-mra-form\">\n <div className=\"w-full flex flex-col space-y-8\">\n {\n wholeFormErrors.length\n ? wholeFormErrors.map((m, i) => (\n <FormHelperText\n className=\"text-base\"\n key={i}\n disabled\n error\n >\n {m}\n </FormHelperText>\n ))\n : <></>\n }\n\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n label=\"Begin Date\"\n inputFormat=\"MM/DD/YYYY\"\n value={form.values.partStart ? dayjs(form.values.partStart, 'YYYY-MM-DD')\n .format('MM/DD/YYYY') : null}\n onChange={handleDateChange('partStart', form)}\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n variant=\"outlined\"\n name=\"partStart\"\n onBlur={form.handleBlur}\n className=\"w-full\"\n {...params}\n error={form.touched.partStart && !!form.errors.partStart}\n helperText={form.touched.partStart && form.errors.partStart}\n />\n )}\n />\n </LocalizationProvider>\n\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n label=\"End Date\"\n inputFormat=\"MM/DD/YYYY\"\n value={form.values.partEnd ? dayjs(form.values.partEnd, 'YYYY-MM-DD')\n .format('MM/DD/YYYY') : null}\n onChange={handleDateChange('partEnd', form)}\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n variant=\"outlined\"\n name=\"partEnd\"\n onBlur={form.handleBlur}\n className=\"w-full\"\n {...params}\n error={form.touched.partEnd && !!form.errors.partEnd}\n helperText={form.touched.partEnd && form.errors.partEnd}\n />\n )}\n />\n </LocalizationProvider>\n\n <FormControl>\n <TextField\n className=\"plan-enrollment-deduction\"\n variant=\"outlined\"\n name=\"payPeriodDeduction\"\n label=\"Pay Period Deduction\"\n type=\"number\"\n value={form.values.payPeriodDeduction ?? ''}\n error={!!form.touched.payPeriodDeduction && !!form.errors.payPeriodDeduction}\n helperText={\n !!calculatedDeduction &&\n `Based on the annual allocation and first pay date of change, the pay period deduction should be $${\n calculatedDeduction\n }`\n }\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n fullWidth\n InputProps={ {\n startAdornment: <InputAdornment position=\"start\">$</InputAdornment>,\n } }\n />\n <FormErrorText show={!!form.errors.payPeriodDeduction} message={form.errors.payPeriodDeduction} />\n </FormControl>\n\n <TextField\n className=\"plan-enrollment-annual-allocation\"\n variant=\"outlined\"\n name=\"partAnn\"\n label={getAnnualAllocationMax()}\n type=\"number\"\n value={form.values.partAnn ?? ''}\n error={!!form.touched.partAnn && !!form.errors.partAnn}\n helperText={form.touched.partAnn && form.errors.partAnn}\n onChange={pipe(\n tap(calculateAllocation(form)),\n form.handleChange as any,\n )}\n onBlur={form.handleBlur}\n fullWidth\n InputProps={ {\n startAdornment: <InputAdornment position=\"start\">$</InputAdornment>,\n } }\n />\n\n <PayDateSelect\n name=\"firstPayDateOfChange\"\n loading={payDates === null}\n payDates={payDates ?? []}\n selected={form.values.firstPayDateOfChange ?? ''}\n error={!!form.touched.firstPayDateOfChange && !!form.errors.firstPayDateOfChange}\n onPayDateSelected={\n pipe(\n tap(calculateAllocation(form)),\n handlePayDateSelected as any,\n )\n }\n />\n\n <LFSAFields showLFSA={showLFSA} floresAdministered={plan.hasFloresHSA && !plan.hasOtherHSA} form={form} />\n\n <div className=\"wizard-buttons\">\n <Button\n color=\"primary\"\n onClick={onCancel}\n className=\"plan-enrollment-cancel\"\n tabIndex={-1}\n >\n Cancel\n </Button>\n <Button\n color=\"primary\"\n variant=\"contained\"\n className=\"ml-8 plan-enrollment-next\"\n onClick={form.submitForm}\n tabIndex={-1}\n disabled={disableNextButton()}\n >\n Next Step\n </Button>\n </div>\n </div>\n </form>\n </>\n );\n}\n\nexport default PlanEnrollmentMra;\n","import * as yup from 'yup';\nimport { isNil } from 'ramda';\nimport dayjs from 'dayjs';\n\nimport { isWithinDateRange } from 'shared/utils';\n\nconst requiredText = 'This field is required';\n\nexport const validationSchema = yup\n .object({\n partStart: yup\n .date()\n .nullable()\n .typeError('Invalid Date Format')\n .required(requiredText),\n partEnd: yup\n .date()\n .typeError('Invalid Date Format')\n .when('partStart', (start: string, schema: any) => {\n return schema.test({\n test: (end: string) => !!start && (dayjs(start).isSame(dayjs(end)) || dayjs(start).isBefore(dayjs(end))),\n message: 'End date must be after start date',\n });\n })\n .nullable()\n .required(requiredText),\n currentContributions: yup.number().min(0),\n additionalContributions: yup.number().min(0),\n yearBeg: yup.string(),\n yearEnd: yup.string(),\n })\n .test(\n 'plan-year-provided',\n 'Error: No plan year can be determined.',\n ({ yearBeg, yearEnd }) => !(isNil(yearBeg) || isNil(yearEnd)),\n )\n // Skip the next validation if partStart\n // is nil because .required() will catch that\n .test(\n 'dates-within-plan-year',\n 'Start and end dates must be within the open plan year.',\n ({\n yearBeg, yearEnd, partStart, partEnd,\n }) => (isNil(partStart) || isNil(partEnd)) || (\n isWithinDateRange(yearBeg!, yearEnd!, partStart)() &&\n isWithinDateRange(yearBeg!, yearEnd!, partEnd)()\n ),\n );\n","import React from 'react';\nimport { useFormikContext } from 'formik';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport Checkbox from '@mui/material/Checkbox';\nimport { isNil } from 'ramda';\nimport { useSelector } from 'react-redux';\nimport {\n selectDependents,\n} from 'store/slices/dependents/dependents.slice';\n\ninterface Props {\n title?: string;\n namespace?: string;\n}\n\nfunction DependentSelect({ namespace, title = '' }: Props) {\n const dependents = useSelector(selectDependents);\n const { handleChange, values } = useFormikContext<any>();\n const applyNamespace = (fieldName: string) => isNil(namespace) ? fieldName : `${namespace}.${fieldName}`;\n\n function content() {\n return (\n <div>\n {title ? <p className=\"text-2xl mb-4\">{title}</p> : <></>}\n <div className=\"flex flex-wrap\">\n {\n dependents.map((d, i) => (\n <FormControlLabel\n className=\"w-1/3 mr-2 mb-2\"\n control={\n <Checkbox\n value={JSON.stringify(d)}\n checked={values[applyNamespace('coveredDependents')].includes(JSON.stringify(d))}\n name={applyNamespace('coveredDependents')}\n color=\"primary\"\n className={`${applyNamespace(d.name)}${i}`}\n onChange={handleChange}\n />\n }\n label={d.name}\n labelPlacement=\"end\"\n key={`${d.name}${i}`}\n />\n ))\n }\n </div>\n </div>\n );\n }\n\n return isNil(dependents) || !dependents.length ? <></> : content();\n}\n\nexport default DependentSelect;\n","import React, { useState } from 'react';\nimport Button from '@mui/material/Button';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport Textfield from '@mui/material/TextField';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport dayjs from 'dayjs';\nimport { FormikProvider, useFormik } from 'formik';\n\nimport { handleDateChange } from 'shared/form-helpers';\nimport { validationSchema } from './plan-enrollment-custom.validators';\nimport { PlanEnrollmentFormProps } from '../plan-enrollment.types';\nimport { Dependent } from 'shared/types/non-plan-year.types';\nimport DependentSelect from 'components/shared/DependentSelect';\nimport AdapterDayJS from '@mui/lab/AdapterDayjs';\nimport LocalizationProvider from '@mui/lab/LocalizationProvider';\nimport DatePicker from '@mui/lab/DatePicker';\n\ninterface Props extends PlanEnrollmentFormProps {\n partStart?: string;\n partEnd?: string;\n yearBeg?: string;\n yearEnd?: string;\n currentContributions?: number;\n additionalContributions?: number;\n selectedDependents?: Dependent[];\n isBalance: boolean;\n planName?: string;\n}\n\nfunction PlanEnrollmentCustom({\n partStart = '',\n partEnd = '',\n yearBeg = '',\n yearEnd = '',\n currentContributions,\n additionalContributions,\n selectedDependents = [],\n isBalance,\n planName,\n isEdit = false,\n onNextStep,\n onCancel,\n}: Props) {\n const form = useFormik({\n validationSchema,\n initialValues: {\n partStart,\n partEnd,\n yearBeg,\n yearEnd,\n currentContributions,\n additionalContributions,\n coveredDependents: selectedDependents.map(d => JSON.stringify(d)),\n },\n onSubmit: (values) => {\n try {\n validationSchema.validateSync(\n values,\n {\n abortEarly: false,\n stripUnknown: false,\n },\n );\n\n onNextStep({\n partStart: values.partStart,\n partEnd: values.partEnd,\n coveredDependents: values.coveredDependents.map(d => JSON.parse(d)),\n additionalContributions: values.additionalContributions ?? 0,\n currentContributions: values.currentContributions ?? 0,\n type: 'CUSTOM',\n });\n } catch (err) {\n setWholeFormErrors(err.errors);\n }\n },\n });\n const [ wholeFormErrors, setWholeFormErrors ] = useState<string[]>([]);\n\n function showPlanName() {\n if (isEdit && planName) {\n return <p className=\"my-8\">{planName}</p>;\n }\n\n return <></>;\n }\n\n return (\n <>\n <h6>{isEdit && 'Update '}Participant Enrollment</h6>\n <p className=\"my-8\">Enter the employee's enrollment by completing the form below.</p>\n {showPlanName()}\n <form className=\"plan-enrollment-custom-form space-y-8\">\n {\n wholeFormErrors.length\n ? wholeFormErrors.map((m, i) => (\n <FormHelperText\n className=\"text-base pb-5\"\n key={i}\n disabled\n error\n >\n {m}\n </FormHelperText>\n ))\n : <></>\n }\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n label=\"Enrollment Begins\"\n inputFormat=\"MM/DD/YYYY\"\n value={form.values.partStart ? dayjs(form.values.partStart, 'YYYY-MM-DD')\n .format('MM/DD/YYYY') : null}\n onChange={handleDateChange('partStart', form)}\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <Textfield\n variant=\"outlined\"\n name=\"partStart\"\n className=\"w-full\"\n {...params}\n error={form.touched.partStart && !!form.errors.partStart}\n helperText={form.touched.partStart && form.errors.partStart}\n />\n )}\n />\n </LocalizationProvider>\n\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n label=\"Enrollment Ends\"\n inputFormat=\"MM/DD/YYYY\"\n value={form.values.partEnd ? dayjs(form.values.partEnd, 'YYYY-MM-DD')\n .format('MM/DD/YYYY') : null}\n onChange={handleDateChange('partEnd', form)}\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <Textfield\n variant=\"outlined\"\n name=\"partEnd\"\n className=\"w-full\"\n {...params}\n error={form.touched.partEnd && !!form.errors.partEnd}\n helperText={form.touched.partEnd && form.errors.partEnd}\n />\n )}\n />\n </LocalizationProvider>\n\n {\n isBalance ? (\n <>\n <Textfield\n className=\"plan-enrollment-current-contributions\"\n variant=\"outlined\"\n name=\"currentContributions\"\n label=\"Total Current Contributions\"\n type=\"number\"\n disabled\n value={form.values.currentContributions ?? ''}\n error={!!form.touched.currentContributions && !!form.errors.currentContributions}\n helperText={form.touched.currentContributions && form.errors.currentContributions}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n fullWidth\n InputProps={ {\n startAdornment: <InputAdornment position=\"start\">$</InputAdornment>,\n } }\n />\n <Textfield\n className=\"plan-enrollment-additional-contributions\"\n variant=\"outlined\"\n name=\"additionalContributions\"\n label=\"Additional Contributions\"\n type=\"number\"\n value={form.values.additionalContributions ?? ''}\n error={!!form.touched.additionalContributions && !!form.errors.additionalContributions}\n helperText={form.touched.additionalContributions && form.errors.additionalContributions}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n fullWidth\n InputProps={ {\n startAdornment: <InputAdornment position=\"start\">$</InputAdornment>,\n } }\n />\n </>\n ) : <></>\n }\n <FormikProvider value={form}>\n <DependentSelect title=\"Covered Dependents\" />\n </FormikProvider>\n <div className=\"wizard-buttons\">\n <Button\n color=\"primary\"\n onClick={onCancel}\n className=\"plan-enrollment-cancel\"\n tabIndex={-1}\n >\n Cancel\n </Button>\n <Button\n color=\"primary\"\n variant=\"contained\"\n className=\"ml-8 plan-enrollment-next\"\n onClick={form.submitForm}\n tabIndex={-1}\n >\n Next Step\n </Button>\n </div>\n </form>\n </>\n );\n}\n\nexport default PlanEnrollmentCustom;\n","import LocalHospitalIcon from '@mui/icons-material/LocalHospital';\nimport DescriptionIcon from '@mui/icons-material/Description';\nimport EventIcon from '@mui/icons-material/Event';\n\nimport { WizardStep } from 'components/shared/WizardStepper';\n\nexport type PEStepSlug = 'plan-type' | 'plan-details' | 'summary';\nconst wizardSteps: Map<PEStepSlug, WizardStep> = new Map([\n [\n 'plan-type',\n {\n icon: LocalHospitalIcon,\n label: 'Plan Type',\n slug: 'plan-type',\n next: 'plan-details',\n },\n ],\n [\n 'plan-details',\n {\n icon: EventIcon,\n label: 'Plan Details',\n slug: 'plan-details',\n next: 'summary',\n prev: 'plan-type',\n },\n ],\n [\n 'summary',\n {\n icon: DescriptionIcon,\n label: 'Summary',\n slug: 'summary',\n prev: 'plan-details',\n },\n ],\n]);\n\nexport default wizardSteps;\n","import React, { useState } from 'react';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { compose, F } from 'ramda';\n\nimport WizardStepper, { WizardStep } from 'components/shared/WizardStepper';\nimport { PlanEnrollmentFormProps, OpenPlan, PlanDetails, MRADetails } from './plan-enrollment.types';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport { selectParticipant } from 'participant-search/participant.slice';\nimport {\n resetPlanEnrollment,\n selectPlanEnrollmentDetails,\n selectPlanEnrollmentPayload,\n selectPlanEnrollmentPlan,\n setPlan,\n setPlanDetails,\n} from './plan-enrollment.slice';\nimport CancelModal from 'components/shared/CancelModal';\nimport Loading from 'components/shared/Loading';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport EnrollmentPlanSelection from './plan-selection/EnrollmentPlanSelection';\nimport PlanEnrollmentHsa from 'plan-enrollment/plan-enrollment-hsa/PlanEnrollmentHsa';\nimport PlanEnrollmentSummary from 'plan-enrollment/plan-enrollment-summary/PlanEnrollmentSummary';\nimport PlanEnrollmentMra from './plan-enrollment-mra/PlanEnrollmentMra';\nimport PlanEnrollmentCustom from './plan-enrollment-custom/PlanEnrollmentCustom';\nimport { useHistoryBlock } from 'shared/custom-hooks/useHistoryBlock';\nimport wizardSteps, { PEStepSlug } from './plan-enrollment-steps';\nimport { saveEnrollment } from 'shared/api/enrollmentApi';\nimport store from 'store';\n\nconst HSA_PLAN_CODE = 'S';\nconst CUSTOM_PLAN_CODE = '0';\n\ninterface PlanEnrollmentWizardProps extends PlanEnrollmentFormProps {\n onSave: () => void;\n}\n\nfunction PlanEnrollmentWizardStep({\n onNextStep,\n onCancel,\n onSave }: PlanEnrollmentWizardProps,\n): React.ReactElement {\n const { stepSlug } = useParams<{stepSlug: PEStepSlug;}>();\n const plan = useSelector(selectPlanEnrollmentPlan);\n const planDetails = useSelector(selectPlanEnrollmentDetails);\n\n function content() {\n switch (stepSlug) {\n case 'plan-type':\n return (\n <EnrollmentPlanSelection\n plan={plan}\n onCancel={onCancel}\n onNextStep={onNextStep}\n />\n );\n case 'plan-details':\n if (planDetails?.type === 'HSA') {\n return (\n <PlanEnrollmentHsa\n yearBeg={plan?.yearbeg}\n yearEnd={plan?.yearend}\n partStart={planDetails.partStart}\n planName={plan?.planYearName}\n onNextStep={onNextStep}\n onCancel={onCancel}\n />\n );\n } else if (planDetails?.type === 'MRA' && plan) {\n return (\n <PlanEnrollmentMra\n {...planDetails}\n showLFSA={plan.hasFloresHSA || plan.hasOtherHSA}\n plan={plan}\n onNextStep={onNextStep}\n onCancel={onCancel}\n />\n );\n } else if (planDetails?.type === 'CUSTOM' && plan) {\n return (\n <PlanEnrollmentCustom\n isBalance={plan.isBalance}\n yearBeg={plan.yearbeg}\n yearEnd={plan.yearend}\n partStart={planDetails.partStart}\n partEnd={planDetails.partEnd}\n currentContributions={planDetails.currentContributions}\n additionalContributions={planDetails.additionalContributions}\n selectedDependents={planDetails.coveredDependents}\n onNextStep={onNextStep}\n onCancel={onCancel}\n />\n );\n }\n\n return <></>;\n case 'summary':\n return (\n <PlanEnrollmentSummary\n // Typecast props as any because props may not be present on the\n // discriminated union type. The component receiving these props\n // has logic to determine if the required properties are present\n {...plan as any}\n {...planDetails as any}\n onCancel={onCancel}\n onSubmit={onSave}\n />\n );\n }\n }\n\n return content();\n}\n\nfunction PlanEnrollmentWizard(): React.ReactElement {\n const [ showModal, setShowModal ] = useState(false);\n const [ saving, setSaving ] = useState(false);\n\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n\n const [ unmountCallback ] = useState(() => compose(dispatch, resetPlanEnrollment));\n const [ blockRegex ] = useState(/^\\/plan-enrollment/);\n const navUnblock = useHistoryBlock(blockRegex, unmountCallback);\n\n const participant = useSelector(selectParticipant);\n const savePayload = useSelector(selectPlanEnrollmentPayload);\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const planDetails = useSelector(selectPlanEnrollmentDetails);\n\n const {\n stepSlug: activeStepSlug,\n employeeNumber: empno,\n } = useParams<{ stepSlug: PEStepSlug; employeeNumber: string; }>();\n\n const employeeNumber = empno || participant?.empno;\n\n function handleSave() {\n setSaving(true);\n saveEnrollment(compid, savePayload)\n .then(() => {\n setSaving(false);\n goToParticipantOverview();\n })\n .catch((err) => {\n setSaving(false);\n compose(dispatch, addHttpErrorNotification)(err);\n });\n }\n\n function handleStepClick(clickedStep: WizardStep) {\n return history.push(`/plan-enrollment/${employeeNumber}/${clickedStep.slug}`);\n }\n\n function onNextStep(data: OpenPlan | PlanDetails) {\n if (activeStepSlug === 'plan-type') {\n const plan = data as OpenPlan;\n dispatch(setPlan(plan));\n\n // set default details details before going to the next step.\n if (plan.plccode === HSA_PLAN_CODE) {\n dispatch(setPlanDetails({ type: 'HSA', partStart: '' }));\n } else if (plan.plccode === CUSTOM_PLAN_CODE) {\n dispatch(setPlanDetails({\n type: 'CUSTOM',\n partStart: '',\n partEnd: '',\n currentContributions: 0,\n additionalContributions: 0,\n coveredDependents: [],\n }));\n } else {\n const pd = { lfsa: false };\n dispatch(setPlanDetails({\n type: 'MRA',\n partStart: '',\n partEnd: '',\n partAnn: 0,\n firstPayDateOfChange: '',\n payPeriodDeduction: 0,\n lfsa: ((planDetails || pd) as MRADetails).lfsa,\n }));\n }\n } else if (activeStepSlug === 'plan-details') {\n dispatch(setPlanDetails(data as PlanDetails));\n }\n\n const activeStep = wizardSteps.get(activeStepSlug);\n history.push(`/plan-enrollment/${employeeNumber}/${activeStep?.next}`);\n }\n\n function onWizardCancel() {\n if (activeStepSlug !== 'plan-type') {\n setShowModal(true);\n } else {\n goToParticipantOverview();\n }\n }\n\n function goToParticipantOverview() {\n if (showModal) {\n setShowModal(false);\n }\n\n if (navUnblock) {\n navUnblock();\n }\n\n dispatch(resetPlanEnrollment());\n history.push(`/participant-overview/${employeeNumber}/plan-enrollment`);\n }\n\n return (\n <>\n <PageContentPaper className=\"mt-4 mb-8\">\n <div className=\"mb-8\">\n <WizardStepper\n steps={wizardSteps}\n allowClick\n onChange={handleStepClick}\n />\n </div>\n <div className=\"px-8\">\n <PlanEnrollmentWizardStep\n onNextStep={onNextStep}\n onCancel={onWizardCancel}\n onSave={handleSave}\n />\n </div>\n </PageContentPaper>\n <CancelModal\n isOpen={showModal}\n onCancel={goToParticipantOverview}\n onClose={compose(setShowModal, F)}\n />\n {saving ? <Loading text=\"Saving Plan Enrollment\" /> : <></>}\n </>\n );\n}\n\nexport default PlanEnrollmentWizard;\n","import { isEmpty } from 'ramda';\n\nimport request from 'shared/api-request';\nimport { CRLType } from 'shared/types/non-plan-year.types';\n\nexport function printQualifyingEvent(companyId: number, type: CRLType, unqid: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot print qualifying event for invalid company.'));\n }\n\n if (unqid <= 0) {\n return Promise.reject(new Error('Cannot print qualifying event for invalid ID.'));\n }\n\n if (isEmpty(type)) {\n return Promise.reject(new Error('Cannot print qualifying event for invalid CRL Type.'));\n }\n\n return request<number>(\n `/api/companies/${companyId}/qualifying-events/${type !== 'cobra' ? 'r' : 'c'}/print/${unqid}`,\n );\n}\n\n","import React, { useState } from 'react';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport Button from '@mui/material/Button';\nimport EditIcon from '@mui/icons-material/Edit';\nimport GetAppIcon from '@mui/icons-material/GetApp';\nimport DeleteIcon from '@mui/icons-material/DeleteOutlineOutlined';\nimport Avatar from '@mui/material/Avatar';\nimport dayjs from 'dayjs';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport { compose, curry, T, F, hasPath, always, ifElse, pipe, andThen, otherwise, thunkify } from 'ramda';\n\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { CobraInitialNotice, CobraQENotice, Notice } from './notice-list.types';\nimport request from 'shared/api-request';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { useParticipantService } from 'shared/custom-hooks/useParticipantService';\nimport { loadParticipant, setSelectedParticipant } from 'participant-search/participant.slice';\nimport Loading from 'components/shared/Loading';\nimport { colorFromLetters } from 'components/shared/avatar-color-palette';\nimport { printQualifyingEvent } from 'shared/api/qualifyingEventsApi';\nimport store from 'store';\n\ninterface NoticeTableRowProps {\n notice: Notice;\n dateFormat?: string;\n onNoticeDeleted: (p: Notice) => void;\n}\n\nfunction NoticeTableRow({\n notice,\n dateFormat = 'MM/DD/YYYY',\n onNoticeDeleted,\n}: NoticeTableRowProps): React.ReactElement {\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n const { getParticipant } = useParticipantService();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n\n const [ deleting, setDeleting ] = useState(false);\n const [ printing, setPrinting ] = useState(false);\n const [ loadingParticipant , setLoadingParticipant ] = useState(false);\n const startLoadingParticipant = compose(setLoadingParticipant, T);\n const doneLoadingParticipant = compose(setLoadingParticipant, F);\n\n const handleError = useErrorNotifier();\n\n function handleEditClick() {\n if (notice.hasOwnProperty('qualid')) {\n const n = notice as CobraQENotice;\n startLoadingParticipant();\n getParticipant(n.payrollId)\n .then((p) => {\n dispatch(setSelectedParticipant(p));\n history.push(`/update-cobra-qe/${n.qualid}`);\n })\n .catch(handleError)\n .finally(doneLoadingParticipant);\n }\n }\n\n async function handleDeleteClick() {\n if (window.confirm('Are you sure you want to delete this notice?')) {\n setDeleting(true);\n\n let uri = `/api/companies/${compid}`;\n\n if (notice.hasOwnProperty('c_initid')) {\n const n = (notice as CobraInitialNotice);\n uri =\n `${uri}/initial-notices/${n.employeeNumber}/${n.c_initid}`;\n } else {\n const n = (notice as CobraQENotice);\n uri =\n `${uri}/cobra-qe/${n.employeeNumber}/${n.qualid}`;\n }\n\n try {\n await request(uri, { method: 'DELETE' });\n setDeleting(false);\n onNoticeDeleted(notice);\n } catch (err) {\n setDeleting(false);\n handleError(err);\n }\n }\n }\n\n function avatarColor(): string {\n return colorFromLetters(notice.firstName + notice.lastName);\n }\n\n function noticeInitials(): string {\n return notice.firstName.charAt(0).toUpperCase() + notice.lastName.charAt(0).toUpperCase();\n }\n\n function formatDate(date?: string): string {\n return date ? dayjs(date).format(dateFormat) : '';\n }\n\n function rowClasses(): string {\n const base = 'transition-opacity duration-100 ease-linear';\n\n return deleting ? `${base} opacity-50` : base;\n }\n\n function columns(): React.ReactElement {\n if (notice.hasOwnProperty('qualid')) {\n // pending qualifying event notice\n const qeNotice = notice as CobraQENotice;\n\n return (\n <>\n <TableCell className=\"text-sm\">{formatDate(qeNotice.qualdate)}</TableCell>\n <TableCell className=\"text-sm\">{qeNotice.eventType}</TableCell>\n <TableCell className=\"text-sm\">{formatDate(qeNotice.covstart)}</TableCell>\n <TableCell className=\"text-sm\">{formatDate(qeNotice.paidthru)}</TableCell>\n </>\n );\n }\n\n // pending initial notice\n const initNotice = notice as CobraInitialNotice;\n\n return <TableCell className=\"text-sm\">{initNotice.destinationName}</TableCell>;\n }\n\n function updateButton() {\n if (notice.hasOwnProperty('qualid')) {\n return (\n <>\n <Button\n type=\"button\"\n className=\"qe-notice-edit text-sm\"\n tabIndex={-1}\n onClick={handleEditClick}\n >\n <EditIcon className=\"text-sm\" /> Edit\n </Button>\n </>\n );\n }\n\n return <></>;\n }\n\n function printButton() {\n return ifElse(\n hasPath([ 'qualid' ]),\n always(\n <Button\n onClick={\n pipe(\n compose(setPrinting, T),\n thunkify(printQualifyingEvent)(compid as number, 'cobra', notice.unqid),\n andThen(compose(setPrinting, F)),\n otherwise(pipe(\n handleError,\n compose(setPrinting, F),\n )),\n )\n }\n disabled={printing}\n className=\"text-sm print-notice\"\n >\n <GetAppIcon className=\"text-sm\" /> Print\n </Button>,\n ),\n always(<></>),\n )(notice);\n }\n\n return (\n <TableRow className={rowClasses()}>\n <TableCell>\n <Avatar className={`text-white text-sm ${avatarColor()}`}>\n {noticeInitials()}\n </Avatar>\n </TableCell>\n <TableCell className=\"text-sm\">{notice.firstName}</TableCell>\n <TableCell className=\"text-sm\">{notice.lastName}</TableCell>\n <TableCell className=\"text-sm\">{notice.ssn}</TableCell>\n <TableCell\n className=\"text-sm cursor-pointer\"\n onClick={\n pipe(\n compose(dispatch, curry(loadParticipant)(compid as number), always(notice.ssn)),\n compose(history.push, always(`/participant-overview/${notice.employeeNumber}/general-info`)),\n )\n }\n >\n {notice.employeeNumber}\n </TableCell>\n <TableCell className=\"text-sm\">{formatDate(notice.dateToSend)}</TableCell>\n {columns()}\n <TableCell>\n {updateButton()}\n <Button\n onClick={handleDeleteClick}\n data-testid={`${notice.firstName}-delete-notice`}\n className=\"text-sm delete-notice\"\n disabled={deleting}\n >\n <DeleteIcon className=\"text-sm\" /> Delete\n </Button>\n {printButton()}\n {loadingParticipant && <Loading text=\"Loading...\" />}\n </TableCell>\n </TableRow>\n );\n}\n\nexport default NoticeTableRow;\n","import { useSelector } from 'react-redux';\n\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { getParticipant as _getParticipant } from '../api/participantApi';\n\nexport function useParticipantService() {\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n function getParticipant(payrollId: string) {\n try {\n return _getParticipant(compid, payrollId);\n } catch (err) {\n return Promise.reject(err);\n }\n }\n\n return {\n getParticipant,\n };\n}\n","import React, { useState, useEffect } from 'react';\nimport Table from '@mui/material/Table';\nimport TableCell from '@mui/material/TableCell';\nimport TableRow from '@mui/material/TableRow';\nimport TableHead from '@mui/material/TableHead';\nimport TableBody from '@mui/material/TableBody';\nimport { useSelector } from 'react-redux';\n\nimport NoticeTableRow from './NoticeTableRow';\nimport { Notice, CobraInitialNotice, CobraQENotice } from './notice-list.types';\nimport SearchInput from 'components/shared/SearchInput';\nimport { selectSelectedCompany } from 'companies/companies.slice';\n\ninterface NoticesTableProps {\n notices: Notice[];\n}\n\nfunction noticeCompare(notice: Notice): (n: Notice) => boolean {\n return (n: Notice): boolean => {\n return n.employeeNumber === notice.employeeNumber &&\n (\n (\n notice.hasOwnProperty('c_initid')\n ? (notice as CobraInitialNotice).c_initid === (n as CobraInitialNotice).c_initid\n : true\n ) ||\n\n (\n notice.hasOwnProperty('qualid')\n ? (notice as CobraQENotice).qualid === (n as CobraQENotice).qualid\n : true\n )\n );\n };\n}\n\nfunction noticeFilter(search: string): (n: Notice) => boolean {\n const comp = search.toLocaleLowerCase();\n\n return (n: Notice): boolean => {\n return n.firstName.toLocaleLowerCase().includes(comp) ||\n n.lastName.toLocaleLowerCase().includes(comp) ||\n n.employeeNumber.includes(comp) ||\n n.ssn.includes(comp);\n };\n}\n\nfunction NoticesTable({ notices }: NoticesTableProps): React.ReactElement {\n const [ allNotices, setAllNotices ] = useState<Notice[ ]>(notices);\n const [ filteredNotices, setFilteredNotices ] = useState<Notice[ ]>(notices);\n const company = useSelector(selectSelectedCompany);\n useEffect(() => {\n setAllNotices(notices);\n setFilteredNotices(notices);\n }, [ notices ]);\n\n function handleDelete(notice: Notice) {\n let foundIdx = allNotices.findIndex(noticeCompare(notice));\n\n if (foundIdx >= 0) {\n setAllNotices([\n ...allNotices.slice(0, foundIdx),\n ...allNotices.slice(foundIdx + 1),\n ]);\n }\n\n foundIdx = filteredNotices.findIndex(noticeCompare(notice));\n\n if (foundIdx >= 0) {\n setFilteredNotices([\n ...filteredNotices.slice(0, foundIdx),\n ...filteredNotices.slice(foundIdx + 1),\n ]);\n }\n }\n\n function handleSearchChange(search: string) {\n if (!search) {\n setFilteredNotices(allNotices);\n } else {\n setFilteredNotices(allNotices.filter(noticeFilter(search)));\n }\n }\n\n function header(): React.ReactElement {\n if (notices.length < 1) {\n return (\n <TableRow>\n <TableCell ><p className=\"italic\">No notices are available</p>\n </TableCell>\n </TableRow>\n );\n }\n\n if (notices[0].hasOwnProperty('qualid')) {\n // pending qualifying event notices\n return (\n <TableRow>\n <TableCell />\n <TableCell className=\"text-sm\">First Name</TableCell>\n <TableCell className=\"text-sm\">Last Name</TableCell>\n <TableCell className=\"text-sm\">ID#</TableCell>\n <TableCell className=\"text-sm\">PID</TableCell>\n <TableCell className=\"text-sm\">Date to Send</TableCell>\n <TableCell className=\"text-sm\">Event Date</TableCell>\n <TableCell className=\"text-sm\">Event Type</TableCell>\n <TableCell className=\"text-sm\">Coverage Start</TableCell>\n <TableCell className=\"text-sm\">Paid Through</TableCell>\n <TableCell className=\"text-sm\">Actions</TableCell>\n </TableRow>\n );\n }\n\n // pending initial notices\n return (\n <TableRow>\n <TableCell />\n <TableCell className=\"text-sm\">First Name</TableCell>\n <TableCell className=\"text-sm\">Last Name</TableCell>\n <TableCell className=\"text-sm\">ID#</TableCell>\n <TableCell className=\"text-sm\">PID</TableCell>\n <TableCell className=\"text-sm\">Date to Send</TableCell>\n <TableCell className=\"text-sm\">Notice Recipient</TableCell>\n <TableCell className=\"text-sm\">Actions</TableCell>\n </TableRow>\n );\n }\n\n function body(): React.ReactElement[] {\n return filteredNotices.map((p) => (\n <NoticeTableRow\n notice={p}\n onNoticeDeleted={handleDelete}\n key={p.unqid}\n />\n ));\n }\n var placeHolderText = `Search Participant by PID/${!company || !company.iddesc ? 'SSN' : company.iddesc}/Name`;\n\n return (\n <div className=\"w-full\">\n <div className=\"flex my-4 pl-2\">\n <div className=\"w-1/3\">\n <SearchInput size=\"small\" placeholder={placeHolderText} onChange={handleSearchChange} />\n </div>\n <h5 className=\"leading-10 pl-4\">Pending Total: { notices.length }</h5>\n </div>\n <Table className=\"w-full\">\n <TableHead>\n {header()}\n </TableHead>\n <TableBody>\n {body()}\n </TableBody>\n </Table>\n </div>\n );\n}\n\nexport default NoticesTable;\n","import React, { useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport IconButton from '@mui/material/IconButton';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { useHistory } from 'react-router-dom';\n\nimport Loading from 'components/shared/Loading';\nimport NoticesTable from 'components/shared/notice-list/NoticesTable';\nimport { loadPendingQeNotices, selectPendingQeNotices } from 'cobra-pending-qe/cobra-pending-qe-notices.slice';\nimport store from 'store';\n\nfunction CobraPendingQENotices(): React.ReactElement {\n const notices = useSelector(selectPendingQeNotices);\n const dispatch = useDispatch<typeof store.dispatch>();\n const history = useHistory();\n\n useEffect(() => {\n dispatch(loadPendingQeNotices());\n }, [ dispatch ]);\n\n function handleBackClick() {\n history.push('/dashboard');\n }\n\n return (\n <div className=\"flex flex-col m-4 w-full\">\n <h5 className=\"mb-4\">\n <IconButton onClick={handleBackClick} size=\"large\"><ArrowBackIcon /></IconButton>\n Pending COBRA Qualifying Event Notices\n </h5>\n <PageContentPaper className=\"flex flex-col\">\n {\n notices === null\n ? <Loading text=\"Loading notices…\" />\n : <NoticesTable notices={notices} />\n }\n </PageContentPaper>\n </div>\n );\n}\n\nexport default CobraPendingQENotices;\n","import React, { useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport IconButton from '@mui/material/IconButton';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { useHistory } from 'react-router-dom';\n\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport Loading from 'components/shared/Loading';\nimport NoticesTable from 'components/shared/notice-list/NoticesTable';\nimport { loadPendingInitialNotices, selectPendingInitialNotices } from './cobra-pending-initial-notices.slice';\nimport store from 'store';\n\nfunction CobraPendingInitialNotices(): React.ReactElement {\n const dispatch = useDispatch<typeof store.dispatch>();\n const history = useHistory();\n const notices = useSelector(selectPendingInitialNotices);\n\n useEffect(() => {\n dispatch(loadPendingInitialNotices());\n }, [ dispatch ]);\n\n function handleBackClick() {\n history.push('/dashboard');\n }\n\n return (\n <div className=\"flex flex-col m-4 w-full\">\n <h5 className=\"mb-4\">\n <IconButton onClick={handleBackClick} size=\"large\"><ArrowBackIcon /></IconButton>\n Pending COBRA Initial Notices\n </h5>\n <PageContentPaper className=\"flex flex-col\">\n {\n notices === null\n ? <Loading text=\"Loading notices…\" />\n : <NoticesTable notices={notices} />\n }\n </PageContentPaper>\n </div>\n );\n}\n\nexport default CobraPendingInitialNotices;\n","import ChangePasswordIcon from '@mui/icons-material/VpnKey';\nimport ContactsIcon from '@mui/icons-material/Contacts';\nimport LockIcon from '@mui/icons-material/Lock';\nimport PermContactCalendarIcon from '@mui/icons-material/PermContactCalendar';\n\nimport { NavConfig } from 'navigation/navigation.types';\n\nconst settingsNav: NavConfig[] = [\n {\n path: '/manage-settings/contact-info',\n name: 'Contact Info',\n icon: PermContactCalendarIcon,\n },\n {\n path: '/manage-settings/change-password',\n name: 'Change Password',\n icon: ChangePasswordIcon,\n },\n {\n path: '/manage-settings/multi-factor',\n name: '2-Step Verification',\n icon: LockIcon,\n },\n {\n path: '/manage-settings/manage-users',\n name: 'Manage Users',\n icon: ContactsIcon,\n },\n];\n\nexport default settingsNav;\n","import React from 'react';\n\nimport Navigation from 'navigation/Navigation';\nimport settingsNavConfig from './settings-nav-config';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport { makeNav } from 'components/layout/make-nav';\nimport { hasPermission } from 'authorization/authorization';\nimport { NavConfig } from 'navigation/navigation.types';\n\nfunction navConfigPredicate(item: NavConfig) {\n if (item.name === 'Manage Users') {\n return hasPermission('Users');\n }\n\n return true;\n}\n\nconst filter = makeNav(navConfigPredicate);\n\nfunction SettingsSidebar(): React.ReactElement {\n return (\n <PageContentPaper data-testid=\"settingsSidebarDrawer\">\n <Navigation navConfig={filter(settingsNavConfig)} showLegacy={false} />\n </PageContentPaper>\n );\n}\n\nexport default SettingsSidebar;\n","import * as yup from 'yup';\n\nconst requiredText = 'This field is required';\n\nexport const validationSchema = yup.object({\n confname: yup\n .string()\n .nullable()\n .trim()\n .max(15, 'Must be 15 characters or less')\n .required(requiredText),\n conlname: yup\n .string()\n .nullable()\n .trim()\n .max(20, 'Must be 20 characters or less')\n .required(requiredText),\n conaddr1: yup\n .string()\n .nullable()\n .trim()\n .max(30, 'Must be 30 characters or less')\n .required(requiredText),\n conaddr2: yup\n .string()\n .nullable()\n .max(30, 'Must be 30 characters or less'),\n concity: yup\n .string()\n .nullable()\n .trim()\n .max(20, 'Must be 20 characters or less')\n .required(requiredText),\n constate: yup\n .string()\n .trim()\n .required(requiredText),\n conzip: yup\n .string()\n .nullable()\n .trim()\n .max(10, 'Must be 10 characters or less')\n .required(requiredText),\n conphone: yup\n .string()\n .nullable()\n .trim()\n .min(10, 'Must be at least 10 characters')\n .max(17, 'Must be 17 characters or less')\n .test('digits', 'Must be at least 10 digits',\n (phone) => !phone || phone.replace(/[A-Za-z$-.]/g, '').length >= 10)\n .required(requiredText),\n confax: yup\n .string()\n .nullable()\n .min(10, 'Must be at least 10 characters')\n .max(17, 'Must be 17 characters or less'),\n conemail: yup\n .string()\n .nullable()\n .trim()\n .max(60, 'Must be 60 characters or less')\n .matches(/.+@.+/, 'Must be a valid email address')\n .required(requiredText),\n});\n","import React, { useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport Typography from '@mui/material/Typography';\nimport TextField from '@mui/material/TextField';\nimport Button from '@mui/material/Button';\nimport Divider from '@mui/material/Divider';\nimport { useFormik } from 'formik';\n\nimport { getUser, setUser } from 'authentication/authentication';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport Loading from 'components/shared/Loading';\nimport StateSelect from 'components/shared/StateSelect';\nimport { saveContactInfo } from 'shared/api/contactInfoApi';\nimport { useErrorNotifier, useSuccessNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { Contact } from './contact.types';\nimport { validationSchema } from './contact-info.validators';\nimport { loadContactInfo, selectContactInfo } from 'manage-settings/contact-info/contact-info.slice';\nimport store from 'store';\n\nconst defaultContact = {\n confname: '',\n conlname: '',\n conaddr1: '',\n conaddr2: '',\n concity: '',\n constate: '',\n conzip: '',\n conphone: '',\n confax: '',\n conemail: '',\n} as Contact;\n\nfunction ContactInfo(): React.ReactElement {\n const dispatch = useDispatch<typeof store.dispatch>();\n const handleError = useErrorNotifier();\n const saveSuccess = useSuccessNotifier('Update successful');\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const contactInfo = useSelector(selectContactInfo);\n\n const form = useFormik<Partial<Contact>>({\n enableReinitialize: true,\n initialValues: {\n ...defaultContact,\n ...contactInfo,\n },\n validationSchema: validationSchema,\n onSubmit,\n });\n\n useEffect(() => {\n const user = getUser();\n dispatch(loadContactInfo(compid, user!.conuserid));\n }, [ dispatch, compid ]);\n\n function handleStateChange(s: string) {\n form.setFieldValue('constate', s);\n }\n\n function onSubmit(values: any) {\n const user = getUser();\n saveContactInfo(compid, { ...values, compid })\n .then(() => {\n if (user) {\n user.username = contactInfo!.conemail;\n setUser(user);\n }\n\n saveSuccess();\n })\n .catch(handleError);\n }\n\n function contactInfoCreation(): React.ReactElement {\n return (!contactInfo ? <Loading text=\"Loading contact details...\" /> : contactInfoHTML());\n }\n\n function contactInfoHTML(): React.ReactElement {\n return (\n <form data-testid=\"ci-form\" onSubmit={form.handleSubmit} >\n <PageContentPaper>\n <Typography variant=\"h4\">Contact Info</Typography>\n <div className=\"flex m-4\">\n <TextField variant=\"outlined\" label=\"First name\" name=\"confname\"\n className=\"m-4\"\n value={form.values.confname ?? ''}\n error={form.touched.confname && !!form.errors.confname}\n helperText={form.touched.confname && form.errors.confname}\n onChange={form.handleChange}\n fullWidth\n data-testid=\"firstName\"\n />\n\n <TextField variant=\"outlined\" label=\"Last name\" name=\"conlname\"\n className=\"m-4\"\n value={form.values.conlname ?? ''}\n error={form.touched.conlname && !!form.errors.conlname}\n helperText={form.touched.conlname && form.errors.conlname}\n onChange={form.handleChange}\n fullWidth\n data-testid=\"lastName\"\n />\n </div>\n\n <div className=\"flex m-4\">\n <TextField variant=\"outlined\" label=\"Street Address 1\" name=\"conaddr1\"\n className=\"m-4\"\n value={form.values.conaddr1 ?? ''}\n error={form.touched.conaddr1 && !!form.errors.conaddr1}\n helperText={form.touched.conaddr1 && form.errors.conaddr1}\n onChange={form.handleChange}\n fullWidth\n data-testid=\"street1\"\n />\n\n <TextField variant=\"outlined\" name=\"conaddr2\" label=\"Street Address 2\"\n className=\"m-4\"\n value={form.values.conaddr2 ?? ''}\n error={form.touched.conaddr2 && !!form.errors.conaddr2}\n helperText={form.touched.conaddr2 && form.errors.conaddr2}\n onChange={form.handleChange}\n fullWidth\n data-testid=\"street2\"\n />\n </div>\n\n <div className=\"flex m-4 justify-between\">\n\n <TextField variant=\"outlined\" name=\"concity\" label=\"City\"\n className=\"m-4\"\n value={form.values.concity ?? ''}\n error={form.touched.concity && !!form.errors.concity}\n helperText={form.touched.concity && form.errors.concity}\n onChange={form.handleChange}\n fullWidth\n data-testid=\"city\"\n />\n\n <div className=\"flex\">\n <StateSelect onStateChanged={handleStateChange}\n name=\"constate\" label=\"State\"\n value={form.values.constate}\n variant=\"outlined\"\n error={form.touched.constate && !!form.errors.constate}\n fullWidth\n data-testid=\"state\"\n className=\"m-4\"\n />\n\n <TextField variant=\"outlined\" name=\"conzip\" label=\"Zip\"\n className=\"m-4\"\n value={form.values.conzip ?? ''}\n error={form.touched.conzip && !!form.errors.conzip}\n helperText={form.touched.conzip && form.errors.conzip}\n onChange={form.handleChange}\n fullWidth\n data-testid=\"zip\"\n />\n </div>\n </div>\n\n <div className=\"flex m-4\">\n <TextField variant=\"outlined\" name=\"conphone\" label=\"Phone\"\n className=\"m-4\"\n value={form.values.conphone ?? ''}\n error={form.touched.conphone && !!form.errors.conphone}\n helperText={form.touched.conphone && form.errors.conphone}\n onChange={form.handleChange}\n fullWidth\n data-testid=\"phone\"\n />\n\n <TextField variant=\"outlined\" name=\"confax\" label=\"Fax\"\n className=\"m-4\"\n value={form.values.confax ?? ''}\n error={form.touched.confax && !!form.errors.confax}\n helperText={form.touched.confax && form.errors.confax}\n onChange={form.handleChange}\n fullWidth\n data-testid=\"fax\"\n />\n </div>\n\n <div className=\"flex m-4\">\n <TextField variant=\"outlined\" name=\"conemail\" label=\"Email\"\n className=\"m-4\"\n value={form.values.conemail ?? ''}\n error={form.touched.conemail && !!form.errors.conemail}\n helperText={form.touched.conemail && form.errors.conemail}\n onChange={form.handleChange}\n fullWidth\n data-testid=\"email\"\n />\n </div>\n <Divider />\n <div className=\"flex m-4\">\n <div className=\"flex flex-grow flex-col m-4\" />\n <div className=\"flex flex-col m-4\">\n <div className={'flex justify-items-stretch m-5'} >\n\n <Button\n color=\"primary\"\n onClick={form.handleReset}\n data-testid=\"reset\"\n className=\"m-4\"\n >\n Cancel\n </Button>\n\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"submit\"\n data-testid=\"saveChanges\"\n className=\"m-4\"\n >\n Save Changes\n </Button>\n </div>\n </div>\n </div>\n </PageContentPaper>\n </form>\n );\n }\n\n return <div data-testid=\"contactInfoScreen\">{contactInfoCreation()}</div>;\n}\n\nexport default ContactInfo;\n","import React, { useState, ChangeEvent } from 'react';\nimport TextField from '@mui/material/TextField';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport IconButton from '@mui/material/IconButton';\nimport Visibility from '@mui/icons-material/Visibility';\nimport VisibilityOff from '@mui/icons-material/VisibilityOff';\n\nexport interface PasswordInputProps {\n onPasswordChanged: (password: string) => void;\n onInput?: any;\n size?: 'small' | 'medium'; // this gets passed along to the TextField. Default is \"medium\"\n placeholder?: string;\n [otherProp: string]: any;\n}\n\nfunction PasswordInput({\n onPasswordChanged,\n size,\n placeholder,\n ...rest }:\n PasswordInputProps): React.ReactElement {\n const [ showPassword, setShowPassword ] = useState(false);\n\n function handleShowPassword() {\n setShowPassword(!showPassword);\n }\n\n function handleChanged(evt: ChangeEvent<HTMLInputElement>) {\n const newVal = evt.target.value;\n onPasswordChanged(newVal);\n }\n\n return (\n <TextField\n placeholder={placeholder}\n size={size}\n onChange={handleChanged}\n type={showPassword ? 'text' : 'password'}\n {...rest}\n InputProps={ { // <-- This is where the toggle button is added.\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton\n aria-label=\"toggle password visibility\"\n onClick={handleShowPassword}\n onMouseDown={handleShowPassword}\n size=\"large\"\n >\n {showPassword ? <Visibility /> : <VisibilityOff />}\n </IconButton>\n </InputAdornment>\n ),\n } }\n />\n );\n}\n\nexport default PasswordInput;\n","import * as yup from 'yup';\n\nconst requiredText = 'This field is required';\n\nexport const validationSchema = yup.object({\n currentPassword: yup\n .string()\n .trim()\n .required(requiredText),\n newPassword: yup\n .string()\n .trim()\n .matches(/[A-Z]/, 'Must have an Upper Case Letter')\n .matches(/[a-z]/, 'Must have a Lower Case Letter')\n .matches(/\\d/, 'Must have a Number')\n .matches(/\\W/, 'Must have a Special Character')\n .min(8, 'Must be at least 8 characters')\n .required(requiredText),\n confirmNewPassword: yup\n .string()\n .trim()\n .when('newPassword', (p1: string, schema: any) => {\n return schema.test({\n test: (p2: string) => p1 === p2,\n message: 'Passwords do not match',\n });\n })\n .required(requiredText),\n});\n","import React from 'react';\nimport Typography from '@mui/material/Typography';\nimport Button from '@mui/material/Button';\nimport Divider from '@mui/material/Divider';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useFormik } from 'formik';\nimport { compose, always } from 'ramda';\n\nimport { getUser } from 'authentication/authentication';\nimport request, { APIOptions } from 'shared/api-request';\nimport PasswordInput from 'components/shared/PasswordInput';\nimport { addHttpErrorNotification, addHttpSuccessNotification } from 'notifications/notifications.slice';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport { validationSchema } from './change-password.validators';\nimport store from 'store';\n\nfunction ChangePassword(): React.ReactElement {\n const user = useSelector(getUser);\n const dispatch = useDispatch<typeof store.dispatch>();\n const form = useFormik({\n initialValues: {\n currentPassword: '',\n newPassword: '',\n confirmNewPassword: '',\n },\n validationSchema: validationSchema,\n onSubmit,\n });\n let changeSuccess = compose(dispatch, addHttpSuccessNotification, always('Password Changed'));\n let changeFailed = compose(dispatch, addHttpErrorNotification);\n\n function onSubmit(values: any) {\n const cpOptions: APIOptions = {\n method: 'PUT',\n body: {\n UserName: user?.username,\n OldPassword: values.currentPassword,\n NewPassword: values.newPassword,\n },\n };\n request<boolean>(`/api/users/${user?.conuserid}/change-password`, cpOptions)\n .then(changeSuccess)\n .catch(changeFailed);\n }\n\n return (\n <form data-testid=\"cp-form\" onSubmit={form.handleSubmit} >\n <PageContentPaper>\n <Typography variant=\"h4\" className=\"mb-12\">Change Password</Typography>\n <Typography className=\"flex mb-12\" variant=\"body1\">Set a unique password to protect your account.</Typography>\n\n <PasswordInput\n className=\"flex mb-12 mr-12\"\n label=\"Enter your password\"\n name=\"currentPassword\"\n data-testid=\"currentPassword\"\n variant=\"outlined\"\n error={form.touched.currentPassword && !!form.errors.currentPassword}\n onPasswordChanged={form.handleChange('currentPassword')}\n size=\"medium\"\n helperText={form.touched.currentPassword && form.errors.currentPassword}\n />\n\n <PasswordInput\n className=\"flex mb-12 mr-12\"\n label=\"New password\"\n name=\"newPassword\"\n data-testid=\"newPassword\"\n variant=\"outlined\"\n error={form.touched.newPassword && !!form.errors.newPassword}\n onPasswordChanged={form.handleChange('newPassword')}\n size=\"medium\"\n helperText={form.touched.newPassword && form.errors.newPassword}\n />\n\n <PasswordInput\n className=\"flex mb-12 mr-12\"\n label=\"Confirm New password\"\n name=\"confirmNewPassword\"\n data-testid=\"confirmNewPassword\"\n variant=\"outlined\"\n error={form.touched.confirmNewPassword && !!form.errors.confirmNewPassword}\n onPasswordChanged={form.handleChange('confirmNewPassword')}\n size=\"medium\"\n helperText={form.touched.confirmNewPassword && form.errors.confirmNewPassword}\n />\n\n <Divider />\n <div className=\"flex flex-row m-4\">\n <div className=\"flex flex-grow flex-col m-4\" />\n <div className=\"flex flex-col m-4\">\n <div className={'flex flex-row justify-items-stretch m-5'} >\n <Button\n data-testid=\"cp-button\"\n variant=\"contained\"\n color=\"primary\"\n type=\"submit\"\n >\n Change Password\n </Button>\n </div>\n </div>\n </div>\n </PageContentPaper>\n </form>\n );\n}\n\nexport default ChangePassword;\n","import request, { APIOptions } from 'shared/api-request';\nimport { User } from 'authentication/user.types';\nimport { compose, equals, ifElse, pipe, tap, identity } from 'ramda';\nimport { parseLoginToken, setLogin } from 'authentication/authentication';\nimport {\n MultiFactorAuthRequest,\n MultiFactorSetting,\n} from 'multi-factor-authentication/multi-factor-auth-request.types';\nimport { noop } from 'shared/utils';\n\nexport function updateMultiFactorSetting(userId: number, enableTwoFactor: boolean) {\n if (userId <= 0) {\n return Promise.reject(new Error('Cannot update 2-step verification setting for invalid user.'));\n }\n\n const options: APIOptions = { method: 'PUT', body: { enableTwoFactor } };\n\n return request<User>(`/api/users/${userId}/multi-factor-setting`, options);\n}\n\nexport function verifyToken(multiFactorRequestBody: MultiFactorAuthRequest) {\n if (!multiFactorRequestBody.userName) {\n return Promise.reject(new Error('Username was not provided.'));\n }\n\n if (!multiFactorRequestBody.passCode) {\n return Promise.reject(new Error('Passcode was not provided.'));\n }\n\n return request<string>(\n `/api/two-factor-authentication`,\n { method: 'POST', body: multiFactorRequestBody },\n )\n .then(\n pipe(\n tap(\n ifElse(\n equals(null),\n noop,\n compose(setLogin, parseLoginToken),\n ),\n ),\n identity,\n ),\n );\n}\n\nexport function resendCode(multiFactorRequestBody: MultiFactorAuthRequest) {\n if (!multiFactorRequestBody.userName) {\n return Promise.reject(new Error('Username was not provided.'));\n }\n\n return request<string>(\n `/api/two-factor-authentication/resend-passcode`,\n { method: 'POST', body: multiFactorRequestBody },\n );\n}\n\nexport function getMultiFactorSetting() {\n return request<MultiFactorSetting>(\n `/api/users/multi-factor-setting`,\n { method: 'GET' },\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport Button from '@mui/material/Button';\nimport TextField from '@mui/material/TextField';\nimport Switch from '@mui/material/Switch';\nimport { useHistory } from 'react-router-dom';\nimport { compose, always } from 'ramda';\n\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport { getUser } from 'authentication/authentication';\nimport { getMultiFactorSetting, updateMultiFactorSetting } from 'shared/api/multiFactorApi';\nimport { useErrorNotifier, useSuccessNotifier } from 'shared/custom-hooks/useNotifiers';\n\nexport function MultiFactorSettings() {\n const handleError = useErrorNotifier();\n const handleSuccess = useSuccessNotifier('Settings saved');\n const history = useHistory();\n const [ enableTfa, setEnableTfa ] = useState<boolean>(false);\n\n useEffect(() => {\n getMultiFactorSetting()\n .then((data) => {\n if (data) {\n const { requireMfa } = data;\n setEnableTfa(requireMfa === 'Y');\n }\n });\n }, []);\n\n function handleSave() {\n const user = getUser();\n\n if (user) {\n updateMultiFactorSetting(user.conuserid, enableTfa)\n .then(handleSuccess)\n .catch(handleError);\n }\n }\n\n function toggleTfa() {\n setEnableTfa(!enableTfa);\n }\n\n return (\n <div className=\"w-1/2\">\n <PageContentPaper>\n <h4>2-step verification</h4>\n <div className=\"space-y-8\">\n <p>Require a security code in addition to your password.</p>\n <div className=\"w-full\">\n <TextField\n value={(getUser() ?? {}).username ?? ''}\n disabled\n className=\"w-full\"\n variant=\"outlined\"\n label=\"Email Address\"\n />\n </div>\n <div>\n <Switch\n checked={enableTfa}\n color=\"primary\"\n name=\"requiremfa\"\n onChange={toggleTfa}\n data-testid\n /> 2-Step Verification\n </div>\n </div>\n <div className=\"mt-12 flex justify-end space-x-4\">\n <Button\n variant=\"text\"\n color=\"primary\"\n onClick={compose(history.push, always('/manage-settings/contact-info'))}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={handleSave}\n >\n Save Changes\n </Button>\n </div>\n </PageContentPaper>\n </div>\n );\n}\n\nexport default MultiFactorSettings;\n","import { useHistory } from 'react-router-dom';\nimport Paper from '@mui/material/Paper';\nimport Avatar from '@mui/material/Avatar';\nimport Button from '@mui/material/Button';\nimport EditIcon from '@mui/icons-material/Edit';\nimport { always, compose, pipe } from 'ramda';\n\nimport { colorFromLetters } from 'components/shared/avatar-color-palette';\nimport { SummaryUser } from 'manage-settings/manage-users/manage-users.types';\nimport { Contact } from 'manage-settings/contact-info/contact.types';\nimport { useDispatch } from 'react-redux';\nimport { loadSelectedUser } from 'manage-settings/manage-users/manage-users.slice';\nimport store from 'store';\n\ninterface UserCardProps {\n user: SummaryUser;\n}\n\nfunction avatarColor(contact: Contact): string {\n return colorFromLetters(`${contact.confname} ${contact.conlname}`);\n}\n\nfunction initials(contact: Contact) {\n const firstName = contact.confname ?? '';\n const lastName = contact.conlname ?? '';\n\n return `${firstName.charAt(0).toUpperCase()}${lastName.charAt(0).toUpperCase()}`;\n}\n\nexport function UserCard({ user }: UserCardProps) {\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n const { responsibilities, locations, payFrequencies } = user;\n\n function setUser() {\n dispatch(loadSelectedUser(user.conid!));\n }\n\n return (\n <Paper elevation={2} className=\"p-4 border-neutral5 bg-white flex-col\">\n <div className=\"w-full pb-4 flex border-b border-neutral4 border-solid\">\n <Avatar className={`p-2 mr-4 w-10 text-sm ${avatarColor(user)}`}>\n {initials(user)}\n </Avatar>\n <div className=\"flex-grow\">\n <p className=\"font-bold text-outer-space\">{user.confname} {user.conlname}</p>\n <p className=\"text-xs\">{user.conemail}</p>\n <p className=\"text-xs\">{user.conphone}</p>\n </div>\n <div>\n <Button\n className=\"min-w-0 min-h-0 text-stone\"\n size=\"small\"\n aria-label=\"Edit User\"\n onClick={\n pipe(\n setUser,\n compose(history.push, always(`/edit-user/step-1`)),\n )\n }\n >\n <EditIcon fontSize=\"small\" />\n </Button>\n </div>\n </div>\n\n <div className=\"w-full py-4 flex border-b border-neutral4 border-solid\">\n <div className=\"w-1/2\">\n <p className=\"font-bold text-sm text-outer-space\">Locations</p>\n { (locations as string[]).map((loc) => <p className=\"text-xs\" key={loc}>{loc}</p>) }\n </div>\n <div className=\"w-1/2\">\n <p className=\"font-bold text-sm text-outer-space\">Pay Frequencies</p>\n { (payFrequencies as string[]).map((pf) => <p className=\"text-xs\" key={pf}>{pf}</p>) }\n </div>\n </div>\n\n <div className=\"w-full pt-4 flex flex-wrap\">\n <p className=\"w-full font-bold text-sm text-outer-space\">Responsibilities</p>\n {\n (responsibilities as string[])\n .slice(0,5)\n .map((resp) => <p className=\"w-1/2 text-xs\" key={resp}>{resp}</p>)\n }\n {\n (responsibilities as string[]).length > 5\n ? <p className=\"w-1/2 text-xs\">+{ responsibilities.length - 5 }</p>\n : <></>\n }\n </div>\n </Paper>\n );\n}\n\nexport default UserCard;\n","import React, { ReactElement, useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport Button from '@mui/material/Button';\nimport Grid from '@mui/material/Grid';\nimport Paper from '@mui/material/Paper';\n\nimport {\n selectUsers,\n loadUsers,\n loadResponsibilities,\n loadPermissions,\n loadLocations,\n loadPayFrequencies,\n} from 'manage-settings/manage-users/manage-users.slice';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport UserCard from 'manage-settings/manage-users/UserCard';\nimport { compose, always } from 'ramda';\nimport LoopIcon from '@mui/icons-material/Loop';\nimport { useHistory } from 'react-router-dom';\nimport store from 'store';\n\nfunction ManageUsers(): ReactElement {\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n const users = useSelector(selectUsers);\n\n useEffect(() => {\n dispatch(loadResponsibilities());\n dispatch(loadPermissions());\n dispatch(loadLocations());\n dispatch(loadPayFrequencies());\n dispatch(loadUsers());\n }, [ dispatch ]);\n\n return (\n <div className=\"w-full\">\n <Paper className=\"p-4 mb-4 w-full flex justify-between\">\n <h6>Manage Users</h6>\n <Button\n color=\"primary\"\n variant=\"contained\"\n onClick={compose(history.push, always('/add-user/step-1'))}\n >\n + New User\n </Button>\n </Paper>\n <PageContentPaper>\n <Grid container spacing={3}>\n { users?.map(\n user => <Grid item key={user.conid} xs={4}><UserCard user={user} /></Grid>,\n ) || (\n <LoopIcon\n className=\"animate-spin\"\n style={ { animationDirection: 'reverse' } }\n />\n ) }\n </Grid>\n </PageContentPaper>\n </div>\n );\n}\n\nexport default ManageUsers;\n","import React from 'react';\nimport { Route as _Route, Switch as _Switch, Redirect as _Redirect } from 'react-router-dom';\n\nimport SettingsSidebar from './SettingsSidebar';\nimport ContactInfo from './contact-info/ContactInfo';\nimport ChangePassword from './change-password/ChangePassword';\nimport MultiFactorSettings from './multi-factor-settings/MultiFactorSettings';\nimport ManageUsers from 'manage-settings/manage-users/ManageUsers';\n\nconst Route = _Route as any;\nconst Switch = _Switch as any;\nconst Redirect = _Redirect as any;\n\nfunction ManageSettings() {\n return (\n <div className=\"m-4 w-full\">\n <h4 className=\"mb-4\">Manage Your Settings</h4>\n <div className=\"flex w-full\">\n <div className=\"w-1/5\" style={ { minWidth: '221px' } }>\n <SettingsSidebar />\n </div>\n <div className=\"flex flex-grow ml-8\">\n <Switch>\n <Route exact path=\"/manage-settings/contact-info\">\n <ContactInfo />\n </Route>\n <Route path=\"/manage-settings/change-password\">\n <ChangePassword />\n </Route>\n <Route path=\"/manage-settings/multi-factor\">\n <MultiFactorSettings />\n </Route>\n <Route path=\"/manage-settings/manage-users\">\n <ManageUsers />\n </Route>\n <Route>\n <Redirect to=\"/manage-settings/contact-info\" />\n </Route>\n </Switch>\n </div>\n </div>\n </div>\n );\n}\n\nexport default ManageSettings;\n","import DescriptionIcon from '@mui/icons-material/Description';\nimport EventIcon from '@mui/icons-material/Event';\n\nimport { WizardStep } from 'components/shared/WizardStepper';\n\nexport type UPEStepSlug = 'plan-details' | 'summary';\nconst wizardSteps: Map<UPEStepSlug, WizardStep> = new Map([\n [\n 'plan-details',\n {\n icon: EventIcon,\n label: 'Plan Details',\n slug: 'plan-details',\n next: 'summary',\n },\n ],\n [\n 'summary',\n {\n icon: DescriptionIcon,\n label: 'Summary',\n slug: 'summary',\n prev: 'plan-details',\n },\n ],\n]);\n\nexport default wizardSteps;\n","import React, { useEffect, useRef, useState } from 'react';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { T, always, compose, cond, equals } from 'ramda';\n\nimport WizardStepper, { WizardStep } from 'components/shared/WizardStepper';\nimport { PlanEnrollmentFormProps, OpenPlan, PlanDetails } from '../plan-enrollment/plan-enrollment.types';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport { selectParticipant } from 'participant-search/participant.slice';\nimport {\n resetPlanEnrollment,\n selectPlanEnrollmentDetails,\n selectPlanEnrollmentPayload,\n selectPlanEnrollmentPlan,\n setPlan,\n setPlanDetails,\n} from '../plan-enrollment/plan-enrollment.slice';\nimport CancelModal from 'components/shared/CancelModal';\nimport Loading from 'components/shared/Loading';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport PlanEnrollmentHsa from 'plan-enrollment/plan-enrollment-hsa/PlanEnrollmentHsa';\nimport PlanEnrollmentSummary from 'plan-enrollment/plan-enrollment-summary/PlanEnrollmentSummary';\nimport PlanEnrollmentMra from '../plan-enrollment/plan-enrollment-mra/PlanEnrollmentMra';\nimport { useHistoryBlock } from 'shared/custom-hooks/useHistoryBlock';\nimport NotFound from 'components/pages/NotFound';\nimport { useEnrollmentDetails } from './useEnrollmentDetails';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport PlanEnrollmentCustom from 'plan-enrollment/plan-enrollment-custom/PlanEnrollmentCustom';\nimport { CUSTOM_PLCCODE } from 'components/shared/GlobalConstants';\nimport wizardSteps, { UPEStepSlug } from './update-plan-enrollment-steps';\nimport { updateEnrollment } from 'shared/api/enrollmentApi';\nimport store from 'store';\nimport { fetchDependentsForParticipant } from 'store/slices/dependents/dependents.thunk';\n\nconst HSA_PLCCODE = 'S';\n\ninterface UpdateEnrollmentRouteParams {\n stepSlug: UPEStepSlug;\n employeeNumber: string;\n planYearId: string;\n planCode: string;\n customPlanId: string;\n}\ninterface UpdatePlanEnrollmentWizardProps extends PlanEnrollmentFormProps {\n onSave: () => void;\n}\n\nfunction UpdatePlanEnrollmentWizardStep({\n onNextStep,\n onCancel,\n onSave }: UpdatePlanEnrollmentWizardProps,\n): React.ReactElement {\n const { stepSlug } = useParams<UpdateEnrollmentRouteParams>();\n const plan = useSelector(selectPlanEnrollmentPlan);\n const planDetails = useSelector(selectPlanEnrollmentDetails);\n\n function content() {\n switch (stepSlug) {\n case 'plan-details':\n if (planDetails?.type === 'HSA') {\n return (\n <PlanEnrollmentHsa\n yearBeg={plan?.yearbeg}\n yearEnd={plan?.yearend}\n partStart={planDetails.partStart}\n partEnd={planDetails.partEnd}\n onNextStep={onNextStep}\n onCancel={onCancel}\n isEdit\n planName={plan?.planYearName}\n />\n );\n } else if (planDetails?.type === 'MRA' && plan) {\n return (\n <PlanEnrollmentMra\n {...planDetails}\n showLFSA={planDetails.lfsa}\n plan={plan}\n onNextStep={onNextStep}\n onCancel={onCancel}\n isEdit\n />\n );\n } else if (planDetails?.type === 'CUSTOM' && plan) {\n return (\n <PlanEnrollmentCustom\n isBalance={plan.isBalance}\n yearBeg={plan.yearbeg}\n yearEnd={plan.yearend}\n partStart={planDetails.partStart}\n partEnd={planDetails.partEnd}\n currentContributions={planDetails.currentContributions}\n additionalContributions={planDetails.additionalContributions}\n selectedDependents={planDetails.coveredDependents}\n onNextStep={onNextStep}\n onCancel={onCancel}\n isEdit\n />\n );\n }\n\n return <></>;\n case 'summary':\n return (\n <PlanEnrollmentSummary\n // Typecast props as any because props may not be present on the\n // discriminated union type. The component receiving these props\n // has logic to determine if the required properties are present\n {...plan as any}\n {...planDetails as any}\n onCancel={onCancel}\n onSubmit={onSave}\n isEdit\n />\n );\n }\n\n return <NotFound />;\n }\n\n return content();\n}\n\nfunction UpdatePlanEnrollmentWizard(): React.ReactElement {\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n\n const { current: unmountCallback } = useRef(compose(dispatch, resetPlanEnrollment));\n const { current: blockRegex } = useRef(/^\\/update-plan-enrollment/);\n const navUnblock = useHistoryBlock(blockRegex, unmountCallback);\n\n const participant = useSelector(selectParticipant);\n const savePayload = useSelector(selectPlanEnrollmentPayload);\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const {\n stepSlug: activeStepSlug = 'plan-details',\n employeeNumber: empno,\n planYearId: pyrid,\n planCode,\n customPlanId,\n } = useParams<UpdateEnrollmentRouteParams>();\n const planYearId = parseInt(pyrid || '');\n\n const [ showModal, setShowModal ] = useState(false);\n const [ saving, setSaving ] = useState(false);\n const { plan, planDetails } = useEnrollmentDetails() ?? { plan: undefined, planDetails: undefined };\n\n const employeeNumber = empno || participant?.empno;\n\n function handleSave() {\n setSaving(true);\n updateEnrollment(compid, savePayload)\n .then(() => {\n setSaving(false);\n goToParticipantOverview();\n })\n .catch((err) => {\n setSaving(false);\n compose(dispatch, addHttpErrorNotification)(err);\n });\n }\n\n useEffect(() => {\n if (!!plan && !!planDetails) {\n dispatch(setPlan(plan));\n dispatch(setPlanDetails({\n ...planDetails,\n type: cond<string, string>([\n [ equals(HSA_PLCCODE), always('HSA') ],\n [ equals(CUSTOM_PLCCODE), always('CUSTOM') ],\n [ T, always('MRA') ],\n ])(plan.plccode),\n } as PlanDetails));\n }\n dispatch(fetchDependentsForParticipant());\n }, [ plan, planDetails, dispatch ]);\n\n function handleStepClick(s: WizardStep) {\n if (planCode === CUSTOM_PLCCODE) {\n history.push(`/update-plan-enrollment/${employeeNumber}/${planYearId}/${planCode}/${customPlanId}/${s.slug}`);\n } else {\n history.push(`/update-plan-enrollment/${employeeNumber}/${planYearId}/${planCode}/${s.slug}`);\n }\n }\n\n function onNextStep(data: OpenPlan | PlanDetails) {\n if (activeStepSlug === 'plan-details') {\n dispatch(setPlanDetails(data as PlanDetails));\n }\n\n const step = wizardSteps.get(activeStepSlug);\n history.push(`/update-plan-enrollment/${employeeNumber}/${planYearId}/${planCode}/${customPlanId}/${step?.next}`);\n }\n\n function onWizardCancel() {\n if (activeStepSlug !== 'plan-details') {\n setShowModal(true);\n } else {\n goToParticipantOverview();\n }\n }\n\n function closeModal() {\n setShowModal(false);\n }\n\n function goToParticipantOverview() {\n if (showModal) {\n setShowModal(false);\n }\n\n if (navUnblock) {\n navUnblock();\n }\n\n dispatch(resetPlanEnrollment());\n history.push(`/participant-overview/${employeeNumber}/plan-enrollment`);\n }\n\n const UpdateStep = withLoopIcon(\n UpdatePlanEnrollmentWizardStep,\n 'Loading enrollment details...',\n !plan || !planDetails,\n 'update-enrollment-loading-details',\n );\n\n return (\n <>\n <PageContentPaper className=\"mt-4 mb-8\">\n <div className=\"mb-8\">\n <WizardStepper\n steps={wizardSteps}\n allowClick\n onChange={handleStepClick}\n />\n </div>\n <div className=\"px-8\">\n <UpdateStep\n onNextStep={onNextStep}\n onCancel={onWizardCancel}\n onSave={handleSave}\n />\n </div>\n </PageContentPaper>\n <CancelModal\n isOpen={showModal}\n onCancel={goToParticipantOverview}\n onClose={closeModal}\n />\n {saving ? <Loading text=\"Saving Plan Enrollment\" /> : <></>}\n </>\n );\n}\n\nexport default UpdatePlanEnrollmentWizard;\n","import { useState, useRef, useEffect } from 'react';\nimport { useParams } from 'react-router';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { assocPath, compose, tap, always } from 'ramda';\nimport dayjs from 'dayjs';\n\nimport { MRADetails, PlanEnrollmentState } from 'plan-enrollment/plan-enrollment.types';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { selectParticipant } from 'participant-search/participant.slice';\nimport request, { APIOptions } from 'shared/api-request';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { selectPlanEnrollmentPlan } from 'plan-enrollment/plan-enrollment.slice';\nimport { CUSTOM_PLCCODE } from 'components/shared/GlobalConstants';\nimport store from 'store';\n\nexport function useEnrollmentDetails() {\n const dispatch = useDispatch<typeof store.dispatch>();\n\n const [ details, setDetails ] = useState<PlanEnrollmentState | null>(null);\n\n const plan = useSelector(selectPlanEnrollmentPlan);\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n const { empno } = useSelector(selectParticipant) ?? { empno: undefined };\n const { planYearId, planCode, customPlanId } =\n useParams<{ planYearId: string; planCode: string; customPlanId: string; }>();\n\n const { current: abortCtrl } = useRef(new AbortController());\n const { current: setDefault } = useRef(compose(setDetails, always({})));\n const { current: handleError } = useRef(compose(\n tap(setDefault),\n dispatch,\n addHttpErrorNotification,\n ));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n if (!plan) {\n mountedRef.current = true;\n let uri = '';\n\n if (planCode === CUSTOM_PLCCODE) {\n uri = `api/companies/${compid}/plan-enrollment/custom/${empno}/${planYearId}/${customPlanId}`;\n } else {\n uri = `api/companies/${compid}/plan-enrollment/regular/${empno}/${planYearId}/${planCode}`;\n }\n\n const apiOpts: APIOptions = { method: 'GET', signal: abortCtrl.signal };\n\n request<PlanEnrollmentState>(uri, apiOpts)\n .then((result) => {\n if (mountedRef.current) {\n setDetails((result?.planDetails as MRADetails).firstPayDateOfChange\n ? assocPath(\n [ 'planDetails', 'firstPayDateOfChange' ],\n dayjs((result?.planDetails as MRADetails).firstPayDateOfChange).format('YYYY-MM-DD'),\n result)\n : result ?? {});\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n\n return () => {\n mountedRef.current = false;\n abortCtrl.abort();\n };\n }\n }, [ dispatch, compid, empno, planCode, planYearId, customPlanId, setDefault, handleError, abortCtrl, plan ]);\n\n return details;\n}\n","import * as yup from 'yup';\n\nimport { validationSchema as piSchema } from 'shared/participant-info.validators';\nimport { payrollid, requiredText } from 'shared/common-validators';\n\nexport const validationSchema = (requirePayFreq = true) => {\n const schema = piSchema.concat(yup.object({ ...payrollid }));\n\n if (requirePayFreq) {\n return schema.shape({\n payfreq: yup\n .string()\n .nullable()\n .required(requiredText),\n });\n }\n\n return schema;\n};\n","import React, { useState, useEffect } from 'react';\nimport Button from '@mui/material/Button';\nimport { useFormik } from 'formik';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport { compose, equals, T, F, tap, set, replace, or, view, lensPath } from 'ramda';\n\nimport { usePageTitle } from 'shared/custom-hooks/usePageTitle';\nimport PayrollIdParticipantLookupInput, {\n setParticipantValues,\n} from 'components/shared/PayrollIdParticipantLookupInput';\nimport ParticipantDetails from 'components/shared/ParticipantDetails';\nimport { Participant } from 'participant-search/participant-list.types';\nimport { validationSchema } from './add-participant.validators';\nimport { setSelectedParticipant } from 'participant-search/participant.slice';\nimport request from 'shared/api-request';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport PayFreqSelect, { PayFreqSelectProps } from 'components/shared/PayFreqSelect';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport CancelModal from 'components/shared/CancelModal';\nimport Loading from 'components/shared/Loading';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport { useHistoryBlock } from 'shared/custom-hooks/useHistoryBlock';\nimport { defaultParticipant } from 'shared/constants';\nimport { usePayFrequencies } from 'shared/custom-hooks/usePayFrequencies';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport { deepTrim } from 'shared/utils/deep-trim';\nimport store from 'store';\n\nfunction AddParticipant(): React.ReactElement {\n usePageTitle('Add New Participant');\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n const payFreqs = usePayFrequencies();\n const [ blockRegex ] = useState(/^\\/add-participant/);\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n\n const [ searching, setSearching ] = useState(false);\n const [ showModal, setShowModal ] = useState(false);\n const [ saving, setSaving ] = useState(false);\n const [ doneSaving ] = useState(() => compose(setSaving, F));\n const [ handleError ] = useState(() => compose(tap(doneSaving), dispatch, addHttpErrorNotification));\n\n const PayFrequencies = withLoopIcon<PayFreqSelectProps>(\n PayFreqSelect,\n 'Loading Pay Frequencies...',\n payFreqs === null,\n 'pay-frequencies-loading',\n );\n\n const form = useFormik<Partial<Participant>>({\n initialValues: defaultParticipant,\n validationSchema: validationSchema(payFreqs !== null && payFreqs.length > 0),\n onSubmit: (p) => {\n let pidLens = lensPath([ 'payrollid' ]);\n let body = deepTrim(\n set(\n pidLens,\n replace(/-+/g, '', or(view(pidLens, p), '')),\n p,\n ),\n );\n setSaving(true);\n const uri = `/api/companies/${compid}/participant${body.empno ? `/${body.empno}` : ''}`;\n request<Participant>(uri, { method: p.empno ? 'PUT' : 'POST', body })\n .then((participant) => {\n doneSaving();\n\n if (navUnblock) {\n navUnblock();\n }\n\n dispatch(setSelectedParticipant(participant));\n history.push(`/participant-overview/${participant?.empno}/dependents`);\n })\n .catch(handleError);\n },\n });\n const setParticipantDetails = setParticipantValues(form.setFieldValue);\n\n const handleSearchStarted = compose(setSearching, T);\n const navUnblock = useHistoryBlock(blockRegex, undefined, hasFormChanged());\n\n useEffect(() => {\n dispatch(setSelectedParticipant(null));\n }, [ dispatch ]);\n\n function onCancel() {\n if (hasFormChanged()) {\n setShowModal(T);\n } else {\n history.goBack();\n }\n }\n\n function handleParticipant(p: Participant) {\n setParticipantDetails(p);\n setSearching(false);\n }\n\n function handleCustomFieldChange(field: string) {\n return (value: string) => form.setFieldValue(field, value);\n }\n\n function hasFormChanged() {\n return !equals(form.values, defaultParticipant);\n }\n\n return (\n <>\n <PageContentPaper className=\"mt-4 mb-8\">\n <form data-testid=\"add-participant-form\" className=\"px-8\">\n <div className=\"flex flex-col space-y-8\">\n <p>\n To create an employee account, please provide the employee’s demographic information below. If an account\n was previously created for the employee the form will prepopulate with the data currently in our system.\n </p>\n <div className=\"flex flex-row pr-4\">\n <PayrollIdParticipantLookupInput\n className=\"w-1/2\"\n data-testid=\"participantLookup\"\n onSearchStarted={handleSearchStarted}\n onParticipantFound={handleParticipant}\n name=\"payrollid\"\n value={form.values.payrollid ?? ''}\n error={form.touched.payrollid && !!form.errors.payrollid}\n helperText={form.touched.payrollid && form.errors.payrollid}\n onTextChanged={handleCustomFieldChange('payrollid')}\n />\n </div>\n\n <ParticipantDetails form={form} />\n\n <div className=\"flex flex-row space-x-8\">\n <PayFrequencies\n isRequired\n payFreqs={payFreqs}\n name=\"payfreq\"\n label=\"Pay Frequency\"\n value={form.values.payfreq ?? ''}\n error={form.touched.payfreq && !!form.errors.payfreq}\n onPayFreqChanged={handleCustomFieldChange('payfreq')}\n data-testid=\"payfreq\"\n />\n\n <PayFrequencies\n isRequired={false}\n payFreqs={payFreqs}\n name=\"payfreq2\"\n label=\"Pay Frequency 2 (Optional)\"\n value={form.values.payfreq2 ?? ''}\n error={form.touched.payfreq2 && !!form.errors.payfreq2}\n onPayFreqChanged={handleCustomFieldChange('payfreq2')}\n data-testid=\"payfreq2\"\n />\n </div>\n </div>\n <div className=\"flex justify-end my-4\">\n <Button\n color=\"primary\"\n data-testid=\"add-participant-cancel\"\n onClick={onCancel}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"button\"\n onClick={form.submitForm}\n data-testid=\"add-participant-save\"\n className=\"ml-4\"\n disabled={searching || (!!Object.values(form.touched).length && !!Object.values(form.errors).length)}\n >\n Save Participant\n </Button>\n </div>\n </form>\n </PageContentPaper>\n {saving ? <Loading text=\"Saving...\" /> : <></>}\n <CancelModal\n isOpen={showModal}\n onCancel={compose(tap(history.goBack), setShowModal, F)}\n onClose={compose(setShowModal, F)}\n title=\"Are you sure you want to navigate away?\"\n />\n </>\n );\n}\n\nexport default AddParticipant;\n","import * as yup from 'yup';\n\nimport { validationSchema as piSchema } from 'shared/participant-info.validators';\nimport { payrollid } from 'shared/common-validators';\n\nexport const validationSchema = piSchema.concat(\n yup.object({\n ...payrollid,\n sendToEmployee: yup.boolean(),\n sendToSpouse: yup.boolean(),\n birthdate: yup\n .date()\n .nullable(),\n payfreq: yup\n .string()\n .nullable(),\n spouseName: yup\n .string()\n .test(\n 'spouse-name-empty-or-max35-check',\n 'Spouse name must be no more than 35 characters.',\n (name) => !name || name.length <= 35,\n )\n .nullable(),\n spouseGender: yup\n .string()\n .test(\n 'spouse-sex-empty-or-1char-check',\n 'Spouse sex must be exactly 1 character.',\n (sex) => !sex || sex.length === 1,\n )\n .nullable(),\n })\n .test(\n 'at-least-one-notice-type',\n 'Please select at least one notice to send.',\n ({ sendToEmployee, sendToSpouse }) => !!sendToEmployee || !!sendToSpouse,\n ),\n);\n","import { useState, useRef } from 'react';\nimport { useSelector } from 'react-redux';\nimport { useFormik } from 'formik';\nimport { useHistory } from 'react-router-dom';\nimport Button from '@mui/material/Button';\nimport TextField from '@mui/material/TextField';\nimport FormControl from '@mui/material/FormControl';\nimport InputLabel from '@mui/material/InputLabel';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport Checkbox from '@mui/material/Checkbox';\nimport Select from '@mui/material/Select';\nimport dayjs from 'dayjs';\nimport { compose, tap, T, F, pick, lensPath, set, replace, or, view } from 'ramda';\n\nimport { CobraInitialNoticePayload, NoticeFields } from './cobra-initial-notice.types';\nimport { Participant } from 'participant-search/participant-list.types';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { handleSelectChange, handleDateChange } from 'shared/form-helpers';\nimport { defaultParticipant } from 'shared/constants';\nimport { useSuccessNotifier, useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { useHistoryBlock } from 'shared/custom-hooks/useHistoryBlock';\nimport request from 'shared/api-request';\nimport Loading from 'components/shared/Loading';\nimport PayrollIdParticipantLookupInput, {\n setParticipantValues,\n} from 'components/shared/PayrollIdParticipantLookupInput';\nimport ParticipantDetails from 'components/shared/ParticipantDetails';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport PayFreqSelect from 'components/shared/PayFreqSelect';\nimport CancelModal from 'components/shared/CancelModal';\nimport { validationSchema } from './cobra-initial-notice.validators';\nimport { Dependent } from 'shared/types/non-plan-year.types';\nimport { usePayFrequencies } from 'shared/custom-hooks/usePayFrequencies';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport { deepTrim } from '../shared/utils/deep-trim';\nimport AdapterDayJS from '@mui/lab/AdapterDayjs';\nimport LocalizationProvider from '@mui/lab/LocalizationProvider';\nimport DatePicker from '@mui/lab/DatePicker';\n\nconst initialValues: NoticeFields = {\n ...defaultParticipant,\n sendToEmployee: true,\n sendToSpouse: false,\n spouseBirthDate: '',\n spouseGender: '',\n spouseName: '',\n};\n\nconst participantFields = [\n 'payrollid',\n 'empno',\n 'socsec',\n 'birthdate',\n 'lname',\n 'fname',\n 'sex',\n 'hphone',\n 'hstreet1',\n 'hstreet2',\n 'hcity',\n 'hstate',\n 'hzip',\n 'location',\n 'payfreq',\n 'payfreq2',\n 'email',\n];\n\nconst noticeFields = [ 'sendToEmployee', 'sendToSpouse', 'spouseName', 'spouseBirthDate', 'spouseGender' ];\n\nfunction formatDateValue(val?: string) {\n return val ? dayjs(val, 'YYYY-MM-DD').format('MM/DD/YYYY') : null;\n}\n\nfunction displayErrorText(y: boolean) {\n if (y) {\n return (\n <FormHelperText\n disabled\n error\n data-testid=\"enter-initial-notice-selectError\"\n >\n This field is required\n </FormHelperText>\n );\n } else {\n return (<></>);\n }\n}\n\nfunction EnterCobraInitialNotice() {\n const history = useHistory();\n const [ blockRegex ] = useState(/^\\/enter-cobra-initial-notice/);\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n const formRef = useRef<HTMLDivElement>(null);\n const payFreqs = usePayFrequencies();\n\n const [ searching, setSearching ] = useState(false);\n const [ wholeFormErrors, setWholeFormErrors ] = useState<string[]>([]);\n const [ saving, setSaving ] = useState(false);\n const [ showModal, setShowModal ] = useState(false);\n const [ hideModal ] = useState(() => compose(setShowModal, F));\n\n const form = useFormik<NoticeFields>({\n initialValues: {\n ...initialValues,\n birthdate: null,\n },\n validationSchema,\n onSubmit: (values) => {\n try {\n validationSchema.validateSync(\n values,\n {\n abortEarly: false,\n stripUnknown: false,\n },\n );\n\n const payload = makeNoticePayload(values);\n saveInitialNotice(payload);\n } catch (err) {\n setWholeFormErrors(err.errors);\n\n if (formRef.current?.scrollIntoView) {\n formRef.current.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'start' });\n }\n }\n },\n });\n const setParticipantDetails = setParticipantValues(form.setFieldValue);\n\n const navUnblock = useHistoryBlock(blockRegex, undefined, form.dirty);\n\n const genderLabelRef = useRef<HTMLLabelElement>(null);\n\n const handleError = compose(tap(compose(setSaving, F)), useErrorNotifier());\n const successNotifier = useSuccessNotifier('Initial Notice saved successfully.');\n\n function handleSearchStarted() {\n setSearching(T);\n form.setFieldValue('empno', '');\n form.setFieldValue('socsec', '');\n }\n\n const PayFreqs = withLoopIcon(\n PayFreqSelect,\n 'Loading pay frequencies...',\n payFreqs === null,\n 'init-notice-loading-pay-freqs',\n );\n\n function makeNoticePayload(values: NoticeFields): CobraInitialNoticePayload {\n let payload = {\n ...pick(noticeFields, values),\n participant: pick(participantFields, values),\n };\n let pidLens = lensPath([ 'participant', 'payrollid' ]);\n\n return set(\n pidLens,\n replace(/-+/g, '', or(view(pidLens, payload), '')),\n payload,\n );\n }\n\n function navigateAway() {\n if (navUnblock) {\n navUnblock();\n }\n\n hideModal();\n history.goBack();\n }\n\n function saveInitialNotice(values: CobraInitialNoticePayload) {\n setSaving(true);\n const uri = `/api/companies/${compid}/initial-notices`;\n\n request(uri, { method: 'POST', body: deepTrim(values) })\n .then(() => {\n form.resetForm();\n setSaving(false);\n successNotifier();\n })\n .catch(handleError);\n }\n\n function onCancel() {\n if (form.dirty) {\n setShowModal(T);\n } else {\n history.goBack();\n }\n }\n\n function handleParticipant(part: Participant) {\n const { sendToEmployee, sendToSpouse } = form.values;\n const participant = pick(participantFields, { birthdate: null, ...part });\n setParticipantDetails(participant);\n\n const spouse = part.dependents?.find((d: Dependent) => d.relation === 'S');\n\n if (spouse) {\n form.setFieldValue('spouseName', spouse.name, false);\n form.setFieldValue('spouseBirthDate', spouse.dateOfBirth ?? '', false);\n form.setFieldValue('spouseGender', spouse.sex ?? '', false);\n }\n\n form.setFieldValue('sendToEmployee', sendToEmployee);\n form.setFieldValue('sendToSpouse', sendToSpouse);\n\n setSearching(false);\n }\n\n return (\n <div className=\"w-full flex flex-col p-4\">\n <h2 className=\"page-title\">Enter COBRA Initial Notice</h2>\n <div className=\"w-full md:w-2/3\">\n <PageContentPaper className=\"pt-10\">\n <form data-testid=\"enter-initial-notice-form\" className=\"px-8\">\n <>\n <div className=\"flex flex-col space-y-8\" ref={formRef}>\n <div className=\"w-full\">\n <PayrollIdParticipantLookupInput\n className=\"w-1/2\"\n data-testid=\"enter-initial-notice-participantLookup\"\n onSearchStarted={handleSearchStarted}\n onParticipantFound={handleParticipant}\n name=\"payrollid\"\n value={form.values.payrollid ?? ''}\n error={form.touched.payrollid && !!form.errors.payrollid}\n helperText={form.touched.payrollid && form.errors.payrollid}\n onTextChanged={form.handleChange('payrollid')}\n />\n </div>\n\n <div className=\"w-full flex flex-col\">\n {\n wholeFormErrors.length\n ? wholeFormErrors.map((msg, i) => (\n <FormHelperText\n className=\"text-base pb-5\"\n key={i}\n disabled\n error\n >\n {msg}\n </FormHelperText>\n ))\n : <></>\n }\n <FormControl>\n <FormControlLabel\n control={\n <Checkbox\n name=\"sendToEmployee\"\n color=\"primary\"\n value\n checked={form.values.sendToEmployee}\n onChange={form.handleChange}\n className=\"enter-initial-notice-send-employee\"\n />\n }\n classes={ { label: 'text-base' } }\n label=\"Send notice to employee\"\n labelPlacement=\"end\"\n />\n </FormControl>\n\n <FormControl>\n <FormControlLabel\n control={\n <Checkbox\n name=\"sendToSpouse\"\n color=\"primary\"\n value\n checked={form.values.sendToSpouse}\n onChange={form.handleChange}\n className=\"enter-initial-notice-send-spouse\"\n />\n }\n classes={ { label: 'text-base' } }\n label=\"Send notice to spouse\"\n labelPlacement=\"end\"\n />\n </FormControl>\n </div>\n\n <ParticipantDetails form={form} />\n\n <div className=\"flex\">\n <TextField\n className=\"w-1/2\"\n variant=\"outlined\"\n name=\"email\"\n label=\"Email Address\"\n value={form.values.email ?? ''}\n error={form.touched.email && !!form.errors.email}\n helperText={form.touched.email && form.errors.email}\n onChange={form.handleChange('email')}\n fullWidth\n data-testid=\"enter-initial-notice-email\"\n />\n\n <div className=\"w-1/2 ml-4\">\n <PayFreqs\n payFreqs={payFreqs}\n isRequired={false}\n name=\"payfreq\"\n label=\"Pay Frequency\"\n value={form.values.payfreq ?? ''}\n error={form.touched.payfreq && !!form.errors.payfreq}\n onPayFreqChanged={form.handleChange('payfreq')}\n data-testid=\"enter-initial-notice-payfreq\"\n />\n </div>\n </div>\n\n <div className=\"flex\">\n <TextField\n className=\"w-1/2\"\n variant=\"outlined\"\n name=\"spouseName\"\n label=\"Spouse Name (Optional)\"\n value={form.values.spouseName ?? ''}\n error={form.touched.spouseName && !!form.errors.spouseName}\n helperText={form.touched.spouseName && form.errors.spouseName}\n onChange={form.handleChange('spouseName')}\n fullWidth\n data-testid=\"enter-initial-notice-spouseName\"\n />\n\n <div className=\"flex flex-row w-1/2 ml-4\">\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n label=\"Spouse Date of Birth (Optional)\"\n value={formatDateValue(form.values.spouseBirthDate)}\n onChange={handleDateChange('spouseBirthDate', form)}\n inputFormat=\"MM/DD/YYYY\"\n InputProps={\n {\n className: !form.values.spouseBirthDate ? 'MuiFormLabel-root' : '',\n tabIndex: -1,\n }\n }\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n data-testid=\"enter-initial-notice-spouse-dob\"\n variant=\"outlined\"\n className=\"w-full\"\n {...params}\n error={form.touched.spouseBirthDate && Boolean(form.errors.spouseBirthDate)}\n helperText={form.touched.spouseBirthDate && form.errors.spouseBirthDate}\n />\n )}\n />\n </LocalizationProvider>\n </div>\n </div>\n\n <FormControl variant=\"outlined\" className=\"w-1/2\">\n <InputLabel ref={genderLabelRef} id=\"spouse-gender-select-label\">Spouse Gender (Optional)</InputLabel>\n <Select\n label=\"Spouse Gender (Optional)\"\n onChange={handleSelectChange('spouseGender', form)}\n value={form.values.spouseGender}\n native\n fullWidth\n data-testid=\"enter-initial-notice-spouse-gender\"\n className={!form.values.spouseGender ? 'MuiFormLabel-root' : ''}\n error={form.touched.spouseGender && Boolean(form.errors.spouseGender)}\n tabIndex={-1}\n >\n <option />\n <option value=\"F\">Female</option>\n <option value=\"M\">Male</option>\n </Select>\n {displayErrorText(!!form.errors.spouseGender)}\n </FormControl>\n\n </div>\n <div className=\"flex justify-end my-4\">\n <Button\n color=\"primary\"\n className=\"enter-initial-notice-cancel\"\n onClick={onCancel}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"button\"\n onClick={form.submitForm}\n className=\"ml-4 enter-initial-notice-save\"\n disabled={searching || (!!Object.values(form.touched).length && !!Object.values(form.errors).length)}\n >\n Save Entry\n </Button>\n </div>\n </>\n </form>\n </PageContentPaper>\n </div>\n {saving && <Loading text=\"Saving Initial Notice...\" />}\n <CancelModal\n isOpen={showModal}\n onCancel={navigateAway}\n onClose={hideModal}\n title=\"Are you sure you want to navigate away?\"\n />\n </div>\n );\n}\n\nexport default EnterCobraInitialNotice;\n","import React from 'react';\n\nimport CommonSelect, { CommonSelectClasses } from 'components/shared/form/CommonSelect';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport { SelectOption } from 'shared/types/form.types';\n\ninterface LastDeductionSelectProps {\n payDates: SelectOption[] | null;\n value: string;\n error?: boolean;\n classes?: CommonSelectClasses;\n disabled?: boolean;\n onDateChange: (value: string) => void;\n}\n\nfunction LastDeductionSelect({\n payDates,\n value,\n error,\n classes,\n disabled = false,\n onDateChange,\n}: LastDeductionSelectProps) {\n const LastDeduction = withLoopIcon(\n CommonSelect,\n 'Loading deduction dates...',\n payDates === null,\n 'loading-last-deduction-dates',\n );\n\n return (\n <LastDeduction\n options={payDates!}\n label=\"Last Deduction\"\n name=\"lastDeduction\"\n value={value}\n error={error}\n classes={classes}\n onSelectChange={onDateChange}\n />\n );\n}\n\nexport default LastDeductionSelect;\n","import * as yup from 'yup';\n\nimport { payrollid, requiredText } from 'shared/common-validators';\n\nexport const validationSchema = yup.object({\n employeeNumber: payrollid.payrollid,\n terminateBenefits: yup\n .date()\n .nullable()\n .typeError('Terminate Benefits must be a valid date.')\n .required(requiredText),\n numDeductionDates: yup.number(),\n lastDeduction: yup\n .string()\n .nullable()\n .when('numDeductionDates', {\n is: (numDeductionDates: number) => (numDeductionDates > 0),\n then: yup\n .string()\n .trim()\n .nullable()\n .required(requiredText),\n }),\n});\n","import { useEffect, useState } from 'react';\nimport Button from '@mui/material/Button';\nimport dayjs, { Dayjs } from 'dayjs';\nimport { useFormik } from 'formik';\nimport { compose, T } from 'ramda';\n\nimport PayrollIdParticipantLookupInput from 'components/shared/PayrollIdParticipantLookupInput';\nimport { Participant } from 'participant-search/participant-list.types';\nimport { TerminateDetails } from './terminate-participant.types';\nimport { handleDateChange } from 'shared/form-helpers';\nimport FormErrorText from 'components/shared/FormErrorText';\nimport LastDeductionSelect from './LastDeductionSelect';\nimport { validationSchema } from './terminate-participant.validators';\nimport { usePayDates } from 'shared/custom-hooks/usePayDates';\nimport AdapterDayJS from '@mui/lab/AdapterDayjs';\nimport LocalizationProvider from '@mui/lab/LocalizationProvider';\nimport DatePicker from '@mui/lab/DatePicker';\nimport TextField from '@mui/material/TextField';\n\nexport interface TerminateParticipantFormProps {\n onCancel: () => void;\n onAdd: (details: TerminateDetails) => void;\n}\n\ninterface TerminateValues extends Partial<Omit<TerminateDetails, 'participant'>> {\n employeeNumber?: string;\n numDeductionDates: number;\n}\n\nfunction TerminateParticipantForm({ onCancel, onAdd }: TerminateParticipantFormProps) {\n const [ searching, setSearching ] = useState(false);\n const [ participant, setParticipant ] = useState<Participant | undefined | null>();\n const payDates = usePayDates(participant ? participant.payfreq || participant.payfreq2 || '' : '');\n const form = useFormik<TerminateValues>({\n initialValues: {\n employeeNumber: '',\n terminateBenefits: undefined,\n lastDeduction: undefined,\n numDeductionDates: payDates ? payDates.length : 0,\n },\n validationSchema,\n onSubmit(values: TerminateValues) {\n form.resetForm();\n onAdd({\n participant: participant!,\n terminateBenefits: values.terminateBenefits!,\n lastDeduction: values.lastDeduction,\n });\n },\n });\n const handleSearchStarted = compose(setSearching, T);\n\n useEffect(() => {\n form.setFieldValue('numDeductionDates', payDates ? payDates.length : 0);\n }, [ payDates ]); // eslint-disable-line react-hooks/exhaustive-deps\n\n function handleParticipant(p: Participant) {\n setParticipant(!!p.empno ? p : null);\n form.setFieldValue('lastDeduction', '');\n setSearching(false);\n }\n\n function dateToValue(value: string | Dayjs) {\n return dayjs(value, 'YYYY-MM-DD').format('MM/DD/YYYY');\n }\n\n function handleCustomFieldChange(field: string) {\n return (value: string) => {\n form.setFieldValue(field, value);\n };\n }\n\n function lastDeductionSelect() {\n if (participant === undefined) {\n return <p>Please search for a participant.</p>;\n }\n\n if (participant === null) {\n return <FormErrorText message=\"No matching participant was found. Please try again.\" show className=\"w-full\" />;\n }\n\n const payFreq = participant.payfreq || participant.payfreq2 || '';\n\n return (\n <LastDeductionSelect\n payDates={payFreq ? payDates : []}\n value={form.values.lastDeduction ?? ''}\n error={!!form.touched.lastDeduction && !!form.errors.lastDeduction}\n classes={ {\n control: 'w-full last-deduction-select',\n } }\n onDateChange={handleCustomFieldChange('lastDeduction')}\n />\n );\n }\n\n return (\n <>\n <form className=\"terminate-participant-form\">\n <p className=\"w-full my-8\">\n Enter the date all benefits should terminate and the last deduction date for the employee.\n </p>\n <div className=\"flex flex-col space-y-8\">\n <div className=\"w-full\">\n <PayrollIdParticipantLookupInput\n className=\"w-full\"\n onSearchStarted={handleSearchStarted}\n onParticipantFound={handleParticipant}\n name=\"employeeNumber\"\n value={form.values.employeeNumber ?? ''}\n error={!!form.touched.employeeNumber && !!form.errors.employeeNumber}\n helperText={form.touched.employeeNumber && form.errors.employeeNumber}\n onTextChanged={handleCustomFieldChange('employeeNumber')}\n />\n </div>\n\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n label=\"Date Benefits Terminate\"\n inputFormat=\"MM/DD/YYYY\"\n value={form.values.terminateBenefits ? dateToValue(form.values.terminateBenefits) : null}\n onChange={handleDateChange('terminateBenefits', form)}\n InputProps={\n { className: !form.values.terminateBenefits ? 'MuiFormLabel-root' : '' }\n }\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n data-testid=\"date-benefits-terminate\"\n variant=\"outlined\"\n className=\"w-full\"\n {...params}\n error={form.touched.terminateBenefits && Boolean(form.errors.terminateBenefits)}\n helperText={form.touched.terminateBenefits && form.errors.terminateBenefits}\n />\n )}\n />\n </LocalizationProvider>\n\n {lastDeductionSelect()}\n </div>\n <div className=\"flex justify-end space-x-12 my-8\">\n <Button\n color=\"primary\"\n className=\"terminate-participant-cancel\"\n onClick={onCancel}\n >\n Cancel\n </Button>\n\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"button\"\n onClick={form.submitForm}\n className=\"terminate-participant-add\"\n disabled={searching || !participant || payDates === null || !form.isValid}\n >\n Add Participant\n </Button>\n </div>\n </form>\n </>\n );\n}\n\nexport default TerminateParticipantForm;\n","import TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport IconButton from '@mui/material/IconButton';\nimport ClearIcon from '@mui/icons-material/Clear';\nimport { compose, always } from 'ramda';\nimport dayjs from 'dayjs';\n\nimport { TerminateDetails } from './terminate-participant.types';\n\ninterface TerminateParticipantRowProps {\n details: TerminateDetails;\n onRemove: (details: TerminateDetails) => void;\n}\n\nfunction TerminateParticipantRow({ details, onRemove }: TerminateParticipantRowProps) {\n function formatDate(date?: string) {\n if (!date || date.length === 0) {\n return '';\n }\n\n const d = dayjs(date, 'YYYY-MM-DD');\n\n return d.isValid() ? d.format('M/D/YYYY') : '';\n }\n\n return (\n <TableRow>\n <TableCell >{details.participant.fname} {details.participant.lname}</TableCell>\n <TableCell >{details.participant.payrollid}</TableCell>\n <TableCell >{formatDate(details.terminateBenefits)}</TableCell>\n <TableCell >{formatDate(details.lastDeduction)}</TableCell>\n <TableCell>\n <IconButton onClick={compose(onRemove, always(details))} color=\"default\" size=\"large\">\n <ClearIcon />\n </IconButton>\n </TableCell>\n </TableRow>\n );\n}\n\nexport default TerminateParticipantRow;\n","import { useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport Paper from '@mui/material/Paper';\nimport Table from '@mui/material/Table';\nimport TableHead from '@mui/material/TableHead';\nimport TableBody from '@mui/material/TableBody';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport Button from '@mui/material/Button';\nimport AddIcon from '@mui/icons-material/Add';\nimport { compose, T, F, tap } from 'ramda';\n\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { TerminateDetails } from './terminate-participant.types';\nimport withModal from 'components/shared/HOC/WithModal';\nimport TerminateParticipantForm, { TerminateParticipantFormProps } from './TerminateParticipantForm';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport TerminateParticipantRow from './TerminateParticipantRow';\nimport CancelModal from 'components/shared/CancelModal';\nimport request from 'shared/api-request';\nimport Loading from 'components/shared/Loading';\n\nfunction TerminateParticipant() {\n const { compid, iddesc = 'SSN' } = useSelector(selectSelectedCompany) ?? { compid: undefined, iddesc: undefined };\n const handleError = useErrorNotifier();\n const [ terminateParticipants, setTerminateParticipants ] = useState<TerminateDetails[]>([]);\n const [ terminating, setTerminating ] = useState(false);\n\n const [ confirmModalIsOpen, setConfirmModalIsOpen ] = useState(false);\n const showConfirmModal = compose(setConfirmModalIsOpen, T);\n const hideConfirmModal = compose(setConfirmModalIsOpen, F);\n\n const [ cancelModalIsOpen, setCancelModalIsOpen ] = useState(false);\n const showCancelModal = compose(setCancelModalIsOpen, T);\n const hideCancelModal = compose(setCancelModalIsOpen, F);\n\n const [ modalIsOpen, setModalIsOpen ] = useState(false);\n const showAddModal = compose(setModalIsOpen, T);\n const hideAddModal = compose(setModalIsOpen, F);\n\n function handleAddParticipant(details: TerminateDetails) {\n if (hasMaxParticipants()) {\n handleError(new Error('Cannot add more than 10 participants.'));\n\n return;\n }\n\n if (terminateParticipants.some((t) => t.participant.empno === details.participant.empno)) {\n return;\n }\n\n setTerminateParticipants([ ...terminateParticipants, details ]);\n hideAddModal();\n }\n\n function handleRemove(details: TerminateDetails) {\n const index = terminateParticipants.findIndex((d) => d.participant.payrollid === details.participant.payrollid);\n\n if (index > -1) {\n setTerminateParticipants([\n ...terminateParticipants.slice(0, index),\n ...terminateParticipants.slice(index + 1),\n ]);\n }\n }\n\n function handleCancel() {\n setTerminateParticipants([]);\n }\n\n function getPayload() {\n return terminateParticipants.map((detail) => ({\n empno: detail.participant.empno,\n terminateBenefits: detail.terminateBenefits,\n lastDeduction: detail.lastDeduction,\n }));\n }\n\n function handleTerminate() {\n hideConfirmModal();\n\n if (terminateParticipants.length > 0) {\n setTerminating(true);\n const uri = `/api/companies/${compid}/participants`;\n request(uri, { method: 'DELETE', body: getPayload() })\n .then(() => {\n setTerminateParticipants([]);\n setTerminating(false);\n })\n .catch(compose(handleError, tap(compose(setTerminating, F))));\n }\n }\n\n function hasMaxParticipants() {\n return terminateParticipants.length > 9;\n }\n\n function buttons() {\n return (\n <div className=\"flex w-full justify-end space-x-12 my-8\" >\n <Button\n color=\"primary\"\n data-testid=\"terminate-participants-cancel\"\n onClick={showCancelModal}\n >\n Cancel\n </Button>\n\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"button\"\n onClick={showConfirmModal}\n data-testid=\"terminate-participants-button\"\n >\n Terminate Participants\n </Button>\n </div>\n );\n }\n\n function terminateList() {\n return (\n <Paper className=\"p-8\">\n <Table className=\"terminate-participants-table\">\n <TableHead>\n <TableRow>\n <TableCell>Name</TableCell>\n <TableCell>{iddesc || 'SSN'}</TableCell>\n <TableCell>Date Benefits Terminate</TableCell>\n <TableCell>Last Deduction</TableCell>\n <TableCell>Action</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {\n terminateParticipants.map((details) => (\n <TerminateParticipantRow\n key={details.participant.payrollid}\n details={details}\n onRemove={handleRemove}\n />\n ))\n }\n </TableBody>\n </Table>\n {buttons()}\n </Paper>\n );\n }\n\n const AddParticipantModal = withModal<TerminateParticipantFormProps>(TerminateParticipantForm);\n\n return (\n <div className=\"w-full flex flex-col p-4\">\n <h2 className=\"page-title\">Terminate Participant</h2>\n <div className=\"w-full\">\n <div className=\"w-full flex flex-row space-x-8 mb-8\">\n <Paper className=\"w-1/2 py-6 px-4\">\n <p className=\"mb-6 w-2/3\">\n Enter termination dates for up to 10 participants\n to terminate all benefits in which the participant is currently enrolled.\n </p>\n <Button\n className=\"terminate-participant-show-add-modal\"\n variant=\"outlined\"\n color=\"primary\"\n onClick={showAddModal}\n disabled={hasMaxParticipants()}\n data-testid=\"add-terminate-participant\"\n >\n <AddIcon className=\"mr-2\" />\n Add Participant\n </Button>\n {hasMaxParticipants() ? <p>Cannot add more than 10 participants.</p> : <></>}\n </Paper>\n </div>\n { terminateParticipants.length > 0 ? terminateList() : <></> }\n </div>\n <CancelModal\n isOpen={cancelModalIsOpen}\n onCancel={handleCancel}\n onClose={hideCancelModal}\n title=\"Cancel Termination?\"\n prompt=\"This will remove the entered participants and no terminations will be processed.\"\n closeText=\"Proceed with Termination\"\n cancelText=\"Yes, Cancel\"\n />\n <CancelModal\n isOpen={confirmModalIsOpen}\n onCancel={handleTerminate}\n onClose={hideConfirmModal}\n title={`Terminate ${terminateParticipants.length} Participants?`}\n prompt=\"You can't undo this action.\"\n closeText=\"Cancel\"\n cancelText=\"Yes! Terminate\"\n />\n <AddParticipantModal\n isOpen={modalIsOpen}\n classes={ {\n modalContainer: 'bg-surface p-4 w-1/3',\n } }\n title=\"Participant Termination\"\n onClose={hideAddModal}\n onCancel={hideAddModal}\n onAdd={handleAddParticipant}\n />\n { terminating ? <Loading text=\"Terminating participants...\" /> : <></> }\n </div>\n );\n}\n\nexport default TerminateParticipant;\n","import dayjs from 'dayjs';\n\nimport { QeDetails } from 'enter-cobra-qe/cobra-qe.types';\n\ninterface DefinitionProps {\n term: string;\n def?: string | number;\n defClass?: string;\n}\n\nfunction Definition({ term, def = '', defClass = '' }: DefinitionProps) {\n return (\n <div className=\"flex space-x-2\">\n <dt>{term}:</dt>\n <dd className={`font-bold ${defClass}`}>{def}</dd>\n </div>\n );\n}\n\ninterface CobraQeDetailsProps {\n details: QeDetails;\n}\n\nfunction CobraQeDetails({ details }: CobraQeDetailsProps) {\n function formatDate(str?: string) {\n return str ? dayjs(str, 'YYYY-MM-DD').format('M/D/YYYY') : '';\n }\n\n function statusColor(status: string) {\n if (/^terminated/i.test(status)) {\n return 'text-red-600';\n }\n\n if (/^accepted/i.test(status)) {\n return 'text-green-500';\n }\n\n return '';\n }\n\n return (\n <div className=\"w-full p-6 border border-solid border-neutral5 rounded-md\">\n <dl className=\"space-y-6 text-base text-med-em\">\n <Definition term=\"Status\" def={details.statusMessage} defClass={statusColor(details.statusMessage)} />\n <Definition term=\"Date Letter Sent\" def={formatDate(details.letterSent)} />\n <Definition term=\"Letter Doc #\" def={details.letterDoc} />\n <Definition term=\"Resp Postmark\" def={formatDate(details.postmark)} />\n <Definition term=\"Response Doc #\" def={details.responseDoc} />\n <Definition term=\"Cover Ends\" def={formatDate(details.coverageEnds)} />\n <Definition term=\"Coverage Term Sent\" def={formatDate(details.coverageTermSent)} />\n <Definition term=\"ARPA Eligible\" def={details.arpaEligible} />\n <Definition term=\"ARPA Enrolled\" def={details.arpaEnrolled} />\n </dl>\n </div>\n );\n}\n\nexport default CobraQeDetails;\n","/* istanbul ignore next */ // Since this is just concatenating existing\nimport { validationSchema as eventSchema } from 'enter-cobra-qe/event-info/event-info.validators';\nimport { validationSchema as benefitsSchema } from 'enter-cobra-qe/benefits/cobra-benefits.validators';\n\nexport const validationSchema = eventSchema.concat(benefitsSchema);\n/* istanbul ignore stop */\n","import { useEffect } from 'react';\nimport { useFormikContext } from 'formik';\n\nimport { leafPath } from 'shared/utils';\n\nconst FormikErrorFocus = () => {\n const { errors, isSubmitting, isValidating } = useFormikContext();\n\n useEffect(() => {\n if (isSubmitting && !isValidating) {\n let name = leafPath(errors);\n\n if (name) {\n const selector = `[name=\"${name}\"]`;\n const errorElement = document.querySelector<HTMLElement>(selector);\n\n errorElement?.focus();\n }\n }\n }, [ errors, isSubmitting, isValidating ]);\n\n return null;\n};\n\nexport default FormikErrorFocus;\n","import { useEffect, useState, useRef } from 'react';\nimport { useFormik, FormikProvider } from 'formik';\nimport Button from '@mui/material/Button';\nimport dayjs from 'dayjs';\nimport { compose, tap, always, omit } from 'ramda';\nimport { useSelector } from 'react-redux';\n\nimport { conformToForm, conformToSlice, hashCoveredDependents } from 'enter-cobra-qe/benefits/benefit-state-helpers';\nimport { Benefit, Dependent } from 'shared/types/non-plan-year.types';\nimport { CobraQe, QeBenefits, CobraQePlusPlans, QeEventInfo } from 'enter-cobra-qe/cobra-qe.types';\nimport EventInfoForm from 'enter-cobra-qe/event-info/EventInfoForm';\nimport CobraQeDetails from './CobraQeDetails';\nimport BenefitsForm from 'enter-cobra-qe/benefits/BenefitsForm';\nimport { validationSchema } from './update-cobra-qe.validators';\nimport FormikErrorFocus from 'components/shared/FormikErrorFocus';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { getCobraAvailablePlans, getNoBenefitsMessage } from 'shared/api/cobraQeApi';\nimport { selectSelectedCompany } from 'companies/companies.slice';\n\ninterface UpdateCobraQeFormProps {\n entry: CobraQePlusPlans;\n dependents: Dependent[];\n selectedBenefits: Benefit[];\n onCancel: () => void;\n onSave: (result: CobraQe) => void;\n}\n\ntype UpdateQeValues = QeEventInfo & QeBenefits;\n\nfunction UpdateCobraQeForm({\n entry,\n dependents,\n selectedBenefits,\n onCancel,\n onSave,\n}: UpdateCobraQeFormProps) {\n const [ availablePlans, setAvailablePlans ] = useState<QeBenefits[] | null>(entry.availablePlans);\n const conformBenefits = conformToSlice(dependents, entry.availablePlans);\n const form = useFormik<UpdateQeValues>({\n initialValues: {\n eventDate: entry.eventDate,\n eventType: entry.eventType,\n coverageBegins: entry.coverageBegins,\n paidThrough: entry.paidThrough,\n benefits: conformToForm(selectedBenefits, entry.availablePlans)\n .map(b => hashCoveredDependents(b, dependents)),\n },\n validationSchema,\n onSubmit: (values) => {\n const conformed = conformBenefits(values);\n\n if (!conformed.benefits.length) {\n window.alert('Please fill out at least one benefit');\n\n return;\n }\n\n const cobraQe = {\n ...omit([ 'availablePlans' ], entry),\n ...values,\n eventType: parseInt(values.eventType?.toString() ?? '-1'),\n benefits: conformed.benefits,\n } as unknown as CobraQe;\n\n onSave(cobraQe);\n },\n });\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const mountedRef = useRef(false);\n const { current: setDefault } = useRef(always(undefined));\n const errorNotifier = useErrorNotifier();\n const [ handleError ] = useState(() => compose(\n tap(setDefault),\n errorNotifier,\n ));\n\n useEffect(() => {\n mountedRef.current = true;\n\n if (form.values.coverageBegins && !dayjs(form.values.coverageBegins).format('MM/DD/YYYY').includes('Invalid')) {\n getCobraAvailablePlans(compid, form.values.coverageBegins)\n .then((result) => {\n if (mountedRef.current) {\n setAvailablePlans(result);\n setBenefits(result);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n }\n\n return () => {\n mountedRef.current = false;\n };\n }, [ form.values.coverageBegins, handleError, compid ]); // eslint-disable-line react-hooks/exhaustive-deps\n\n function setBenefits(plans?: QeBenefits[]) {\n if (plans && plans.length > 0) {\n form.setFieldValue('benefits', conformToForm(entry.benefits, plans)\n .map(b => hashCoveredDependents(b, entry.participant.dependents ?? []) as unknown as QeBenefits[]));\n } else {\n form.setFieldValue('benefits', []);\n }\n }\n\n return (\n <form className=\"update-cobra-qe-form w-full\">\n <div className=\"flex flex-col\">\n <FormikProvider value={form}>\n <FormikErrorFocus />\n <div className=\"flex mb-4 space-x-4\">\n <div className=\"w-1/2\">\n <EventInfoForm letterSent={!!entry.details?.letterSent} respPostmark={!!entry.details?.postmark} />\n </div>\n <div className=\"w-1/2\">\n <CobraQeDetails details={entry.details!} />\n </div>\n </div>\n\n <div className=\"flex-grow overflow-auto\">\n {\n availablePlans?.length\n ? (\n <BenefitsForm\n dependents={dependents}\n availablePlans={availablePlans}\n letterSent={!!entry.details?.letterSent}\n respPostmark={!!entry.details?.postmark}\n />\n )\n : <p>{getNoBenefitsMessage(dayjs(form.values.coverageBegins).format('MM/DD/YYYY'))}</p>\n }\n </div>\n </FormikProvider>\n <div className=\"flex justify-end my-4 h-8\">\n <Button\n className=\"update-qe-form-cancel\"\n color=\"primary\"\n onClick={compose(onCancel, always(undefined))}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n data-testid=\"update-qe-form-save\"\n className=\"ml-8 update-qe-form-save\"\n type=\"button\"\n onClick={form.submitForm}\n disabled={!!entry.details?.postmark}\n >\n Save QE\n </Button>\n </div>\n </div>\n </form>\n );\n}\n\nexport default UpdateCobraQeForm;\n","import { useState, useRef, useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { compose, tap, always } from 'ramda';\n\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { CobraQePlusPlans } from 'enter-cobra-qe/cobra-qe.types';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { getCobraQe } from 'shared/api/cobraQeApi';\nimport store from 'store';\n\nexport function useCobraQe(employeeNumber: string, cQualId: number) {\n const dispatch = useDispatch<typeof store.dispatch>();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const [ entry, setEntry ] = useState<CobraQePlusPlans | undefined | null>(null);\n\n const setDefault = compose(setEntry, always(undefined));\n const handleError = compose(\n tap(setDefault),\n dispatch,\n addHttpErrorNotification,\n );\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n getCobraQe(compid, employeeNumber, cQualId)\n .then((result) => {\n if (mountedRef.current) {\n setEntry(result);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n\n return () => {\n mountedRef.current = false;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ employeeNumber, cQualId, compid ]);\n\n return entry;\n}\n","import { useHistory } from 'react-router';\nimport { useParams } from 'react-router-dom';\nimport { useSelector } from 'react-redux';\nimport { compose, T, F } from 'ramda';\n\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport Loading from 'components/shared/Loading';\nimport UpdateCobraQeForm from './UpdateCobraQeForm';\nimport { CobraQe } from 'enter-cobra-qe/cobra-qe.types';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { updateCobraQe } from 'shared/api/cobraQeApi';\nimport { useCobraQe } from './useCobraQe';\nimport { useState } from 'react';\nimport { usePageTitle } from 'shared/custom-hooks/usePageTitle';\nimport { selectParticipant } from 'participant-search/participant.slice';\nimport { selectSelectedCompany } from 'companies/companies.slice';\n\nfunction UpdateCobraQe() {\n usePageTitle('Update COBRA QE');\n const history = useHistory();\n const { empno } = useSelector(selectParticipant) ?? { empno: '' };\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const { cQualId } = useParams<{cQualId:string;}>();\n\n const handleError = useErrorNotifier();\n\n const entry = useCobraQe(empno, parseInt(cQualId));\n const [ saving, setSaving ] = useState(false);\n const startSaving = compose(setSaving, T);\n const doneSaving = compose(setSaving, F);\n\n function handleClose() {\n history.goBack();\n }\n\n function handleSave(cobraQe: CobraQe) {\n startSaving();\n updateCobraQe(compid, cobraQe)\n .then(handleClose)\n .catch(handleError)\n .finally(doneSaving);\n }\n\n function content() {\n return (\n <>\n <PageContentPaper className=\"mt-4\">\n <UpdateCobraQeForm\n onCancel={handleClose}\n onSave={handleSave}\n dependents={entry!.participant.dependents ?? []}\n selectedBenefits={entry!.benefits}\n entry={entry!}\n />\n </PageContentPaper>\n { saving && <Loading text=\"Saving QE...\" /> }\n </>\n );\n }\n\n function couldNotLoad() {\n return (\n <PageContentPaper className=\"mt-4\">\n <p>There was a problem loading the QE. Please contact your Account Manager.</p>\n </PageContentPaper>\n );\n }\n\n switch (entry) {\n case null: return <Loading text=\"Loading QE Entry...\" />;\n case undefined: return couldNotLoad();\n default: return content();\n }\n}\n\nexport default UpdateCobraQe;\n","import { useState, useRef, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { compose, tap, always } from 'ramda';\n\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { OpenPlan } from 'plan-enrollment/plan-enrollment.types';\nimport { getBalanceReportPlans } from 'shared/api/balanceReportsByDateRangeApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\n\nexport function useBalanceReportPlans() {\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const [ plans, setPlans ] = useState<OpenPlan[] | null>(null);\n const [ setDefault ] = useState(() => compose(setPlans, always([])));\n const handleError = compose(\n tap(setDefault),\n useErrorNotifier(),\n );\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n getBalanceReportPlans(compid)\n .then((result) => {\n if (mountedRef.current) {\n setPlans(result?.map((n, i) => ({ ...n, unqid: i })) ?? []);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n\n return () => {\n mountedRef.current = false;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ compid, setPlans ]);\n\n return plans;\n}\n","import request from '../api-request';\nimport { OpenPlan } from 'plan-enrollment/plan-enrollment.types';\n\nexport function getBalanceReportPlans(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get balance plans for invalid company.'));\n }\n\n return request<OpenPlan[]>(`/api/companies/${companyId}/report-balance-plans`);\n}\n","import { PropsWithChildren } from 'react';\nimport Paper from '@mui/material/Paper';\n\nfunction GraySummaryTile({ children }: PropsWithChildren<{}>) {\n return (\n <Paper className=\"flex flex-col bg-neutral6 p-4 pt-6 rounded\" elevation={0}>\n {children}\n </Paper>\n );\n}\n\nexport default GraySummaryTile;\n","import IconButton from '@mui/material/IconButton';\nimport ExportIcon from '@mui/icons-material/SystemUpdateAlt';\nimport { always, cond, equals, T } from 'ramda';\n\ninterface ReportExportButtonProps {\n onExport: () => void;\n disabled?: boolean;\n downloading?: boolean;\n title: string;\n variant?: 'light' | 'dark';\n}\n\nfunction ReportExportButton({\n onExport,\n disabled = false,\n downloading = false,\n title,\n variant = 'light',\n}: ReportExportButtonProps) {\n function handleClick() {\n if (!disabled) {\n onExport();\n }\n }\n\n // Compare against a tuple of [variant, disabled]\n const textClasses = cond([\n [ equals([ 'light', true ]), always('text-low-em') ],\n [ equals([ 'dark', true ]), always('text-white opacity-25') ],\n [ equals([ 'dark', false ]), always('text-white') ],\n [ T, always('text-high-em') ],\n ]) as any;\n\n return (\n <IconButton\n onClick={handleClick}\n disabled={disabled}\n data-testid=\"balance-reports-enrollment-export-btn\"\n className={`${textClasses([ variant, disabled ])} ${downloading && 'animate-ping'}`}\n size=\"large\"\n >\n <ExportIcon fontSize=\"small\" titleAccess={title} />\n </IconButton>\n );\n}\n\nexport default ReportExportButton;\n","import { useEffect, useState } from 'react';\nimport dayjs from 'dayjs';\nimport { useSelector } from 'react-redux';\nimport { compose, tap, always } from 'ramda';\n\nimport { OpenPlan } from 'plan-enrollment/plan-enrollment.types';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { getEnrollmentSummary, downloadEnrollmentSummary } from 'shared/api/reportsApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport GraySummaryTile from 'reports/shared/GraySummaryTile';\nimport ReportExportButton from 'reports/shared/ReportExportButton';\nimport AdapterDayJS from '@mui/lab/AdapterDayjs';\nimport LocalizationProvider from '@mui/lab/LocalizationProvider';\nimport DatePicker from '@mui/lab/DatePicker';\nimport TextField from '@mui/material/TextField';\n\ninterface EnrollmentRosterTileProps {\n selectedPlan?: OpenPlan;\n}\n\nfunction EnrollmentRosterTile({ selectedPlan }: EnrollmentRosterTileProps) {\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const [ date, setDate ] = useState<string | null>(dayjs().format('YYYY-MM-DD'));\n const [ dateHasError, setDateHasError ] = useState(false);\n const [ enrollment, setEnrollment ] = useState<number | null>(0);\n const [ downloading, setDownloading ] = useState(false);\n\n const errorNotifier = useErrorNotifier();\n const [ handleError ] = useState(() => compose(\n tap(compose(setEnrollment, always(0))),\n errorNotifier,\n ));\n\n const Enrollment = withLoopIcon(enrollmentCount, '', enrollment === null);\n\n useEffect(() => {\n if (!dateHasError && date && selectedPlan) {\n setEnrollment(null);\n getEnrollmentSummary(compid, selectedPlan.pyrid, selectedPlan.plcid, false, date)\n .then((data) => setEnrollment(data ?? 0))\n .catch(handleError);\n }\n }, [ compid, selectedPlan, handleError, date, dateHasError ]);\n\n function handleExport() {\n if (!dateHasError && date && selectedPlan) {\n setDownloading(true);\n downloadEnrollmentSummary(compid, selectedPlan.pyrid, selectedPlan.plcid, false, date)\n .catch(handleError)\n .finally(() => setDownloading(false));\n }\n }\n\n function handleDateChange(newDate: any) {\n setDateHasError(!newDate || !newDate.isValid());\n setDate(newDate?.format('YYYY-MM-DD') ?? '');\n }\n\n function enrollmentCount() {\n return (\n <h4 data-testid=\"balance-reports-enrollment-loaded\" className=\"text-high-em text-3xl font-bold\">\n {enrollment}\n </h4>\n );\n }\n\n return (\n <GraySummaryTile>\n <div>\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n label=\"Report Start Date\"\n inputFormat=\"MM/DD/YYYY\"\n value={date ? dayjs(date, 'YYYY-MM-DD').format('MM/DD/YYYY') : null}\n onChange={handleDateChange}\n InputProps={\n {\n className: !date ? 'MuiFormLabel-root' : '',\n }\n }\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n data-testid=\"balance-reports-enrollment-start\"\n variant=\"outlined\"\n name=\"partEnd\"\n className=\"w-full\"\n {...params}\n error={dateHasError}\n helperText={dateHasError && 'Please enter a valid date.'}\n />\n )}\n />\n </LocalizationProvider>\n </div>\n <div className=\"mt-4\"><Enrollment /></div>\n <h5 className=\"text-high-em my-4 text-base\">Enrollment Roster</h5>\n <p className=\"text-gray-chateu\">Live data of participants enrolled in each plan as selected.</p>\n <div className=\"mt-12\" />\n <hr className=\"my-4\" />\n <div className=\"w-full flex justify-end\">\n <ReportExportButton\n onExport={handleExport}\n disabled={enrollment === null || downloading}\n downloading={downloading}\n title=\"Export enrollment report\"\n />\n </div>\n </GraySummaryTile>\n );\n}\n\nexport default EnrollmentRosterTile;\n","import Paper from '@mui/material/Paper';\nimport { isNil } from 'ramda';\n\nimport ReportExportButton from '../shared/ReportExportButton';\nimport { noop } from 'shared/utils';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\n\nexport type Variant = 'primary-main' | 'primary-dark';\n\ninterface ColorClasses {\n background: string;\n titleText: string;\n descriptionText: string;\n}\n\nconst variantMap = new Map<Variant | undefined, ColorClasses>([\n [\n 'primary-main', {\n background: 'bg-primary-main',\n titleText: 'text-white',\n descriptionText: 'text-white opacity-75',\n },\n ],\n [\n 'primary-dark', {\n background: 'bg-primary-dark',\n titleText: 'text-white',\n descriptionText: 'text-white opacity-75',\n },\n ],\n [\n undefined, {\n background: '',\n titleText: 'text-high-em',\n descriptionText: 'text-gray-chateu',\n },\n ],\n]);\n\ninterface ReportsTileProps {\n count: number | null;\n title: string;\n description: string;\n variant?: Variant;\n onExport?: () => void;\n exportDisabled?: boolean;\n downloading?: boolean;\n}\n\nfunction ReportsTile({\n count,\n title,\n description,\n variant,\n onExport = noop,\n exportDisabled,\n downloading,\n}: ReportsTileProps) {\n const variantClasses = variantMap.get(variant);\n\n function countHeading() {\n return (\n <h4 className={`text-3xl font-bold ${variantClasses?.titleText}`}>\n { count }\n </h4>\n );\n }\n\n const CountWithLoader = withLoopIcon(\n countHeading,\n '',\n isNil(count),\n `w-full ${!isNil(variant) ? 'text-white' : ''} report-count-loading`,\n );\n\n return (\n <Paper elevation={2} className={`p-4 border-neutral5 ${variantClasses?.background}`}>\n <div className=\"flex flex-row justify-between\">\n <CountWithLoader />\n <ReportExportButton\n variant={variant ? 'dark' : 'light'}\n onExport={onExport}\n title={`Export ${title}`}\n disabled={!!exportDisabled}\n downloading={!!downloading}\n />\n </div>\n <h5 className={`text-base ${variantClasses?.titleText}`}>\n { title }\n </h5>\n <p className={`mt-4 ${variantClasses?.descriptionText}`}>\n { description }\n </p>\n </Paper>\n );\n}\n\nexport default ReportsTile;\n","import { useEffect, useState } from 'react';\nimport dayjs from 'dayjs';\nimport Button from '@mui/material/Button';\nimport AdapterDayJS from '@mui/lab/AdapterDayjs';\nimport DatePicker from '@mui/lab/DatePicker';\nimport LocalizationProvider from '@mui/lab/LocalizationProvider';\nimport TextField from '@mui/material/TextField';\n\ninterface ReportDateRangeFilterProps {\n onFilterChange: (start: string, end: string) => void;\n applyOnInit?: boolean;\n}\n\nfunction ReportDateRangeFilter({ onFilterChange, applyOnInit }: Readonly<ReportDateRangeFilterProps>) {\n const [ startDate, setStartDate ] = useState<string>(dayjs().format('YYYY-MM-DD'));\n const [ endDate, setEndDate ] = useState<string>(dayjs().format('YYYY-MM-DD'));\n const [ dateHasError, setDateHasError ] = useState(false);\n\n function handleStartDateChange(newDate: any) {\n setDateHasError(!newDate || !newDate.isValid());\n setStartDate(newDate?.format('YYYY-MM-DD') ?? '');\n }\n\n function handleEndDateChange(newDate: any) {\n setDateHasError(!newDate || !newDate.isValid());\n setEndDate(newDate?.format('YYYY-MM-DD') ?? '');\n }\n\n function handleApply() {\n if (!dateHasError) {\n onFilterChange(startDate, endDate);\n }\n }\n\n useEffect(() => {\n if (applyOnInit) {\n handleApply();\n }\n // want the use effect to only ever run once\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <div className=\"flex flex-row justify-between\" data-testid=\"date-range-filter\">\n <div className=\"pr-4\">\n <p className=\"text-high-em\">\n If a date range is not entered, the report will be generated with today's date as the default.\n </p>\n </div>\n <div>\n <div className=\"flex flex-row justify-between\">\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n label=\"Report Start Date\"\n inputFormat=\"MM/DD/YYYY\"\n value={startDate ? dayjs(startDate, 'YYYY-MM-DD').format('MM/DD/YYYY') : null}\n onChange={handleStartDateChange}\n InputProps={\n {\n className: `${!startDate ? 'MuiFormLabel-root' : ''} text-sm`,\n classes: {\n input: 'px-2 py-3',\n adornedEnd: 'pr-1',\n },\n }\n }\n InputAdornmentProps={ { classes: { positionEnd: 'ml-1' } } }\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n data-testid=\"monthly-report-date-range-filter-start\"\n variant=\"outlined\"\n className=\"w-full\"\n {...params}\n error={dateHasError}\n helperText={dateHasError && 'Please enter valid dates.'}\n />\n )}\n />\n </LocalizationProvider>\n\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n className=\"ml-4\"\n label=\"Report End Date\"\n inputFormat=\"MM/DD/YYYY\"\n value={endDate ? dayjs(endDate, 'YYYY-MM-DD').format('MM/DD/YYYY') : null}\n onChange={handleEndDateChange}\n InputProps={\n {\n className: `${!endDate ? 'MuiFormLabel-root' : ''} text-sm`,\n classes: {\n input: 'px-2 py-3',\n adornedEnd: 'pr-1',\n },\n }\n }\n InputAdornmentProps={ { classes: { positionEnd: 'ml-1' } } }\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n data-testid=\"monthly-report-date-range-filter-end\"\n variant=\"outlined\"\n className=\"w-full\"\n {...params}\n error={dateHasError}\n helperText={dateHasError && 'Please enter valid dates.'}\n />\n )}\n />\n </LocalizationProvider>\n\n <Button\n className=\"ml-4\"\n variant=\"outlined\"\n color=\"primary\"\n onClick={handleApply}\n disabled={dateHasError}\n >\n Apply\n </Button>\n </div>\n </div>\n </div>\n );\n}\n\nexport default ReportDateRangeFilter;\n","import { useEffect, useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport { always, compose, tap } from 'ramda';\nimport dayjs from 'dayjs';\n\nimport { OpenPlan } from 'plan-enrollment/plan-enrollment.types';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport ReportsTile from 'reports/shared/ReportsTile';\nimport {\n getBalanceReportCounts,\n downloadReimbursementReport,\n downloadReimbursementRecapReport,\n downloadBalanceByLocationReport,\n downloadBalanceByPayFrequencyReport,\n} from 'shared/api/reportsApi';\nimport { BalanceAccountCount } from 'reports/balance/balance-account.types';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport ReportDateRangeFilter from 'reports/shared/ReportDateRangeFilter';\n\ninterface ReportsByDateRangeProps {\n selectedPlan?: OpenPlan;\n}\n\nfunction ReportsByDateRange({ selectedPlan }: ReportsByDateRangeProps) {\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const [ startDate, setStartDate ] = useState<string | null>(dayjs().format('MM/DD/YYYY'));\n const [ endDate, setEndDate ] = useState<string | null>(dayjs().format('MM/DD/YYYY'));\n const [ counts, setCounts ] = useState<BalanceAccountCount | null>(null);\n const [ downloadingBalance, setDownloadingBalance ] = useState(false);\n const [ downloadingReimbursement, setDownloadingReimbursement ] = useState(false);\n const [ downloadingBalanceByLocation, setDownloadingBalanceByLocation ] = useState(false);\n const [ downloadingBalanceByPayFrequency, setDownloadingBalanceByPayFrequency ] = useState(false);\n\n const Counts = withLoopIcon(makeCountTiles, '', !!selectedPlan && !counts && !!startDate && !!endDate);\n\n const errorNotifier = useErrorNotifier();\n const [ handleError ] = useState(() => compose(\n tap(compose(setCounts, always(null))),\n errorNotifier,\n ));\n\n useEffect(() => {\n if (startDate && endDate && selectedPlan) {\n setCounts(null);\n getBalanceReportCounts(\n compid,\n selectedPlan.pyrid,\n selectedPlan.plcid,\n startDate,\n endDate,\n )\n .then(setCounts)\n .catch(handleError);\n }\n }, [ compid, endDate, startDate, selectedPlan, handleError ]);\n\n function handleApply(start: string, end: string) {\n setStartDate(start);\n setEndDate(end);\n }\n\n function handleBalanceExport() {\n if (selectedPlan) {\n setDownloadingBalance(true);\n downloadReimbursementReport(compid, selectedPlan.pyrid, selectedPlan.plcid, false, startDate || '', endDate || '')\n .catch(handleError)\n .finally(() => setDownloadingBalance(false));\n }\n }\n\n function handleBalanceByLocationExport() {\n if (selectedPlan) {\n setDownloadingBalanceByLocation(true);\n downloadBalanceByLocationReport(compid, selectedPlan.pyrid, selectedPlan.plcid, startDate || '', endDate || '')\n .catch(handleError)\n .finally(() => setDownloadingBalanceByLocation(false));\n }\n }\n\n function handleBalanceByPayFrequencyExport() {\n if (selectedPlan) {\n setDownloadingBalanceByPayFrequency(true);\n downloadBalanceByPayFrequencyReport(\n compid,\n selectedPlan.pyrid,\n selectedPlan.plcid,\n startDate || '',\n endDate || '')\n .catch(handleError)\n .finally(() => setDownloadingBalanceByPayFrequency(false));\n }\n }\n\n function handleReimbursementRecapExport() {\n if (selectedPlan) {\n setDownloadingReimbursement(true);\n downloadReimbursementRecapReport(compid, selectedPlan.pyrid, selectedPlan.plcid,\n startDate || '', endDate || '')\n .catch(handleError)\n .finally(() => setDownloadingReimbursement(false));\n }\n }\n\n function makeCountTiles() {\n return !counts\n ? <></>\n : (\n <div className=\"grid grid-cols-4 gap-4 mt-4\" data-testid=\"balance-reports-counts-loaded\" >\n <ReportsTile\n count={counts.reimbursement}\n title=\"Reimbursement Recap\"\n description=\"Monthly Breakdown of total dollars reimbursed in each plan.\"\n exportDisabled={downloadingReimbursement}\n onExport={handleReimbursementRecapExport}\n downloading={downloadingReimbursement}\n />\n <ReportsTile\n count={counts.balance}\n title=\"Balance Report\"\n description=\"Live data of contributions and reimbursement per participant per plan.\"\n exportDisabled={downloadingBalance}\n onExport={handleBalanceExport}\n downloading={downloadingBalance}\n />\n <ReportsTile\n count={counts.balance}\n title=\"Balances by Location\"\n description=\"Live data of contributions and reimbursements per participant, per plan, per location.\n Locations are notated by sheets at the bottom of the excel spreadsheet.\"\n exportDisabled={downloadingBalanceByLocation}\n onExport={handleBalanceByLocationExport}\n downloading={downloadingBalanceByLocation}\n />\n <ReportsTile\n count={counts.balance}\n title=\"Balances By Pay Frequency\"\n description=\"Live data of contributions and reimbursements per participant, per plan, per pay\n frequency. Pay frequencies are notated by the sheets at the bottom of the excel spreadsheet.\"\n exportDisabled={downloadingBalanceByPayFrequency}\n onExport={handleBalanceByPayFrequencyExport}\n downloading={downloadingBalanceByPayFrequency}\n />\n </div>\n );\n }\n\n return (\n <div>\n <ReportDateRangeFilter onFilterChange={handleApply} />\n <div>\n <Counts />\n </div>\n </div>\n );\n}\n\nexport default ReportsByDateRange;\n","import { useState, useRef, useEffect } from 'react';\nimport { compose, tap, always } from 'ramda';\nimport { useSelector } from 'react-redux';\n\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { getDeductionDates } from 'shared/api/companiesApi';\nimport { SelectOption } from 'shared/types/form.types';\nimport { mapToSelectOption } from 'shared/form-helpers';\n\nexport function useDeductionDateOptions() {\n const errorNotifier = useErrorNotifier();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const [ deductionOptions, setDeductionOptions ] = useState<SelectOption[] | null>(null);\n\n const [ setDefault ] = useState(() => compose(setDeductionOptions, always([])));\n const [ handleError ] = useState(() => compose(tap(setDefault), errorNotifier));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n getDeductionDates(compid)\n .then((dates) => mapToSelectOption(dates ?? [], 'payFrequencies', 'payDate'))\n .then((result) => {\n if (mountedRef.current) {\n setDeductionOptions(result);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n\n return () => {\n mountedRef.current = false;\n };\n }, [ handleError, compid ]);\n\n return deductionOptions;\n}\n\n","import { useEffect, useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport { compose, tap, always } from 'ramda';\n\nimport { OpenPlan } from 'plan-enrollment/plan-enrollment.types';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { getReductionListTotal, downloadReductionList } from 'shared/api/reportsApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport GraySummaryTile from 'reports/shared/GraySummaryTile';\nimport ReportExportButton from 'reports/shared/ReportExportButton';\nimport { useDeductionDateOptions } from 'reports/useDeductionDateOptions';\nimport CommonSelect from 'components/shared/form/CommonSelect';\nimport { currencyFormatter } from 'shared/utils';\n\ninterface ReductionListTileProps {\n selectedPlan?: OpenPlan;\n}\n\nfunction ReductionListTile({ selectedPlan }: ReductionListTileProps) {\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n const deductionOptions = useDeductionDateOptions();\n\n const [ payDate, setPayDate ] = useState('');\n const [ total, setTotal ] = useState<number | null>(0);\n const [ downloading, setDownloading ] = useState(false);\n\n const errorNotifier = useErrorNotifier();\n const [ handleError ] = useState(() => compose(\n tap(compose(setTotal, always(0))),\n errorNotifier,\n ));\n\n useEffect(() => {\n if (compid && selectedPlan && payDate.length > 0) {\n handlePayDateChange(payDate);\n }\n }, [ compid, selectedPlan, payDate ]); // eslint-disable-line react-hooks/exhaustive-deps\n\n function handleExport() {\n if (compid && selectedPlan && payDate.length > 0) {\n setDownloading(true);\n downloadReductionList(compid, selectedPlan.pyrid, selectedPlan.plcid, payDate)\n .catch(handleError)\n .finally(() => setDownloading(false));\n }\n }\n\n function handlePayDateChange(date: string) {\n setPayDate(date);\n\n if (compid && selectedPlan) {\n setTotal(null);\n getReductionListTotal(compid, selectedPlan.pyrid, selectedPlan.plcid, date)\n .then(setTotal)\n .catch(handleError);\n }\n }\n\n function reductionTotal() {\n return (\n <h4 data-testid=\"balance-reports-reduction-total-loaded\" className=\"text-high-em text-3xl font-bold\">\n {currencyFormatter.format(total ?? 0)}\n </h4>\n );\n }\n\n const DeductionDateSelect = withLoopIcon(CommonSelect, 'Loading deduction dates...', deductionOptions === null);\n const ReductionTotal = withLoopIcon(reductionTotal, '', total === null);\n\n return (\n <GraySummaryTile>\n <div>\n <DeductionDateSelect\n options={deductionOptions!}\n onSelectChange={handlePayDateChange}\n value={payDate}\n label=\"Deduction Date\"\n name=\"deduction-date\"\n />\n </div>\n <div className=\"mt-4\"><ReductionTotal /></div>\n <h5 className=\"text-high-em my-4 text-base\">Reduction List</h5>\n <p className=\"text-gray-chateu\">Live data of the amount per pay period\n we expect each participant to contribute based on their annual election, per plan.\n </p>\n <hr className=\"my-4\" />\n <div className=\"w-full flex justify-end\">\n <ReportExportButton\n onExport={handleExport}\n disabled={total === null || payDate === '' || downloading}\n downloading={downloading}\n title=\"Export enrollment report\"\n />\n </div>\n </GraySummaryTile>\n );\n}\n\nexport default ReductionListTile;\n","import { useEffect, useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport { always, compose, tap } from 'ramda';\n\nimport ReportsTile from 'reports/shared/ReportsTile';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { OpenPlan } from 'plan-enrollment/plan-enrollment.types';\nimport { downloadDebitCardWarnings, getDebitCardWarningsTotal } from 'shared/api/reportsApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\n\ninterface DebitCardWarningsProps {\n selectedPlan?: OpenPlan;\n}\n\nfunction DebitCardWarnings({ selectedPlan }: DebitCardWarningsProps) {\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const [ count, setCount ] = useState<number | null>(0);\n const [ downloading, setDownloading ] = useState(false);\n\n const errorNotifier = useErrorNotifier();\n const [ handleError ] = useState(() => compose(\n tap(compose(setCount, always(0))),\n errorNotifier,\n ));\n\n useEffect(() => {\n if (selectedPlan) {\n setCount(null);\n getDebitCardWarningsTotal(\n compid,\n selectedPlan.pyrid,\n )\n .then(setCount)\n .catch(handleError);\n }\n }, [ selectedPlan, compid, handleError ]);\n\n function handleExport() {\n if (selectedPlan) {\n setDownloading(true);\n downloadDebitCardWarnings(compid, selectedPlan.pyrid)\n .catch(handleError)\n .finally(() => setDownloading(false));\n }\n }\n\n return (\n <ReportsTile\n data-testid=\"debit-card-warnings-loaded\"\n count={count}\n title=\"Debit Card Warnings\"\n description=\"List of participants who have outstanding requests for debit card substantiation.\"\n variant=\"primary-main\"\n exportDisabled={downloading}\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n\nexport default DebitCardWarnings;\n","import { useEffect, useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport { always, compose, tap } from 'ramda';\n\nimport ReportsTile from 'reports/shared/ReportsTile';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { OpenPlan } from 'plan-enrollment/plan-enrollment.types';\nimport {\n downloadUnsubstantiatedDebitCard,\n getUnsubstantiatedDebitCardTotal,\n} from 'shared/api/reportsApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\n\ninterface UnsubstantiatedDebitCardProps {\n selectedPlan?: OpenPlan;\n}\n\nfunction UnsubstantiatedDebitCard({ selectedPlan }: UnsubstantiatedDebitCardProps) {\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const [ count, setCount ] = useState<number | null>(0);\n const [ downloading, setDownloading ] = useState(false);\n\n const errorNotifier = useErrorNotifier();\n const [ handleError ] = useState(() => compose(\n tap(compose(setCount, always(0))),\n errorNotifier,\n ));\n\n useEffect(() => {\n if (selectedPlan) {\n setCount(null);\n getUnsubstantiatedDebitCardTotal(\n compid,\n selectedPlan.pyrid,\n )\n .then(setCount)\n .catch(handleError);\n }\n }, [ selectedPlan, compid, handleError ]);\n\n function handleExport() {\n if (selectedPlan) {\n setDownloading(true);\n downloadUnsubstantiatedDebitCard(compid, selectedPlan.pyrid)\n .catch(handleError)\n .finally(() => setDownloading(false));\n }\n }\n\n return (\n <ReportsTile\n count={count}\n title=\"Unsubstantiated Debit Card\"\n description=\"List of unsubstantiated debit card changes.\"\n variant=\"primary-main\"\n exportDisabled={downloading}\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n\nexport default UnsubstantiatedDebitCard;\n","import { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport ReportsTile from 'reports/shared/ReportsTile';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport {\n downloadContributionsNotForwarded,\n} from 'shared/api/contributionsNotForwardedApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { loadContributionsNotForwardedCount, selectContributionsNotForwardedCount } from 'reports/reports.slice';\nimport store from 'store';\n\nfunction ContributionsNotForwarded() {\n const dispatch = useDispatch<typeof store.dispatch>();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const count = useSelector(selectContributionsNotForwardedCount);\n const [ downloading, setDownloading ] = useState(false);\n\n useEffect(() => {\n dispatch(loadContributionsNotForwardedCount(compid));\n }, [ dispatch, compid ]);\n\n const errorNotifier = useErrorNotifier();\n\n function handleExport() {\n setDownloading(true);\n downloadContributionsNotForwarded(compid)\n .catch(errorNotifier)\n .finally(() => setDownloading(false));\n }\n\n return (\n <ReportsTile\n count={count}\n title=\"HSA Contributions Not Forwarded\"\n description=\"This report lists contributions that are pending deposit\n either due to a failed CIP result, or missing applicant details.\"\n variant=\"primary-dark\"\n exportDisabled={downloading}\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n\nexport default ContributionsNotForwarded;\n","import { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport ReportsTile from 'reports/shared/ReportsTile';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport {\n downloadAnnualAllocationAudit,\n} from 'shared/api/annualAllocationAuditApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport {\n loadAnnualAllocationAuditCount,\n selectAnnualAllocationAuditCount,\n} from 'reports/reports.slice';\nimport { OpenPlan } from 'plan-enrollment/plan-enrollment.types';\nimport store from 'store';\n\ninterface AnnualAllocationAuditProps {\n selectedPlan?: OpenPlan;\n}\n\nfunction AnnualAllocationAudit({ selectedPlan }: AnnualAllocationAuditProps) {\n const dispatch = useDispatch<typeof store.dispatch>();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const count = useSelector(selectAnnualAllocationAuditCount);\n const [ downloading, setDownloading ] = useState(false);\n\n useEffect(() => {\n if (selectedPlan) {\n dispatch(loadAnnualAllocationAuditCount(compid, selectedPlan.pyrid));\n }\n }, [ dispatch, compid, selectedPlan ]);\n\n const errorNotifier = useErrorNotifier();\n\n function handleExport() {\n if (selectedPlan) {\n setDownloading(true);\n downloadAnnualAllocationAudit(compid, selectedPlan.pyrid)\n .catch(errorNotifier)\n .finally(() => setDownloading(false));\n }\n }\n\n return (\n <ReportsTile\n count={count}\n title=\"Annual Allocation Audit\"\n description=\"This report contains the annual allocation audit for the given plan year.\"\n variant=\"primary-dark\"\n exportDisabled={downloading}\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n\nexport default AnnualAllocationAudit;\n","import React, { useState, useEffect } from 'react';\n\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport PlanSelect from 'plan-enrollment/plan-selection/PlanSelect';\nimport { useBalanceReportPlans } from './hooks/useBalanceReportPlans';\nimport EnrollmentRosterTile from './EnrollmentRosterTile';\nimport { OpenPlan } from 'plan-enrollment/plan-enrollment.types';\nimport ReportsByDateRange from 'reports/balance/ReportsByDateRange';\nimport ReductionListTile from './ReductionListTile';\nimport DebitCardWarnings from 'reports/balance/DebitCardWarnings';\nimport UnsubstantiatedDebitCard from 'reports/balance/UnsubstantiatedDebitCard';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport ContributionsNotForwarded from 'reports/balance/ContributionsNotForwarded';\nimport AnnualAllocationAudit from './AnnualAllocationAudit';\n\nconst allowedPlanCodes = [ 'D', 'H', 'M', 'S', 'T' ];\n\nfunction BalanceAccountReports() {\n const plans = useBalanceReportPlans();\n const [ selectedPlan, setSelectedPlan ] = useState<OpenPlan | undefined>();\n\n function handlePlanChange(planId?: number) {\n if (planId === undefined || planId < 0) {\n setSelectedPlan(undefined);\n } else if (plans) {\n const plan = plans.find((p) => p.unqid === planId);\n setSelectedPlan(plan);\n }\n }\n\n useEffect(() => {\n if (plans?.length) {\n setSelectedPlan(plans[0]);\n }\n }, [ plans ]);\n\n const PlanSelectWithLoader = withLoopIcon(\n PlanSelect,\n 'Loading plans...',\n plans === null,\n 'w-full plan-enrollment-plans-loading',\n );\n\n return (\n <PageContentPaper>\n <div className=\"w-full\">\n <div className=\"w-1/3\">\n <PlanSelectWithLoader\n name=\"planId\"\n plans={plans?.filter((p) => allowedPlanCodes.includes(p.plccode)) ?? []}\n value={selectedPlan?.unqid}\n error={false}\n onPlanSelected={handlePlanChange}\n showSubPlan={false}\n />\n <small className=\"text-gray-chateu text-xs ml-4\">\n Select the report type to display for all reports below\n </small>\n </div>\n\n <div className=\"py-8 mb-8 border-neutral5 border-solid border-b-2\">\n <div className=\"flex space-x-4\">\n <div className=\"w-1/2\">\n <EnrollmentRosterTile selectedPlan={selectedPlan} />\n </div>\n <div className=\"w-1/2\">\n <ReductionListTile selectedPlan={selectedPlan} />\n </div>\n <div className=\"flex space-x-4\" >\n <div className=\"flex-grow flex flex-col space-y-4\">\n <div className=\"h-1/2 w-full\">\n <DebitCardWarnings selectedPlan={selectedPlan} />\n </div>\n <div className=\"h-1/2 w-full\">\n <UnsubstantiatedDebitCard selectedPlan={selectedPlan} />\n </div>\n </div>\n <div className=\"flex-grow flex flex-col space-y-4\">\n <div className=\"h-1/2 w-full\">\n <AnnualAllocationAudit selectedPlan={selectedPlan} />\n </div>\n {\n selectedPlan?.plccode.toLocaleLowerCase() === 's'\n ? (\n <div className=\"h-1/2 w-full\">\n <ContributionsNotForwarded />\n </div>\n )\n : <></>\n }\n </div>\n </div>\n </div>\n </div>\n\n <ReportsByDateRange selectedPlan={selectedPlan} />\n </div>\n </PageContentPaper>\n );\n}\n\nexport default BalanceAccountReports;\n","import { useEffect, useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport { always, compose, tap } from 'ramda';\nimport dayjs from 'dayjs';\n\nimport { OpenPlan } from 'plan-enrollment/plan-enrollment.types';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport ReportsTile from 'reports/shared/ReportsTile';\nimport {\n getCustomBalanceReportCounts,\n downloadCustomBalanceReport,\n downloadCustomReimbursementRecapReport,\n} from 'shared/api/customReportsByDateRangeApi';\nimport { BalanceAccountCount } from 'reports/balance/balance-account.types';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport ReportDateRangeFilter from 'reports/shared/ReportDateRangeFilter';\n\ninterface CustomReportsByDateRangeProps {\n selectedPlan?: OpenPlan;\n}\n\nfunction CustomReportsByDateRange({ selectedPlan }: CustomReportsByDateRangeProps) {\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const [ startDate, setStartDate ] = useState<string | null>(dayjs().format('MM/DD/YYYY'));\n const [ endDate, setEndDate ] = useState<string | null>(dayjs().format('MM/DD/YYYY'));\n const [ counts, setCounts ] = useState<BalanceAccountCount | null>(null);\n const [ downloadingReimbursement, setDownloadingReimbursement ] = useState(false);\n const [ downloadingBalance, setDownloadingBalance ] = useState(false);\n const errorNotifier = useErrorNotifier();\n const [ handleError ] = useState(() => compose(\n tap(compose(setCounts, always(null)),\n errorNotifier,\n )));\n\n const Counts = withLoopIcon(makeCountTiles, '', !!selectedPlan && !counts && !!startDate && !!endDate);\n\n useEffect(() => {\n if (startDate && endDate && selectedPlan) {\n setCounts(null);\n getCustomBalanceReportCounts(\n compid,\n selectedPlan.pyrid,\n selectedPlan.plcid,\n startDate,\n endDate,\n )\n .then(setCounts)\n .catch(handleError);\n }\n }, [ compid, endDate, startDate, selectedPlan, handleError ]);\n\n function handleApply(start: string, end: string) {\n setStartDate(start);\n setEndDate(end);\n }\n\n function handleBalanceExport() {\n if (selectedPlan) {\n setDownloadingBalance(true);\n downloadCustomBalanceReport(compid, selectedPlan.pyrid, selectedPlan.plcid, startDate || '', endDate || '')\n .catch(handleError)\n .finally(() => setDownloadingBalance(false));\n }\n }\n\n function handleReimbursementExport() {\n if (selectedPlan) {\n setDownloadingReimbursement(true);\n downloadCustomReimbursementRecapReport(compid, selectedPlan.pyrid, selectedPlan.plcid,\n startDate || '', endDate || '')\n .catch(errorNotifier)\n .finally(() => setDownloadingReimbursement(false));\n }\n }\n\n function makeCountTiles() {\n if (!counts) {\n return <></>;\n }\n\n return (\n <div className=\"flex justify-end space-x-4 mt-4\" data-testid=\"custom-balance-reports-counts-loaded\">\n <div className=\"w-1/2\">\n <ReportsTile\n count={counts.reimbursement}\n title=\"Reimbursements By Participant\"\n description=\"List of reimbursements issued per participant within the date range selected.\"\n exportDisabled={downloadingReimbursement}\n onExport={handleReimbursementExport}\n downloading={downloadingReimbursement}\n />\n </div>\n {\n selectedPlan?.isBalance\n ? (\n <div className=\"w-1/2\">\n <ReportsTile\n count={counts.balance}\n title=\"Balance Report\"\n description=\"Live data of contributions and reimbursements within the date range selected.\"\n exportDisabled={downloadingBalance}\n onExport={handleBalanceExport}\n downloading={downloadingBalance}\n />\n </div>\n )\n : <></>\n }\n </div>\n );\n }\n\n return (\n <div>\n <ReportDateRangeFilter onFilterChange={handleApply} />\n <div>\n <Counts />\n </div>\n </div>\n );\n}\n\nexport default CustomReportsByDateRange;\n","import { useState, useRef, useEffect } from 'react';\nimport { compose, tap, always } from 'ramda';\n\nimport { useSelector } from 'react-redux';\n\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { getCustomEnrollmentCount } from 'shared/api/customEnrollmentApi';\nimport { OpenPlan } from 'plan-enrollment/plan-enrollment.types';\n\ninterface UseCustomEnrollmentProps {\n selectedPlan?: OpenPlan;\n}\n\nexport function useCustomEnrollmentCount({ selectedPlan }: UseCustomEnrollmentProps) {\n const errorNotifier = useErrorNotifier();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const [ count, setCount ] = useState<number | null>(null);\n const [ setDefault ] = useState(() => compose(setCount, always(0)));\n const [ handleError ] = useState(() => compose(tap(setDefault), errorNotifier));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n if (selectedPlan) {\n setCount(null);\n getCustomEnrollmentCount(compid, selectedPlan)\n .then((result) => {\n if (mountedRef.current) {\n setCount(result);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n setCount(0);\n handleError(err);\n }\n });\n\n return () => {\n mountedRef.current = false;\n };\n }\n setCount(0);\n }, [ handleError, compid, selectedPlan ]);\n\n return count;\n}\n","import request, { ContentType } from '../api-request';\nimport { OpenPlan } from '../../plan-enrollment/plan-enrollment.types';\n\nexport function getCustomEnrollmentCount(companyId: number, plan: OpenPlan) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load custom enrollment for invalid company.'));\n }\n\n if (plan.plcid <= 0) {\n return Promise.reject(new Error('Cannot load custom enrollment for invalid plan.'));\n }\n\n return request<number>(`/api/companies/${companyId}/reports/custom-enrollment/${plan.plcid}/count`);\n}\n\nexport function downloadCustomEnrollmentReport(companyId: number, plan: OpenPlan) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download custom enrollment report for invalid company.'));\n }\n\n if (plan.plcid <= 0) {\n return Promise.reject(new Error('Cannot download custom enrollment report for invalid plan.'));\n }\n\n if (plan.pyrid <= 0) {\n return Promise.reject(new Error('Cannot download custom enrollment report for invalid plan year.'));\n }\n\n const exportUri = `/api/companies/${companyId}/reports/custom-enrollment/${plan.pyrid}/${plan.plcid}/export`;\n\n return request(exportUri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n}\n","import { useState } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport ReportsTile from 'reports/shared/ReportsTile';\nimport { useCustomEnrollmentCount } from './hooks/useCustomEnrollmentCount';\nimport { OpenPlan } from 'plan-enrollment/plan-enrollment.types';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { downloadCustomEnrollmentReport } from 'shared/api/customEnrollmentApi';\nimport { selectSelectedCompany } from '../../companies/companies.slice';\n\ninterface CustomEnrollmentTileProps {\n selectedPlan?: OpenPlan;\n}\n\nfunction CustomEnrollment({ selectedPlan }: CustomEnrollmentTileProps) {\n const count = useCustomEnrollmentCount({ selectedPlan });\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const [ downloading, setDownloading ] = useState(false);\n const errorNotifier = useErrorNotifier();\n\n function handleExport() {\n if (selectedPlan) {\n setDownloading(true);\n downloadCustomEnrollmentReport(compid, selectedPlan)\n .catch(errorNotifier)\n .finally(() => setDownloading(false));\n }\n }\n\n return (\n <ReportsTile\n count={count}\n title=\"Enrollment Roster\"\n description=\"Live data of participants enrolled in each plan as selected.\"\n variant=\"primary-main\"\n exportDisabled={downloading || !selectedPlan}\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n\nexport default CustomEnrollment;\n","import { useState, useRef, useEffect } from 'react';\nimport { compose, tap, always } from 'ramda';\n\nimport { useSelector } from 'react-redux';\n\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { getCustomEnrollmentWithDepsCount } from 'shared/api/customEnrollmentWithDepsApi';\nimport { OpenPlan } from 'plan-enrollment/plan-enrollment.types';\n\ninterface UseCustomEnrollmentWithDepsProps {\n selectedPlan?: OpenPlan;\n}\n\nexport function useCustomEnrollmentWithDepsCount({ selectedPlan }: UseCustomEnrollmentWithDepsProps) {\n const errorNotifier = useErrorNotifier();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const [ count, setCount ] = useState<number | null>(null);\n const [ setDefault ] = useState(() => compose(setCount, always(0)));\n const [ handleError ] = useState(() => compose(tap(setDefault), errorNotifier));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n if (selectedPlan) {\n setCount(null);\n getCustomEnrollmentWithDepsCount(compid, selectedPlan)\n .then((result) => {\n if (mountedRef.current) {\n setCount(result);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n setCount(0);\n handleError(err);\n }\n });\n\n return () => {\n mountedRef.current = false;\n };\n }\n setCount(0);\n }, [ handleError, compid, selectedPlan ]);\n\n return count;\n}\n","import request, { ContentType } from '../api-request';\nimport { OpenPlan } from '../../plan-enrollment/plan-enrollment.types';\n\nexport function getCustomEnrollmentWithDepsCount(companyId: number, plan: OpenPlan) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load custom enrollment with dependents for invalid company.'));\n }\n\n if (plan.plcid <= 0) {\n return Promise.reject(new Error('Cannot load custom enrollment with dependents for invalid plan.'));\n }\n\n return request<number>(`/api/companies/${companyId}/reports/custom-enrollment/with-deps/${plan.plcid}/count`);\n}\n\nexport function downloadCustomEnrollmentWithDepsReport(companyId: number, plan: OpenPlan) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download custom enrollment with dependents report for invalid company.'));\n }\n\n if (plan.plcid <= 0) {\n return Promise.reject(new Error('Cannot download custom enrollment with dependents report for invalid plan.'));\n }\n\n if (plan.pyrid <= 0) {\n return Promise.reject(new Error('Cannot download custom enrollment with dependents report for invalid plan year.'));\n }\n\n const exportUri =\n `/api/companies/${companyId}/reports/custom-enrollment/with-deps/${plan.pyrid}/${plan.plcid}/export`;\n\n return request(exportUri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n}\n","import { useState } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport ReportsTile from 'reports/shared/ReportsTile';\nimport { useCustomEnrollmentWithDepsCount } from './hooks/useCustomEnrollmentWithDepsCount';\nimport { OpenPlan } from 'plan-enrollment/plan-enrollment.types';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { downloadCustomEnrollmentWithDepsReport } from 'shared/api/customEnrollmentWithDepsApi';\nimport { selectSelectedCompany } from '../../companies/companies.slice';\n\ninterface CustomEnrollmentWithDepsTileProps {\n selectedPlan?: OpenPlan;\n}\n\nfunction CustomEnrollmentWithDeps({ selectedPlan }: CustomEnrollmentWithDepsTileProps) {\n const count = useCustomEnrollmentWithDepsCount({ selectedPlan });\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const [ downloading, setDownloading ] = useState(false);\n const errorNotifier = useErrorNotifier();\n\n function handleExport() {\n if (selectedPlan) {\n setDownloading(true);\n downloadCustomEnrollmentWithDepsReport(compid, selectedPlan)\n .catch(errorNotifier)\n .finally(() => setDownloading(false));\n }\n }\n\n return (\n <ReportsTile\n count={count}\n title=\"Enrollment Roster With Dependents\"\n description=\"Live data of participants enrolled in each\nplan as selected including enrolled dependents.\"\n variant=\"primary-main\"\n exportDisabled={downloading || !selectedPlan}\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n\nexport default CustomEnrollmentWithDeps;\n","import React, { useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport PlanSelect from 'plan-enrollment/plan-selection/PlanSelect';\nimport CustomReportsByDateRange from './CustomReportsByDateRange';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport CustomEnrollment from './CustomEnrollment';\nimport CustomEnrollmentWithDeps from './CustomEnrollmentWithDeps';\nimport {\n setSelectedCustomReportPlan,\n selectCustomReportPlans,\n selectSelectedCustomReportPlan, loadCustomReportPlans,\n} from './custom-reports.slice';\nimport store from 'store';\n\nfunction CustomReports() {\n const dispatch = useDispatch<typeof store.dispatch>();\n const plans = useSelector(selectCustomReportPlans);\n const selectedPlan = useSelector(selectSelectedCustomReportPlan);\n\n /* istanbul ignore next */ /* couldn't figure out a test to cover this without huge problems */\n function handlePlanChange(planId?: number) {\n if (planId === undefined || planId < 0) {\n dispatch(setSelectedCustomReportPlan(undefined));\n } else if (plans) {\n const plan = plans.find((p) => p.unqid === planId);\n dispatch(setSelectedCustomReportPlan(plan));\n }\n }\n /* istanbul ignore stop */\n\n useEffect(() => {\n dispatch(loadCustomReportPlans());\n }, [ dispatch ]);\n\n const PlanSelectWithLoader = withLoopIcon(\n PlanSelect,\n 'Loading plans...',\n plans === null,\n 'w-full plan-enrollment-plans-loading',\n );\n\n return (\n <PageContentPaper>\n <div className=\"w-full\">\n <div className=\"w-1/3\">\n <PlanSelectWithLoader\n name=\"planId\"\n plans={plans!}\n value={selectedPlan?.unqid}\n error={false}\n onPlanSelected={handlePlanChange}\n showSubPlan={false}\n />\n <small className=\"text-gray-chateu text-xs ml-4\">\n Select the report type to display for all reports below\n </small>\n </div>\n\n <div className=\"py-8 mb-8 border-neutral5 border-solid border-b-2\">\n <div className=\"flex\">\n <div className=\"flex-grow flex flex-row space-x-4\" >\n <div className=\"h-1/2 w-full\">\n <CustomEnrollment selectedPlan={selectedPlan} />\n </div>\n <div className=\"h-1/2 w-full\">\n <CustomEnrollmentWithDeps selectedPlan={selectedPlan} />\n </div>\n </div>\n </div>\n </div>\n\n <CustomReportsByDateRange selectedPlan={selectedPlan} />\n </div>\n </PageContentPaper >\n );\n}\n\nexport default CustomReports;\n","import { useState, useRef, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { compose, tap, always } from 'ramda';\n\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { CobraDateRangeCounts } from '../cobra-report-types';\nimport { getCobraCountsByDateRange } from 'shared/api/cobraDateRangeReportsApi';\nimport { selectSelectedCompany } from 'companies/companies.slice';\n\nexport const defaultCounts: CobraDateRangeCounts = {\n noticesMailed: 0,\n pendingNotices: 0,\n paymentsReceived: 0,\n currentActive: 0,\n monthlyRecap: 0,\n acceptancesReceived: 0,\n invoiceStatus: 0,\n initialNoticesSent: 0,\n activeWithAddress: 0,\n noResponseWithAddress: 0,\n termsFromCobra: 0,\n ten95cData: 0,\n};\n\nexport function useCobraReportCounts(startDate: string, endDate: string) {\n const errorNotifier = useErrorNotifier();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const [ reportCounts, setReportCounts ] = useState<CobraDateRangeCounts | null>(null);\n\n const [ setDefault ] = useState(() => compose(setReportCounts, always(defaultCounts)));\n const [ handleError ] = useState(() => compose(tap(setDefault), errorNotifier));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n if (compid > 0 && !!startDate && !!endDate) {\n setReportCounts(null);\n getCobraCountsByDateRange(compid, startDate, endDate)\n .then((result) => {\n if (mountedRef.current) {\n setReportCounts(result ?? defaultCounts);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n }\n\n return () => {\n mountedRef.current = false;\n };\n }, [ handleError, compid, startDate, endDate ]);\n\n return reportCounts;\n}\n","import dayjs from 'dayjs';\n\nimport { CobraDateRangeCounts } from 'reports/cobra/cobra-report-types';\nimport request from '../api-request';\nimport { validateDate } from './validateDate';\nimport queryStringTag from './reportQueryStringTag';\n\nexport function getCobraCountsByDateRange(companyId: number, startDate?: string, endDate?: string) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load COBRA participant counts for invalid company.'));\n }\n\n try {\n const serviceType = 'cobra';\n const start = validateDate(\n 'Cannot load COBRA participant counts for invalid start date.',\n startDate ?? dayjs().format(),\n );\n const end = validateDate(\n 'Cannot load COBRA participant counts for invalid end date.',\n endDate ?? dayjs().format(),\n );\n\n const uri = queryStringTag`/api/companies/${companyId}/reports/date-range/${serviceType}${start}${end}`;\n\n return request<CobraDateRangeCounts>(uri);\n } catch (err) {\n return Promise.reject(err);\n }\n}\n","import { useState } from 'react';\nimport { compose, F, T, tap } from 'ramda';\n\nimport ReportsTile from '../../shared/ReportsTile';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useSelector } from 'react-redux';\nimport { downloadInitialNoticeSentReport } from 'shared/api/initialNoticeSentApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\n\ninterface InitialNoticeSentProps {\n startDate: string | null;\n endDate: string | null;\n count: number | null;\n}\n\nfunction InitialNoticeSent({ startDate, endDate, count }: InitialNoticeSentProps) {\n const [ downloading, setDownloading ] = useState(false);\n const doneDownloading = compose(setDownloading, F);\n const startDownloading = compose(setDownloading, T);\n\n const errorNotifier = useErrorNotifier();\n const handleError = compose(tap(doneDownloading), errorNotifier);\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n function handleExport() {\n startDownloading();\n downloadInitialNoticeSentReport(compid, startDate ?? undefined, endDate ?? undefined)\n .then(doneDownloading)\n .catch(handleError);\n }\n\n return (\n <ReportsTile\n count={count}\n title=\"Initial Notices Sent\"\n description=\"Lists the status of mailings for any COBRA Initial Notices\nand will provide you with detail regarding mailing activity. \"\n exportDisabled={count === null || !startDate || !endDate}\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n\nexport default InitialNoticeSent;\n","import dayjs from 'dayjs';\n\nimport request, { ContentType } from '../api-request';\nimport { validateDate } from './validateDate';\n\nexport function downloadInitialNoticeSentReport(\n companyId: number,\n startDate?: string,\n endDate?: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download initial notice sent report for invalid company.'));\n }\n\n try {\n const start = validateDate(\n 'Cannot download initial notice sent report for invalid start date.',\n startDate ?? dayjs().format(),\n );\n const end = validateDate(\n 'Cannot download initial notice sent report for invalid end date.',\n endDate ?? dayjs().format(),\n );\n\n const uri = `/api/companies/${companyId}/reports/initial-notice-sent/export`\n + `?startDate=${start?.format('YYYY-MM-DD')}&endDate=${end?.format('YYYY-MM-DD')}`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n } catch (err) {\n return Promise.reject(err);\n }\n}\n","import { useState, useRef, useEffect } from 'react';\nimport { compose, tap, always } from 'ramda';\n\nimport { useSelector } from 'react-redux';\n\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { getNoResponseWithAddressCount } from 'shared/api/noResponseWithAddressApi';\n\nexport function useNoResponseWithAddressCount() {\n const errorNotifier = useErrorNotifier();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const [ count, setCount ] = useState<number | null>(null);\n const [ setDefault ] = useState(() => compose(setCount, always(0)));\n const [ handleError ] = useState(() => compose(tap(setDefault), errorNotifier));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n getNoResponseWithAddressCount(compid)\n .then((result) => {\n if (mountedRef.current) {\n setCount(result ?? 0);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n\n return () => {\n mountedRef.current = false;\n };\n }, [ handleError, compid ]);\n\n return count;\n}\n","import request, { ContentType } from '../api-request';\n\nexport function downloadNoResponseWithAddressReport(\n companyId: number,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download no response with address report for invalid company.'));\n }\n\n const uri = `/api/companies/${companyId}/reports/no-response-with-address/export`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n}\n\nexport function getNoResponseWithAddressCount(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load no response with address for invalid company.'));\n }\n\n const uri = `/api/companies/${companyId}/reports/no-response-with-address/count`;\n\n return request<number>(uri);\n}\n","import { useState } from 'react';\nimport { compose, F, T, tap } from 'ramda';\n\nimport ReportsTile from '../../shared/ReportsTile';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useSelector } from 'react-redux';\nimport {\n downloadNoResponseWithAddressReport,\n} from 'shared/api/noResponseWithAddressApi';\nimport { useNoResponseWithAddressCount } from '../hooks/useNoResponseWithAddressCount';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\n\nfunction NoResponseWithAddress() {\n const [ downloading, setDownloading ] = useState(false);\n const doneDownloading = compose(setDownloading, F);\n const startDownloading = compose(setDownloading, T);\n\n const errorNotifier = useErrorNotifier();\n const handleError = compose(tap(doneDownloading), errorNotifier);\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const count = useNoResponseWithAddressCount();\n\n function handleExport() {\n startDownloading();\n downloadNoResponseWithAddressReport(compid)\n .then(doneDownloading)\n .catch(handleError);\n }\n\n return (\n <ReportsTile\n count={count}\n title=\"No Response With Address\"\n description=\"List of participants with an open election\nand their address used to mail the QE. Includes response deadline.\"\n variant=\"primary-main\"\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n\nexport default NoResponseWithAddress;\n","import { useState, useRef, useEffect } from 'react';\nimport { compose, tap, always } from 'ramda';\n\nimport { useSelector } from 'react-redux';\n\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { getPendingResponseCount } from 'shared/api/pendingResponsesApi';\nimport { CRLType } from 'shared/types/non-plan-year.types';\n\nexport function usePendingResponseCount(type: CRLType) {\n const errorNotifier = useErrorNotifier();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const [ count, setCount ] = useState<number | null>(null);\n const [ setDefault ] = useState(() => compose(setCount, always(0)));\n const [ handleError ] = useState(() => compose(tap(setDefault), errorNotifier));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n setCount(null);\n getPendingResponseCount(compid, type)\n .then((result) => {\n if (mountedRef.current) {\n setCount(result);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n setCount(0);\n handleError(err);\n }\n });\n\n return () => {\n mountedRef.current = false;\n };\n }, [ handleError, compid, type ]);\n\n return count;\n}\n","import request, { ContentType } from '../api-request';\nimport { CRLType } from 'shared/types/non-plan-year.types';\n\nexport function getPendingResponseCount(companyId: number, type: CRLType) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load pending responses for invalid company.'));\n }\n\n return request<number>(`/api/companies/${companyId}/reports/pending-responses/${type}`);\n}\n\nexport function downloadPendingResponsesReport(\n companyId: number,\n type: CRLType,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download pending responses report for invalid company.'));\n }\n\n const uri = `/api/companies/${companyId}/reports/pending-responses/${type}/export`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n}\n\n","import { useState } from 'react';\nimport { compose, F, T, tap } from 'ramda';\n\nimport ReportsTile from 'reports/shared/ReportsTile';\nimport { downloadPendingResponsesReport } from 'shared/api/pendingResponsesApi';\nimport { usePendingResponseCount } from '../hooks/usePendingResponseCount';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useSelector } from 'react-redux';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { CRLType } from 'shared/types/non-plan-year.types';\n\ninterface PendingResponsesProps {\n serviceType: CRLType;\n}\n\nfunction PendingResponses({ serviceType }: PendingResponsesProps) {\n const count = usePendingResponseCount(serviceType);\n const [ downloading, setDownloading ] = useState(false);\n const doneDownloading = compose(setDownloading, F);\n const startDownloading = compose(setDownloading, T);\n\n const errorNotifier = useErrorNotifier();\n const handleError = compose(tap(doneDownloading), errorNotifier);\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n function handleExport() {\n startDownloading();\n downloadPendingResponsesReport(compid, serviceType)\n .then(doneDownloading)\n .catch(handleError);\n }\n\n return (\n <ReportsTile\n count={count}\n title=\"Pending Responses\"\n description=\"List of participants to whom a Qualifying Event notice was mailed,\n and a response has not yet been received.\"\n variant=\"primary-dark\"\n exportDisabled={downloading || count === null}\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n\nexport default PendingResponses;\n","import { useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport { without } from 'ramda';\n\nimport { useActiveParticipantCount } from '../hooks/useActiveParticipantCount';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport ReportsTile from 'reports/shared/ReportsTile';\nimport {\n downloadActiveParticipantsFullDataReport,\n downloadActiveParticipantsReport,\n downloadActiveParticipantsOneLineReport,\n} from 'shared/api/activeParticipantsApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { CRLType } from 'shared/types/non-plan-year.types';\n\nenum Downloading {\n AP,\n AP_ONE_LINE,\n AP_FULL_DATA\n}\n\ninterface CRLProps {\n serviceType: CRLType;\n}\n\nfunction ActiveParticipants({ serviceType }: CRLProps) {\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const count = useActiveParticipantCount(serviceType);\n const [ downloading, setDownloading ] = useState<Downloading[]>([]);\n\n const errorNotifier = useErrorNotifier();\n\n function description(type: Downloading) {\n if (serviceType.toUpperCase() === 'COBRA') {\n switch (type) {\n case Downloading.AP: return 'Detailed list of participants currently on COBRA including their dependent names.';\n case Downloading.AP_ONE_LINE: return 'List of each participant active on COBRA not including dependents.';\n case Downloading.AP_FULL_DATA: return 'List of each participant active on COBRA including dependents.';\n }\n } else {\n switch (type) {\n case Downloading.AP: return 'Detailed list of active participants including their dependent names.';\n case Downloading.AP_ONE_LINE: return 'List of each participant active not including dependents.';\n case Downloading.AP_FULL_DATA: return 'List of each participant active including dependents.';\n }\n }\n }\n\n function download(type: Downloading) {\n switch (type) {\n case Downloading.AP: return downloadActiveParticipantsReport(compid, serviceType);\n case Downloading.AP_ONE_LINE: return downloadActiveParticipantsOneLineReport(compid, serviceType);\n case Downloading.AP_FULL_DATA: return downloadActiveParticipantsFullDataReport(compid, serviceType);\n }\n }\n\n function handleExport(type: Downloading) {\n return () => {\n if (compid) {\n setDownloading([ ...downloading, type ]);\n download(type)\n .catch(errorNotifier)\n .finally(() => setDownloading(without([ type ], downloading)));\n }\n };\n }\n\n return (\n <>\n <ReportsTile\n count={count}\n title=\"Active Participants\"\n description={description(Downloading.AP)}\n variant=\"primary-main\"\n onExport={handleExport(Downloading.AP)}\n downloading={downloading.includes(Downloading.AP)}\n />\n\n <ReportsTile\n count={count}\n title=\"Active Participants One Line\"\n description={description(Downloading.AP_ONE_LINE)}\n variant=\"primary-main\"\n onExport={handleExport(Downloading.AP_ONE_LINE)}\n downloading={downloading.includes(Downloading.AP_ONE_LINE)}\n />\n\n <ReportsTile\n count={count}\n title=\"Active Participants Full Data\"\n description={description(Downloading.AP_FULL_DATA)}\n variant=\"primary-main\"\n onExport={handleExport(Downloading.AP_FULL_DATA)}\n downloading={downloading.includes(Downloading.AP_FULL_DATA)}\n />\n </>\n );\n}\n\nexport default ActiveParticipants;\n","import { useState, useRef, useEffect } from 'react';\nimport { compose, tap, always } from 'ramda';\n\nimport { useSelector } from 'react-redux';\n\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { getActiveParticipantCount } from 'shared/api/activeParticipantsApi';\nimport { CRLType } from 'shared/types/non-plan-year.types';\n\nexport function useActiveParticipantCount(type: CRLType) {\n const errorNotifier = useErrorNotifier();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const [ count, setCount ] = useState<number | null>(null);\n const [ setDefault ] = useState(() => compose(setCount, always(0)));\n const [ handleError ] = useState(() => compose(tap(setDefault), errorNotifier));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n setCount(null);\n getActiveParticipantCount(compid, type)\n .then((result) => {\n if (mountedRef.current) {\n setCount(result ?? 0);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n setCount(0);\n handleError(err);\n }\n });\n\n return () => {\n mountedRef.current = false;\n };\n }, [ handleError, compid, type ]);\n\n return count;\n}\n","import { useState, useRef, useEffect } from 'react';\nimport { compose, tap, always } from 'ramda';\n\nimport { useSelector } from 'react-redux';\n\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { ReportType, getPendingNoticeCount } from 'shared/api/pendingNoticesApi';\nimport { CRLType } from 'shared/types/non-plan-year.types';\n\nexport function usePendingNoticeCount(type: ReportType, serviceType: CRLType) {\n const errorNotifier = useErrorNotifier();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const [ count, setCount ] = useState<number | null>(null);\n const [ setDefault ] = useState(() => compose(setCount, always(0)));\n const [ handleError ] = useState(() => compose(tap(setDefault), errorNotifier));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n setCount(null);\n getPendingNoticeCount(compid, type, serviceType)\n .then((result) => {\n if (mountedRef.current) {\n setCount(result);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n setCount(0);\n handleError(err);\n }\n });\n\n return () => {\n mountedRef.current = false;\n };\n }, [ handleError, compid, type, serviceType ]);\n\n return count;\n}\n","import { always, equals, identity as id, ifElse } from 'ramda';\n\nimport request, { ContentType } from 'shared/api-request';\nimport { CRLType } from 'shared/types/non-plan-year.types';\n\nexport type ReportType = 'initial' | 'qe';\n\nexport function getPendingNoticeCount(companyId: number, type: ReportType, serviceType: CRLType) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load pending responses for invalid company.'));\n }\n\n return request<number>(`/api/companies/${companyId}/reports/pending-notices/export/count/${type}/${serviceType}`);\n}\n\nexport function downloadPendingNoticeReport(\n companyId: number,\n serviceType: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download pending notices report for invalid company.'));\n }\n\n const uri = `/api/companies/${companyId}/reports/pending-notices/${serviceType}/export`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n}\n\nexport function getPendingNoticeSummary(\n companyId: number,\n serviceType: 'cobra-qe' | 'initial',\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load pending notices summary for invalid company.'));\n }\n\n const path = ifElse(equals('cobra-qe'), always('qe/cobra'), id)(serviceType);\n\n return request<number>(`/api/companies/${companyId}/reports/pending-notices/count/${path}`);\n}\n","import { useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport { compose, T, F, tap } from 'ramda';\n\nimport ReportsTile from 'reports/shared/ReportsTile';\nimport { ReportType, downloadPendingNoticeReport } from 'shared/api/pendingNoticesApi';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { usePendingNoticeCount } from '../hooks/usePendingNoticeCount';\nimport { CRLType } from 'shared/types/non-plan-year.types';\n\ninterface PendingResponsesProps {\n type: ReportType;\n serviceType: CRLType;\n}\n\nfunction PendingResponses({ type, serviceType }: PendingResponsesProps) {\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const count = usePendingNoticeCount(type, serviceType);\n const [ downloading, setDownloading ] = useState<boolean>(false);\n const doneDownloading = compose(setDownloading, F);\n const startDownloading = compose(setDownloading, T);\n\n const errorNotifier = useErrorNotifier();\n const handleError = compose(tap(doneDownloading), errorNotifier);\n\n function handleExport() {\n startDownloading();\n downloadPendingNoticeReport(compid, serviceType)\n .then(doneDownloading)\n .catch(handleError);\n }\n\n return (\n <ReportsTile\n count={count}\n title=\"Pending Notices\"\n description=\"List of participants for whom a Qualifying Event\n notice was entered and is pending to be mailed.\"\n variant=\"primary-dark\"\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n\nexport default PendingResponses;\n","import { useState } from 'react';\nimport { compose, F, T, tap } from 'ramda';\n\nimport ReportsTile from '../../shared/ReportsTile';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useSelector } from 'react-redux';\nimport { downloadCurrentActiveReport } from 'shared/api/currentActiveApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { CRLType } from 'shared/types/non-plan-year.types';\n\ninterface CurrentActiveProps {\n serviceType: CRLType;\n description: string;\n startDate: string | null;\n endDate: string | null;\n count: number | null;\n}\n\nfunction CurrentActive({ serviceType, description, startDate, endDate, count }: CurrentActiveProps) {\n const [ downloading, setDownloading ] = useState(false);\n const doneDownloading = compose(setDownloading, F);\n const startDownloading = compose(setDownloading, T);\n\n const errorNotifier = useErrorNotifier();\n const handleError = compose(tap(doneDownloading), errorNotifier);\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n function handleExport() {\n startDownloading();\n downloadCurrentActiveReport(compid, serviceType, startDate ?? undefined, endDate ?? undefined)\n .then(doneDownloading)\n .catch(handleError);\n }\n\n return (\n <ReportsTile\n count={count}\n title=\"Active During Range\"\n description={description}\n exportDisabled={count === null || !startDate || !endDate}\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n\nexport default CurrentActive;\n","import dayjs from 'dayjs';\n\nimport request, { ContentType } from '../api-request';\nimport { CRLType } from 'shared/types/non-plan-year.types';\nimport { validateDate } from './validateDate';\nimport queryStringTag from './reportQueryStringTag';\n\nexport function downloadCurrentActiveReport(\n companyId: number,\n type: CRLType,\n startDate?: string,\n endDate?: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download active during range report for invalid company.'));\n }\n\n try {\n const start = validateDate(\n 'Cannot download active during range report for invalid start date.',\n startDate ?? dayjs().format(),\n );\n const end = validateDate(\n 'Cannot download active during range report for invalid end date.',\n endDate ?? dayjs().format(),\n );\n\n const uri =\n queryStringTag`/api/companies/${companyId}/reports/current-active/${type}/export${start}${end}`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n } catch (err) {\n return Promise.reject(err);\n }\n}\n","import { useState } from 'react';\nimport { compose, F, T, tap } from 'ramda';\n\nimport ReportsTile from '../../shared/ReportsTile';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useSelector } from 'react-redux';\nimport { downloadNoticesMailedReport } from 'shared/api/noticesMailedApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { CRLType } from 'shared/types/non-plan-year.types';\n\ninterface NoticesMailedProps {\n serviceType: CRLType;\n startDate: string | null;\n endDate: string | null;\n count: number | null;\n}\n\nfunction NoticesMailed({ serviceType, startDate, endDate, count }: NoticesMailedProps) {\n const [ downloading, setDownloading ] = useState(false);\n const doneDownloading = compose(setDownloading, F);\n const startDownloading = compose(setDownloading, T);\n\n const errorNotifier = useErrorNotifier();\n const handleError = compose(tap(doneDownloading), errorNotifier);\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n function handleExport() {\n startDownloading();\n downloadNoticesMailedReport(compid, serviceType, startDate ?? undefined, endDate ?? undefined)\n .then(doneDownloading)\n .catch(handleError);\n }\n\n return (\n <ReportsTile\n count={count}\n title=\"Notices Mailed\"\n description=\"List of participants to whom a notice was mailed within the date range selected.\"\n exportDisabled={count === null || !startDate || !endDate}\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n\nexport default NoticesMailed;\n","import dayjs from 'dayjs';\n\nimport { CRLType } from 'shared/types/non-plan-year.types';\nimport request, { ContentType } from '../api-request';\nimport { validateDate } from './validateDate';\nimport queryStringTag from './reportQueryStringTag';\n\nexport function downloadNoticesMailedReport(\n companyId: number,\n type: CRLType,\n startDate?: string,\n endDate?: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download notices mailed report for invalid company.'));\n }\n\n try {\n const start = validateDate(\n 'Cannot download notices mailed report for invalid start date.',\n startDate ?? dayjs().format(),\n );\n const end = validateDate(\n 'Cannot download notices mailed report for invalid end date.',\n endDate ?? dayjs().format(),\n );\n\n const uri = queryStringTag`/api/companies/${companyId}/reports/notices-mailed/${type}/export${start}${end}`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n } catch (err) {\n return Promise.reject(err);\n }\n}\n","import { useState } from 'react';\nimport { compose, F, T, tap } from 'ramda';\n\nimport ReportsTile from '../../shared/ReportsTile';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useSelector } from 'react-redux';\nimport { downloadPaymentsReceivedReport } from 'shared/api/paymentsReceivedApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { CRLType } from 'shared/types/non-plan-year.types';\n\ninterface PaymentsReceivedProps {\n reportType: CRLType;\n startDate: string | null;\n endDate: string | null;\n count: number | null;\n}\n\nfunction PaymentsReceived({ startDate, endDate, count, reportType }: PaymentsReceivedProps) {\n const [ downloading, setDownloading ] = useState(false);\n const doneDownloading = compose(setDownloading, F);\n const startDownloading = compose(setDownloading, T);\n\n const errorNotifier = useErrorNotifier();\n const handleError = compose(tap(doneDownloading), errorNotifier);\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n function handleExport() {\n startDownloading();\n downloadPaymentsReceivedReport(compid, reportType, startDate ?? undefined, endDate ?? undefined)\n .then(doneDownloading)\n .catch(handleError);\n }\n\n return (\n <ReportsTile\n count={count}\n title=\"Payments Received\"\n description=\"List of premium payments received from participants within the date range selected.\"\n exportDisabled={count === null || !startDate || !endDate}\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n\nexport default PaymentsReceived;\n","import dayjs from 'dayjs';\n\nimport request, { ContentType } from '../api-request';\nimport { validateDate } from './validateDate';\nimport queryStringTag from './reportQueryStringTag';\n\nexport function downloadPaymentsReceivedReport(\n companyId: number,\n type: 'cobra' | 'retiree' | 'loa',\n startDate?: string,\n endDate?: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download payments received report for invalid company.'));\n }\n\n try {\n const start = validateDate(\n 'Cannot download payments received report for invalid start date.',\n startDate ?? dayjs().format(),\n );\n const end = validateDate(\n 'Cannot download payments received report for invalid end date.',\n endDate ?? dayjs().format(),\n );\n\n const uri = queryStringTag`/api/companies/${companyId}/reports/payments-received/${type}/export${start}${end}`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n } catch (err) {\n return Promise.reject(err);\n }\n}\n","import { useState } from 'react';\nimport { compose, F, T, tap } from 'ramda';\n\nimport ReportsTile from '../../shared/ReportsTile';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useSelector } from 'react-redux';\nimport { downloadMonthlyRecapReport } from 'shared/api/monthlyRecapApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { CRLType } from 'shared/types/non-plan-year.types';\n\ninterface MonthlyRecapProps {\n serviceType: CRLType;\n startDate: string | null;\n endDate: string | null;\n count: number | null;\n}\n\nfunction MonthlyRecap({ serviceType, startDate, endDate, count }: MonthlyRecapProps) {\n const [ downloading, setDownloading ] = useState(false);\n const doneDownloading = compose(setDownloading, F);\n const startDownloading = compose(setDownloading, T);\n\n const errorNotifier = useErrorNotifier();\n const handleError = compose(tap(doneDownloading), errorNotifier);\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n function handleExport() {\n startDownloading();\n downloadMonthlyRecapReport(compid, serviceType, startDate ?? undefined, endDate ?? undefined)\n .then(doneDownloading)\n .catch(handleError);\n }\n\n return (\n <ReportsTile\n count={count}\n title=\"Monthly Recap\"\n description=\"Monthly Recap of total dollars received and number of participants enrolled in each plan.\"\n exportDisabled={count === null || !startDate || !endDate}\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n\nexport default MonthlyRecap;\n","import dayjs from 'dayjs';\n\nimport request, { ContentType } from '../api-request';\nimport { validateDate } from './validateDate';\nimport queryStringTag from './reportQueryStringTag';\n\nexport function downloadMonthlyRecapReport(\n companyId: number,\n type: 'cobra' | 'retiree' | 'loa',\n startDate?: string,\n endDate?: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download monthly recap report for invalid company.'));\n }\n\n try {\n const start = validateDate(\n 'Cannot download monthly recap report for invalid start date.',\n startDate ?? dayjs().format(),\n );\n const end = validateDate(\n 'Cannot download monthly recap report for invalid end date.',\n endDate ?? dayjs().format(),\n );\n\n const uri = queryStringTag`/api/companies/${companyId}/reports/monthly-recap/${type}/export${start}${end}`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n } catch (err) {\n return Promise.reject(err);\n }\n}\n","import { useState } from 'react';\nimport { compose, F, T, tap } from 'ramda';\n\nimport ReportsTile from '../../shared/ReportsTile';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useSelector } from 'react-redux';\nimport { downloadAcceptanceReceivedReport } from 'shared/api/acceptanceReceivedApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\n\ninterface AcceptanceReceivedProps {\n serviceType: string;\n description: string;\n startDate: string | null;\n endDate: string | null;\n count: number | null;\n}\n\nfunction AcceptanceReceived({ serviceType, description, startDate, endDate, count }: AcceptanceReceivedProps) {\n const [ downloading, setDownloading ] = useState(false);\n const doneDownloading = compose(setDownloading, F);\n const startDownloading = compose(setDownloading, T);\n\n const errorNotifier = useErrorNotifier();\n const handleError = compose(tap(doneDownloading), errorNotifier);\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n function handleExport() {\n startDownloading();\n downloadAcceptanceReceivedReport(compid, serviceType, startDate ?? undefined, endDate ?? undefined)\n .then(doneDownloading)\n .catch(handleError);\n }\n\n return (\n <ReportsTile\n count={count}\n title=\"Acceptances Received\"\n description={description}\n exportDisabled={count === null || !startDate || !endDate}\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n\nexport default AcceptanceReceived;\n","import dayjs from 'dayjs';\n\nimport request, { ContentType } from '../api-request';\nimport { validateDate } from './validateDate';\nimport queryStringTag from './reportQueryStringTag';\n\nexport function downloadAcceptanceReceivedReport(\n companyId: number,\n type: string,\n startDate?: string,\n endDate?: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download acceptance received report for invalid company.'));\n }\n\n try {\n const start = validateDate(\n 'Cannot download acceptance received report for invalid start date.',\n startDate ?? dayjs().format(),\n );\n const end = validateDate(\n 'Cannot download acceptance received report for invalid end date.',\n endDate ?? dayjs().format(),\n );\n\n const uri =\n queryStringTag`/api/companies/${companyId}/reports/acceptance-received/${type}/export${start}${end}`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n } catch (err) {\n return Promise.reject(err);\n }\n}\n","import { useState } from 'react';\nimport { compose, F, T, tap } from 'ramda';\n\nimport ReportsTile from '../../shared/ReportsTile';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useSelector } from 'react-redux';\nimport { downloadInvoiceStatusReport } from 'shared/api/invoiceStatusApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { CRLType } from 'shared/types/non-plan-year.types';\n\ninterface InvoiceStatusProps {\n serviceType: CRLType;\n startDate: string | null;\n endDate: string | null;\n count: number | null;\n}\n\nfunction InvoiceStatus({ serviceType, startDate, endDate, count }: InvoiceStatusProps) {\n const [ downloading, setDownloading ] = useState(false);\n const doneDownloading = compose(setDownloading, F);\n const startDownloading = compose(setDownloading, T);\n\n const errorNotifier = useErrorNotifier();\n const handleError = compose(tap(doneDownloading), errorNotifier);\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n function handleExport() {\n startDownloading();\n downloadInvoiceStatusReport(compid, serviceType, startDate ?? undefined, endDate ?? undefined)\n .then(doneDownloading)\n .catch(handleError);\n }\n\n return (\n <ReportsTile\n count={count}\n title=\"Invoice Status\"\n description=\"Detailed list of invoices sent within the date range selected per participant and their status.\"\n exportDisabled={count === null || !startDate || !endDate}\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n\nexport default InvoiceStatus;\n","import dayjs from 'dayjs';\n\nimport request, { ContentType } from '../api-request';\nimport { validateDate } from './validateDate';\nimport queryStringTag from './reportQueryStringTag';\n\nexport function downloadInvoiceStatusReport(\n companyId: number,\n serviceType: string,\n startDate?: string,\n endDate?: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download invoice status report for invalid company.'));\n }\n\n try {\n const start = validateDate(\n 'Cannot download invoice status report for invalid start date.',\n startDate ?? dayjs().format(),\n );\n const end = validateDate(\n 'Cannot download invoice status report for invalid end date.',\n endDate ?? dayjs().format(),\n );\n\n const uri = queryStringTag`/api/companies/${companyId}/reports/invoice-status/${serviceType}/export${start}${end}`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n } catch (err) {\n return Promise.reject(err);\n }\n}\n","import { useState } from 'react';\nimport { compose, F, T, tap } from 'ramda';\n\nimport ReportsTile from '../../shared/ReportsTile';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useSelector } from 'react-redux';\nimport { downloadActiveWithAddressReport } from 'shared/api/activeWithAddressApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { CRLType } from 'shared/types/non-plan-year.types';\n\ninterface ActiveWithAddressProps {\n serviceType: CRLType;\n description: string;\n startDate: string | null;\n endDate: string | null;\n count: number | null;\n}\n\nfunction ActiveWithAddress({ serviceType, description, startDate, endDate, count }: ActiveWithAddressProps) {\n const [ downloading, setDownloading ] = useState(false);\n const doneDownloading = compose(setDownloading, F);\n const startDownloading = compose(setDownloading, T);\n\n const errorNotifier = useErrorNotifier();\n const handleError = compose(tap(doneDownloading), errorNotifier);\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n function handleExport() {\n startDownloading();\n downloadActiveWithAddressReport(compid, serviceType, startDate ?? undefined, endDate ?? undefined)\n .then(doneDownloading)\n .catch(handleError);\n }\n\n return (\n <ReportsTile\n count={count}\n title=\"Active With Address\"\n description={description}\n exportDisabled={count === null || (!startDate && !endDate)}\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n\nexport default ActiveWithAddress;\n","import request, { ContentType } from 'shared/api-request';\nimport { validateDate } from './validateDate';\nimport queryStringTag from './reportQueryStringTag';\nimport dayjs from 'dayjs';\n\nexport function downloadActiveWithAddressReport(\n companyId: number,\n serviceType: string,\n startDate?: string,\n endDate?: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download active with address report for invalid company.'));\n }\n\n try {\n const start = validateDate(\n 'Cannot download active with address report for invalid start date.',\n startDate ?? dayjs().format(),\n );\n const end = validateDate(\n 'Cannot download active with address report for invalid end date.',\n endDate ?? dayjs().format(),\n );\n\n // eslint-disable-next-line max-len\n const uri = queryStringTag`/api/companies/${companyId}/reports/active-participants/${serviceType}/with-address/export${start}${end}`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n } catch (err) {\n return Promise.reject(err);\n }\n}\n","import { useState } from 'react';\nimport { compose, F, T, tap } from 'ramda';\n\nimport ReportsTile from '../../shared/ReportsTile';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useSelector } from 'react-redux';\nimport { downloadTerminatedParticipantsReport } from 'shared/api/terminatedParticipantsApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { CRLType } from 'shared/types/non-plan-year.types';\n\ninterface TerminatedParticipantsProps {\n serviceType: CRLType;\n description: string;\n startDate: string | null;\n endDate: string | null;\n count: number | null;\n}\n\nfunction TerminatedParticipants({ serviceType, description, startDate, endDate, count }: TerminatedParticipantsProps) {\n const [ downloading, setDownloading ] = useState(false);\n const doneDownloading = compose(setDownloading, F);\n const startDownloading = compose(setDownloading, T);\n\n const errorNotifier = useErrorNotifier();\n const handleError = compose(tap(doneDownloading), errorNotifier);\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n function handleExport() {\n startDownloading();\n downloadTerminatedParticipantsReport(compid, serviceType, startDate ?? undefined, endDate ?? undefined)\n .then(doneDownloading)\n .catch(handleError);\n }\n\n return (\n <ReportsTile\n count={count}\n title=\"Terminations\"\n description={description}\n exportDisabled={count === null || !startDate || !endDate}\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n\nexport default TerminatedParticipants;\n","import dayjs from 'dayjs';\nimport request, { ContentType } from '../api-request';\nimport { validateDate } from './validateDate';\nimport queryStringTag from './reportQueryStringTag';\n\nexport function downloadTerminatedParticipantsReport(\n companyId: number,\n type: 'cobra' | 'retiree' | 'loa',\n startDate?: string,\n endDate?: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download terminated participant report for invalid company.'));\n }\n\n try {\n const start = validateDate(\n 'Cannot download terminated participant report for invalid start date.',\n startDate ?? dayjs().format(),\n );\n const end = validateDate(\n 'Cannot download terminated participant report for invalid end date.',\n endDate ?? dayjs().format(),\n );\n\n const uri =\n queryStringTag`/api/companies/${companyId}/reports/terminated-participants/${type}/export${start}${end}`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n } catch (err) {\n return Promise.reject(err);\n }\n}\n","import { useState } from 'react';\nimport { compose, F, T, tap } from 'ramda';\n\nimport ReportsTile from '../../shared/ReportsTile';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useSelector } from 'react-redux';\nimport { download1095CReport } from 'shared/api/ten95CApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { CRLType } from 'shared/types/non-plan-year.types';\n\ninterface Ten95CDataProps {\n startDate: string | null;\n endDate: string | null;\n count: number | null;\n reportType: CRLType;\n}\n\nfunction Ten95CData({ startDate, endDate, count, reportType }: Ten95CDataProps) {\n const [ downloading, setDownloading ] = useState(false);\n const doneDownloading = compose(setDownloading, F);\n const startDownloading = compose(setDownloading, T);\n\n const errorNotifier = useErrorNotifier();\n const handleError = compose(tap(doneDownloading), errorNotifier);\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n function handleExport() {\n startDownloading();\n download1095CReport(compid, reportType, startDate ?? undefined, endDate ?? undefined)\n .then(doneDownloading)\n .catch(handleError);\n }\n\n return (\n <ReportsTile\n count={count}\n title=\"1095-C Data\"\n description={`List of participants for the tax year and their months active on ${reportType.toUpperCase()}.`}\n exportDisabled={count === null || !startDate || !endDate}\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n\nexport default Ten95CData;\n","import dayjs from 'dayjs';\nimport { CRLType } from 'shared/types/non-plan-year.types';\nimport request, { ContentType } from '../api-request';\nimport { validateDate } from './validateDate';\nimport queryStringTag from './reportQueryStringTag';\n\nexport function download1095CReport(\n companyId: number,\n reportType: CRLType,\n startDate?: string,\n endDate?: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download 1095-C data report for invalid company.'));\n }\n\n try {\n const start = validateDate(\n 'Cannot download 1095-C data report for invalid start date.',\n startDate ?? dayjs().format(),\n );\n const end = validateDate(\n 'Cannot download 1095-C data report for invalid end date.',\n endDate ?? dayjs().format(),\n );\n\n const uri =\n queryStringTag`/api/companies/${companyId}/reports/${reportType}/ten95C-data/export${start}${end}`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n } catch (err) {\n return Promise.reject(err);\n }\n}\n","import { useState, useRef, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { compose, tap, always } from 'ramda';\n\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { RetireeDateRangeCounts } from '../retiree-report-types';\nimport { getRetireeCountsByDateRange } from 'shared/api/retireeDateRangeReportsApi';\nimport { selectSelectedCompany } from 'companies/companies.slice';\n\nexport const defaultCounts: RetireeDateRangeCounts = {\n noticesMailed: 0,\n pendingNotices: 0,\n paymentsReceived: 0,\n currentActive: 0,\n monthlyRecap: 0,\n acceptancesReceived: 0,\n invoiceStatus: 0,\n activeWithAddress: 0,\n termsFromRetiree: 0,\n ten95cData: 0,\n turningSixtyFive: 0,\n newEnrollments: 0,\n overDueInvoices: 0,\n};\n\nexport function useRetireeReportCounts(startDate: string, endDate: string) {\n const errorNotifier = useErrorNotifier();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const [ reportCounts, setReportCounts ] = useState<RetireeDateRangeCounts | null>(null);\n\n const [ setDefault ] = useState(() => compose(setReportCounts, always(defaultCounts)));\n const [ handleError ] = useState(() => compose(tap(setDefault), errorNotifier));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n if (compid > 0 && !!startDate && !!endDate) {\n setReportCounts(null);\n getRetireeCountsByDateRange(compid, startDate, endDate)\n .then((result) => {\n if (mountedRef.current) {\n setReportCounts(result ?? defaultCounts);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n }\n\n return () => {\n mountedRef.current = false;\n };\n }, [ handleError, compid, startDate, endDate ]);\n\n return reportCounts;\n}\n","import dayjs from 'dayjs';\n\nimport { RetireeDateRangeCounts } from 'reports/retiree/retiree-report-types';\nimport request from '../api-request';\nimport { validateDate } from './validateDate';\nimport queryStringTag from './reportQueryStringTag';\n\nexport function getRetireeCountsByDateRange(companyId: number, startDate?: string, endDate?: string) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load Retiree participant counts for invalid company.'));\n }\n\n try {\n const serviceType = 'retiree';\n const start = validateDate(\n 'Cannot load Retiree participant counts for invalid start date.',\n startDate ?? dayjs().format(),\n );\n const end = validateDate(\n 'Cannot load Retiree participant counts for invalid end date.',\n endDate ?? dayjs().format(),\n );\n\n const uri = queryStringTag`/api/companies/${companyId}/reports/date-range/${serviceType}${start}${end}`;\n\n return request<RetireeDateRangeCounts>(uri);\n } catch (err) {\n return Promise.reject(err);\n }\n}\n","import { useState } from 'react';\nimport { compose, F, T, tap } from 'ramda';\n\nimport ReportsTile from '../../shared/ReportsTile';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useSelector } from 'react-redux';\nimport { downloadTurningSixtyFiveReport } from 'shared/api/turningSixtyFiveApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { CRLType } from 'shared/types/non-plan-year.types';\n\ninterface TurningSixtyFiveProps {\n serviceType: CRLType;\n startDate: string | null;\n endDate: string | null;\n count: number | null;\n}\n\nfunction TurningSixtyFive({ serviceType, startDate, endDate, count }: TurningSixtyFiveProps) {\n const [ downloading, setDownloading ] = useState(false);\n const doneDownloading = compose(setDownloading, F);\n const startDownloading = compose(setDownloading, T);\n\n const errorNotifier = useErrorNotifier();\n const handleError = compose(tap(doneDownloading), errorNotifier);\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n function handleExport() {\n startDownloading();\n downloadTurningSixtyFiveReport(compid, serviceType, startDate ?? undefined, endDate ?? undefined)\n .then(doneDownloading)\n .catch(handleError);\n }\n\n return (\n <ReportsTile\n count={count}\n title=\"Participants Turning 65\"\n description=\"List of participants that will turn 65 within the date range selected.\"\n exportDisabled={count === null || !startDate || !endDate}\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n\nexport default TurningSixtyFive;\n","import dayjs from 'dayjs';\nimport request, { ContentType } from '../api-request';\nimport { validateDate } from './validateDate';\nimport queryStringTag from './reportQueryStringTag';\n\nexport function downloadTurningSixtyFiveReport(\n companyId: number,\n type: 'cobra' | 'retiree' | 'loa',\n startDate?: string,\n endDate?: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download turning sixty five report for invalid company.'));\n }\n\n try {\n const start = validateDate('Cannot download turning sixty five report for invalid start date.',\n startDate ?? dayjs().format());\n const end = validateDate('Cannot download turning sixty five report for invalid end date.',\n endDate ?? dayjs().format());\n\n const uri = queryStringTag`/api/companies/${companyId}/reports/turning-sixty-five/${type}/export${start}${end}`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n } catch (err) {\n return Promise.reject(err);\n }\n}\n","import { useState } from 'react';\nimport { compose, F, T, tap } from 'ramda';\n\nimport ReportsTile from '../../shared/ReportsTile';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useSelector } from 'react-redux';\nimport { downloadNewEnrollmentsReport } from 'shared/api/newEnrollmentsApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { CRLType } from 'shared/types/non-plan-year.types';\n\ninterface NewEnrollmentsProps {\n serviceType: CRLType;\n startDate: string | null;\n endDate: string | null;\n count: number | null;\n}\n\nfunction NewEnrollments({ serviceType, startDate, endDate, count }: NewEnrollmentsProps) {\n const [ downloading, setDownloading ] = useState(false);\n const doneDownloading = compose(setDownloading, F);\n const startDownloading = compose(setDownloading, T);\n\n const errorNotifier = useErrorNotifier();\n const handleError = compose(tap(doneDownloading), errorNotifier);\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n function handleExport() {\n startDownloading();\n downloadNewEnrollmentsReport(compid, serviceType, startDate ?? undefined, endDate ?? undefined)\n .then(doneDownloading)\n .catch(handleError);\n }\n\n return (\n <ReportsTile\n count={count}\n title=\"New Enrollments\"\n description=\"List of participants added within the date range selected.\"\n exportDisabled={count === null || !startDate || !endDate}\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n\nexport default NewEnrollments;\n","import dayjs from 'dayjs';\nimport request, { ContentType } from '../api-request';\nimport { validateDate } from './validateDate';\nimport queryStringTag from './reportQueryStringTag';\n\nexport function downloadNewEnrollmentsReport(\n companyId: number,\n type: 'cobra' | 'retiree' | 'loa',\n startDate?: string,\n endDate?: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download new enrollments report for invalid company.'));\n }\n\n try {\n const start = validateDate('Cannot download new enrollments report for invalid start date.',\n startDate ?? dayjs().format());\n const end = validateDate('Cannot download new enrollments report for invalid end date.',\n endDate ?? dayjs().format());\n\n const uri = queryStringTag`/api/companies/${companyId}/reports/new-enrollments/${type}/export${start}${end}`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n } catch (err) {\n return Promise.reject(err);\n }\n}\n","import { useState } from 'react';\nimport { compose, F, T, tap } from 'ramda';\n\nimport ReportsTile from '../../shared/ReportsTile';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useSelector } from 'react-redux';\nimport { downloadOverDueInvoicesReport } from 'shared/api/overDueInvoicesApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { CRLType } from 'shared/types/non-plan-year.types';\n\ninterface OverDueInvoicesProps {\n serviceType: CRLType;\n startDate: string | null;\n endDate: string | null;\n count: number | null;\n}\n\nfunction OverDueInvoices({ serviceType, startDate, endDate, count }: OverDueInvoicesProps) {\n const [ downloading, setDownloading ] = useState(false);\n const doneDownloading = compose(setDownloading, F);\n const startDownloading = compose(setDownloading, T);\n\n const errorNotifier = useErrorNotifier();\n const handleError = compose(tap(doneDownloading), errorNotifier);\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n function handleExport() {\n startDownloading();\n downloadOverDueInvoicesReport(compid, serviceType, startDate ?? undefined, endDate ?? undefined)\n .then(doneDownloading)\n .catch(handleError);\n }\n\n return (\n <ReportsTile\n count={count}\n title=\"Overdue Invoices\"\n description=\"List of outstanding invoices that are past due.\"\n exportDisabled={count === null || !startDate || !endDate}\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n\nexport default OverDueInvoices;\n","import dayjs from 'dayjs';\nimport request, { ContentType } from '../api-request';\nimport { validateDate } from './validateDate';\nimport queryStringTag from './reportQueryStringTag';\n\nexport function downloadOverDueInvoicesReport(\n companyId: number,\n type: 'cobra' | 'retiree' | 'loa',\n startDate?: string,\n endDate?: string,\n) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download overdue invoices report for invalid company.'));\n }\n\n try {\n const start = validateDate('Cannot download overdue invoices report for invalid start date.',\n startDate ?? dayjs().format());\n const end = validateDate('Cannot download overdue invoices report for invalid end date.',\n endDate ?? dayjs().format());\n\n const uri = queryStringTag`/api/companies/${companyId}/reports/overdue-invoices/${type}/export${start}${end}`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n } catch (err) {\n return Promise.reject(err);\n }\n}\n","import { useState, useRef, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { compose, tap, always } from 'ramda';\n\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { LoaDateRangeCounts } from '../loa-report-types';\nimport { getLoaCountsByDateRange } from 'shared/api/loaDateRangeReportsApi';\nimport { selectSelectedCompany } from 'companies/companies.slice';\n\nexport const defaultCounts: LoaDateRangeCounts = {\n noticesMailed: 0,\n pendingNotices: 0,\n paymentsReceived: 0,\n currentActive: 0,\n monthlyRecap: 0,\n acceptancesReceived: 0,\n invoiceStatus: 0,\n activeWithAddress: 0,\n termsFromLoa: 0,\n turningSixtyFive: 0,\n newEnrollments: 0,\n overDueInvoices: 0,\n};\n\nexport function useLoaReportCounts(startDate: string, endDate: string) {\n const errorNotifier = useErrorNotifier();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const [ reportCounts, setReportCounts ] = useState<LoaDateRangeCounts | null>(null);\n\n const [ setDefault ] = useState(() => compose(setReportCounts, always(defaultCounts)));\n const [ handleError ] = useState(() => compose(tap(setDefault), errorNotifier));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n if (compid > 0 && !!startDate && !!endDate) {\n setReportCounts(null);\n getLoaCountsByDateRange(compid, startDate, endDate)\n .then((result) => {\n if (mountedRef.current) {\n setReportCounts(result ?? defaultCounts);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n }\n\n return () => {\n mountedRef.current = false;\n };\n }, [ handleError, compid, startDate, endDate ]);\n\n return reportCounts;\n}\n","import dayjs from 'dayjs';\n\nimport { LoaDateRangeCounts } from 'reports/loa/loa-report-types';\nimport request from '../api-request';\nimport { validateDate } from './validateDate';\nimport queryStringTag from './reportQueryStringTag';\n\nexport function getLoaCountsByDateRange(companyId: number, startDate?: string, endDate?: string) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot load Loa participant counts for invalid company.'));\n }\n\n try {\n const serviceType = 'loa';\n const start = validateDate('Cannot load Loa participant counts for invalid start date.',\n startDate ?? dayjs().format());\n const end = validateDate('Cannot load Loa participant counts for invalid end date.',\n endDate ?? dayjs().format());\n\n const uri = queryStringTag`/api/companies/${companyId}/reports/date-range/${serviceType}${start}${end}`;\n\n return request<LoaDateRangeCounts>(uri);\n } catch (err) {\n return Promise.reject(err);\n }\n}\n","import { ReactElement } from 'react';\nimport ReportsTile from 'reports/shared/ReportsTile';\nimport { downloadFmlaExcel } from 'shared/api/fmlaReportsApi';\nimport { useDownloading } from 'shared/custom-hooks/useDownloading';\nimport { FMLAGenericTileProps } from 'reports/fmla/FMLAReports';\n\nexport function GenericFMLAReportTile({\n count,\n reportData,\n title,\n description,\n variant,\n}: Readonly<FMLAGenericTileProps>): ReactElement {\n const {\n downloading,\n handleExport,\n } = useDownloading(downloadFmlaExcel, { ...reportData });\n\n return (\n <ReportsTile\n count={count}\n title={title}\n description={description}\n variant={variant}\n exportDisabled={count === null}\n onExport={handleExport}\n downloading={downloading}\n />\n );\n}\n","import React, { ComponentType } from 'react';\n\nimport { ReportType } from './reports.types';\nimport TabPanel from 'components/shared/TabPanel';\nimport BalanceAccountReports from './balance/BalanceAccountReports';\nimport CustomReimbursementReports from './custom/CustomReports';\nimport COBRAReports from './cobra/COBRAReports';\nimport RetireeBillingReports from './retiree/RetireeBillingReports';\nimport LoaBillingReports from './loa/LoaBillingReports';\nimport { FMLAReports } from 'reports/fmla/FMLAReports';\nimport { FMLAMarketingTabPanel } from './fmla/FMLAMarketingTabPanel';\n\nconst tabTypeMap: Map<ReportType, ComponentType<React.PropsWithChildren<unknown>>> = new Map([\n [ 'balance', BalanceAccountReports ],\n [ 'cobra', COBRAReports ],\n [ 'retiree', RetireeBillingReports ],\n [ 'loa', LoaBillingReports ],\n [ 'custom', CustomReimbursementReports ],\n [ 'fmla', FMLAReports ],\n [ 'fmla-marketing', FMLAMarketingTabPanel ],\n]);\n\ninterface ReportsTabPanelsProps {\n reportTypes: ReportType[];\n activeTab: ReportType;\n}\n\nfunction ReportsTabPanels({ reportTypes, activeTab }: ReportsTabPanelsProps) {\n function renderComp(type: ReportType) {\n const Comp = tabTypeMap.get(type);\n\n return Comp ? <div data-testid={`${type}-tab-panel`}><Comp /></div> : <></>;\n }\n\n return (\n <>\n {\n reportTypes.map((type) => {\n return (\n <TabPanel value={activeTab} index={type} key={`${type}-tab-panel`}>\n { activeTab === type ? renderComp(type) : <></> }\n </TabPanel>\n );\n })\n }\n </>\n );\n}\n\nexport default ReportsTabPanels;\n","import { useState } from 'react';\nimport dayjs from 'dayjs';\n\nimport PageContentPaper from 'components/layout/PageContentPaper';\n\nimport ReportDateRangeFilter from 'reports/shared/ReportDateRangeFilter';\nimport { useCobraReportCounts } from './hooks/useCobraReportCounts';\n\nimport InitialNoticeSent from './tiles/InitialNoticeSent';\nimport NoResponseWithAddress from './tiles/NoResponseWithAddress';\n\nimport PendingResponses from '../nonPlanYearServices/tiles/PendingResponses';\nimport ActiveParticipants from '../nonPlanYearServices/tiles/ActiveParticipants';\nimport PendingNotices from '../nonPlanYearServices/tiles/PendingNotices';\nimport CurrentActive from '../nonPlanYearServices/tiles/CurrentActive';\nimport NoticesMailed from '../nonPlanYearServices/tiles/NoticesMailed';\nimport PaymentsReceived from '../nonPlanYearServices/tiles/PaymentsReceived';\nimport MonthlyRecap from '../nonPlanYearServices/tiles/MonthlyRecap';\nimport AcceptanceReceived from '../nonPlanYearServices/tiles/AcceptanceReceived';\nimport InvoiceStatus from '../nonPlanYearServices/tiles/InvoiceStatus';\nimport ActiveWithAddress from '../nonPlanYearServices/tiles/ActiveWithAddress';\nimport TerminatedParticipants from '../nonPlanYearServices/tiles/TerminatedParticipants';\nimport Ten95CData from '../nonPlanYearServices/tiles/Ten95CData';\n\nfunction COBRAReports() {\n const [ startDate, setStartDate ] = useState<string>(dayjs().format('YYYY-MM-DD'));\n const [ endDate, setEndDate ] = useState<string>(dayjs().format('YYYY-MM-DD'));\n\n const counts = useCobraReportCounts(startDate, endDate);\n\n function handleApply(start: string, end: string) {\n setStartDate(start);\n setEndDate(end);\n }\n\n return (\n <div className=\"w-full flex space-x-8\">\n <PageContentPaper className=\"w-3/4\">\n <div className=\"space-y-4\">\n <div className=\"w-full\">\n <ReportDateRangeFilter onFilterChange={handleApply} />\n </div>\n <div className=\"grid grid-flow-row grid-cols-3 grid-rows-4 gap-8\">\n <NoticesMailed\n serviceType=\"cobra\"\n count={counts?.noticesMailed ?? null}\n startDate={startDate}\n endDate={endDate}\n />\n <PaymentsReceived\n startDate={startDate}\n endDate={endDate}\n count={counts?.paymentsReceived ?? null}\n reportType=\"cobra\"\n />\n <CurrentActive\n serviceType=\"cobra\"\n description=\"This report looks for participants in the system during the date range\nentered and will provide you with detail regarding those participants who elected coverage within the date range.\"\n count={counts?.currentActive ?? null}\n startDate={startDate}\n endDate={endDate}\n />\n <MonthlyRecap\n count={counts?.monthlyRecap ?? null}\n serviceType=\"cobra\"\n startDate={startDate}\n endDate={endDate}\n />\n <AcceptanceReceived\n serviceType=\"cobra\"\n description=\"List of participants that have accepted COBRA coverage\nand what plans they elected.Please note this does not necessarily mean that the participant has paid,\nbut they have elected COBRA coverage.\"\n count={counts?.acceptancesReceived ?? null}\n startDate={startDate}\n endDate={endDate}\n />\n <InvoiceStatus\n count={counts?.invoiceStatus ?? null}\n serviceType=\"cobra\"\n startDate={startDate}\n endDate={endDate}\n />\n <InitialNoticeSent count={counts?.initialNoticesSent ?? null} startDate={startDate} endDate={endDate} />\n <ActiveWithAddress\n count={counts?.activeWithAddress ?? null}\n serviceType=\"cobra\"\n description=\"List of active COBRA participants with their addresses.\"\n startDate={startDate}\n endDate={endDate}\n />\n <TerminatedParticipants\n count={counts?.termsFromCobra ?? null}\n serviceType=\"cobra\"\n description=\"List of participants that have terminated off of COBRA and their reason for termination\nwithin the date range selected.\"\n startDate={startDate}\n endDate={endDate}\n />\n <Ten95CData count={counts?.ten95cData ?? null} startDate={startDate} endDate={endDate} reportType=\"cobra\" />\n </div>\n </div>\n </PageContentPaper>\n <div className=\"w-1/4 flex flex-col space-y-8\">\n <PendingResponses serviceType=\"cobra\" />\n <PendingNotices type=\"qe\" serviceType=\"cobra\" />\n <ActiveParticipants serviceType=\"cobra\" />\n <NoResponseWithAddress />\n </div>\n </div>\n );\n}\n\nexport default COBRAReports;\n","import { useState } from 'react';\nimport dayjs from 'dayjs';\n\nimport PageContentPaper from 'components/layout/PageContentPaper';\n\nimport ReportDateRangeFilter from 'reports/shared/ReportDateRangeFilter';\nimport { useRetireeReportCounts } from './hooks/useRetireeReportCounts';\nimport PendingResponses from '../nonPlanYearServices/tiles/PendingResponses';\nimport ActiveParticipants from '../nonPlanYearServices/tiles/ActiveParticipants';\nimport PendingNotices from '../nonPlanYearServices/tiles/PendingNotices';\nimport CurrentActive from '../nonPlanYearServices/tiles/CurrentActive';\nimport NoticesMailed from '../nonPlanYearServices/tiles/NoticesMailed';\nimport AcceptanceReceived from '../nonPlanYearServices/tiles/AcceptanceReceived';\nimport PaymentsReceived from '../nonPlanYearServices/tiles/PaymentsReceived';\nimport MonthlyRecap from '../nonPlanYearServices/tiles/MonthlyRecap';\nimport InvoiceStatus from '../nonPlanYearServices/tiles/InvoiceStatus';\nimport ActiveWithAddress from '../nonPlanYearServices/tiles/ActiveWithAddress';\nimport TerminatedParticipants from '../nonPlanYearServices/tiles/TerminatedParticipants';\nimport Ten95CData from '../nonPlanYearServices/tiles/Ten95CData';\nimport TurningSixtyFive from '../nonPlanYearServices/tiles/TurningSixtyFive';\nimport NewEnrollments from '../nonPlanYearServices/tiles/NewEnrollments';\nimport OverDueInvoices from '../nonPlanYearServices/tiles/OverDueInvoices';\n\nfunction RetireeBillingReports() {\n const [ startDate, setStartDate ] = useState<string>(dayjs().format('YYYY-MM-DD'));\n const [ endDate, setEndDate ] = useState<string>(dayjs().format('YYYY-MM-DD'));\n\n const counts = useRetireeReportCounts(startDate, endDate);\n\n function handleApply(start: string, end: string) {\n setStartDate(start);\n setEndDate(end);\n }\n\n return (\n <div className=\"w-full flex space-x-8\">\n <PageContentPaper className=\"w-3/4\">\n <div className=\"space-y-4\">\n <div className=\"w-full\">\n <ReportDateRangeFilter onFilterChange={handleApply} />\n </div>\n <div className=\"grid grid-flow-row grid-cols-3 grid-rows-4 gap-8\">\n <NoticesMailed\n serviceType=\"retiree\"\n count={counts?.noticesMailed ?? null}\n startDate={startDate}\n endDate={endDate}\n />\n <PaymentsReceived\n startDate={startDate}\n endDate={endDate}\n count={counts?.paymentsReceived ?? null}\n reportType=\"retiree\"\n />\n <CurrentActive\n serviceType=\"retiree\"\n description=\"This report looks for participants in the system during the date range entered and will\nprovide you with detail regarding those participants considered active with Event Dates within the date range.\"\n count={counts?.currentActive ?? null}\n startDate={startDate}\n endDate={endDate}\n />\n <MonthlyRecap\n count={counts?.monthlyRecap ?? null}\n serviceType=\"retiree\"\n startDate={startDate}\n endDate={endDate}\n />\n <AcceptanceReceived\n serviceType=\"retiree\"\n description=\"List of participants that have accepted coverage\nand what plans they have elected. ** This report does not confirm payment received.\"\n count={counts?.acceptancesReceived ?? null}\n startDate={startDate}\n endDate={endDate}\n />\n <InvoiceStatus\n count={counts?.invoiceStatus ?? null}\n serviceType=\"retiree\"\n startDate={startDate}\n endDate={endDate}\n />\n <ActiveWithAddress\n count={counts?.activeWithAddress ?? null}\n serviceType=\"retiree\"\n description=\"List of active participants with their addresses.\"\n startDate={startDate}\n endDate={endDate}\n />\n <TerminatedParticipants\n count={counts?.termsFromRetiree ?? null}\n serviceType=\"retiree\"\n description=\"List of participants that have terminated and their reason for termination\nwithin the date range selected.\"\n startDate={startDate}\n endDate={endDate}\n />\n <Ten95CData\n count={counts?.ten95cData ?? null}\n startDate={startDate}\n endDate={endDate}\n reportType=\"retiree\"\n />\n <TurningSixtyFive\n count={counts?.turningSixtyFive ?? null}\n serviceType=\"retiree\"\n startDate={startDate}\n endDate={endDate}\n />\n <NewEnrollments\n count={counts?.newEnrollments ?? null}\n serviceType=\"retiree\"\n startDate={startDate}\n endDate={endDate}\n />\n <OverDueInvoices\n count={counts?.overDueInvoices ?? null}\n serviceType=\"retiree\"\n startDate={startDate}\n endDate={endDate}\n />\n </div>\n </div>\n </PageContentPaper>\n <div className=\"w-1/4 flex flex-col space-y-8\">\n <PendingResponses serviceType=\"retiree\" />\n <PendingNotices type=\"qe\" serviceType=\"retiree\" />\n <ActiveParticipants serviceType=\"retiree\" />\n </div>\n </div>\n );\n}\n\nexport default RetireeBillingReports;\n","import { useState } from 'react';\nimport dayjs from 'dayjs';\n\nimport PageContentPaper from 'components/layout/PageContentPaper';\n\nimport ReportDateRangeFilter from 'reports/shared/ReportDateRangeFilter';\nimport { useLoaReportCounts } from './hooks/useLoaReportCounts';\nimport PendingResponses from '../nonPlanYearServices/tiles/PendingResponses';\nimport ActiveParticipants from '../nonPlanYearServices/tiles/ActiveParticipants';\nimport PendingNotices from '../nonPlanYearServices/tiles/PendingNotices';\nimport CurrentActive from '../nonPlanYearServices/tiles/CurrentActive';\nimport NoticesMailed from '../nonPlanYearServices/tiles/NoticesMailed';\nimport AcceptanceReceived from '../nonPlanYearServices/tiles/AcceptanceReceived';\nimport PaymentsReceived from '../nonPlanYearServices/tiles/PaymentsReceived';\nimport MonthlyRecap from '../nonPlanYearServices/tiles/MonthlyRecap';\nimport InvoiceStatus from '../nonPlanYearServices/tiles/InvoiceStatus';\nimport ActiveWithAddress from '../nonPlanYearServices/tiles/ActiveWithAddress';\nimport TerminatedParticipants from '../nonPlanYearServices/tiles/TerminatedParticipants';\nimport TurningSixtyFive from '../nonPlanYearServices/tiles/TurningSixtyFive';\nimport NewEnrollments from '../nonPlanYearServices/tiles/NewEnrollments';\nimport OverDueInvoices from '../nonPlanYearServices/tiles/OverDueInvoices';\n\nfunction LoaBillingReports() {\n const [ startDate, setStartDate ] = useState<string>(dayjs().format('YYYY-MM-DD'));\n const [ endDate, setEndDate ] = useState<string>(dayjs().format('YYYY-MM-DD'));\n\n const counts = useLoaReportCounts(startDate, endDate);\n\n function handleApply(start: string, end: string) {\n setStartDate(start);\n setEndDate(end);\n }\n\n return (\n <div className=\"w-full flex space-x-8\">\n <PageContentPaper className=\"w-3/4\">\n <div className=\"space-y-4\">\n <div className=\"w-full\">\n <ReportDateRangeFilter onFilterChange={handleApply} />\n </div>\n <div className=\"grid grid-flow-row grid-cols-3 grid-rows-4 gap-8\">\n <NoticesMailed\n serviceType=\"loa\"\n count={counts?.noticesMailed ?? null}\n startDate={startDate}\n endDate={endDate}\n />\n <PaymentsReceived\n startDate={startDate}\n endDate={endDate}\n count={counts?.paymentsReceived ?? null}\n reportType=\"loa\"\n />\n <CurrentActive\n serviceType=\"loa\"\n description=\"This report looks for participants in the system during the date range entered and will\nprovide you with detail regarding those participants considered active with Event Dates within the date range.\"\n count={counts?.currentActive ?? null}\n startDate={startDate}\n endDate={endDate}\n />\n <MonthlyRecap\n count={counts?.monthlyRecap ?? null}\n serviceType=\"loa\"\n startDate={startDate}\n endDate={endDate}\n />\n <AcceptanceReceived\n serviceType=\"loa\"\n description=\"List of participants that have accepted coverage\nand what plans they have elected. ** This report does not confirm payment received.\"\n count={counts?.acceptancesReceived ?? null}\n startDate={startDate}\n endDate={endDate}\n />\n <InvoiceStatus\n count={counts?.invoiceStatus ?? null}\n serviceType=\"loa\"\n startDate={startDate}\n endDate={endDate}\n />\n <ActiveWithAddress\n count={counts?.activeWithAddress ?? null}\n serviceType=\"loa\"\n description=\"List of active participants with their addresses.\"\n startDate={startDate}\n endDate={endDate}\n />\n <TerminatedParticipants\n count={counts?.termsFromLoa ?? null}\n serviceType=\"loa\"\n description=\"List of participants that have terminated and their reason for termination\nwithin the date range selected.\"\n startDate={startDate}\n endDate={endDate}\n />\n <TurningSixtyFive\n count={counts?.turningSixtyFive ?? null}\n serviceType=\"loa\"\n startDate={startDate}\n endDate={endDate}\n />\n <NewEnrollments\n count={counts?.newEnrollments ?? null}\n serviceType=\"loa\"\n startDate={startDate}\n endDate={endDate}\n />\n <OverDueInvoices\n count={counts?.overDueInvoices ?? null}\n serviceType=\"loa\"\n startDate={startDate}\n endDate={endDate}\n />\n </div>\n </div>\n </PageContentPaper>\n <div className=\"w-1/4 flex flex-col space-y-8\">\n <PendingResponses serviceType=\"loa\" />\n <PendingNotices type=\"qe\" serviceType=\"loa\" />\n <ActiveParticipants serviceType=\"loa\" />\n </div>\n </div>\n );\n}\n\nexport default LoaBillingReports;\n","import { ReactElement, useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport store from 'store';\nimport {\n selectReportsCounts,\n selectStartAndEndDateRange,\n setFMLADateRange,\n} from 'reports/fmla/fmla-reports-slice';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport ReportDateRangeFilter from 'reports/shared/ReportDateRangeFilter';\nimport {\n fetchDateFilterableFmlaReports,\n fetchFMLAReportCountsForDashboard,\n} from 'reports/fmla/fmla-reports.thunks';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { GenericFMLAReportTile } from 'reports/nonPlanYearServices/tiles/GenericFMLAReportTile';\nimport { FmlaCompanyIdDatesAndReportType } from 'reports/fmla/fmla-report-types';\nimport { Variant } from 'reports/shared/ReportsTile';\n\nexport interface FMLAGenericTileProps {\n count: number | null;\n reportData: FmlaCompanyIdDatesAndReportType;\n title: string;\n description: string;\n variant?: Variant;\n}\n\nexport function FMLAReports (): ReactElement {\n const dispatch = useDispatch<typeof store.dispatch>();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const { startDate, endDate } = useSelector(selectStartAndEndDateRange);\n const {\n allOpenLeaveCaseListCount,\n allAbsencesListCount,\n usageTotalsCount,\n allLeaveCases,\n intermittentLeaveCaseListCount,\n pendingInfoCount,\n returnToWorkConfirmationCount,\n } = useSelector(selectReportsCounts);\n\n function handleDateRangeChange(start: string, end: string) {\n dispatch(setFMLADateRange({ start, end }));\n dispatch(fetchDateFilterableFmlaReports({\n compid,\n startDate: start,\n endDate: end,\n }));\n }\n\n useEffect(() => {\n dispatch(fetchFMLAReportCountsForDashboard({\n compid,\n }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <div className=\"w-full flex space-x-8\">\n <PageContentPaper className=\"w-3/4\">\n <div className=\"space-y-4\">\n <div className=\"w-full\">\n <ReportDateRangeFilter onFilterChange={handleDateRangeChange} applyOnInit />\n </div>\n <div className=\"grid grid-flow-row grid-cols-3 grid-rows-4 gap-8\" data-testId=\"open-case-list-card\">\n <GenericFMLAReportTile\n title=\"All Absences\"\n /* eslint-disable-next-line max-len */\n description=\"Absence list based on the date filter above\"\n reportData={ {\n reportType: 'all-absences',\n compid,\n startDate,\n endDate,\n } }\n count={allAbsencesListCount}\n />\n <GenericFMLAReportTile\n title=\"Usage Totals\"\n /* eslint-disable-next-line max-len */\n description=\"Usage totals by employee based on the date filter above\"\n reportData={ {\n reportType: 'usage-totals',\n compid,\n startDate,\n endDate,\n } }\n count={usageTotalsCount}\n />\n <GenericFMLAReportTile\n title=\"All Leave Cases\"\n description=\"Historic cases based on the date filter above\"\n reportData={ {\n reportType: 'all-leave-cases',\n compid,\n startDate,\n endDate,\n } }\n count={allLeaveCases}\n />\n </div>\n </div>\n </PageContentPaper>\n <div className=\"w-1/4 flex flex-col space-y-8\">\n <GenericFMLAReportTile\n title=\"Open Cases\"\n description=\"Detailed list of all open cases\"\n variant=\"primary-dark\"\n reportData={ {\n reportType: 'open-cases',\n compid,\n } }\n count={allOpenLeaveCaseListCount}\n />\n <GenericFMLAReportTile\n title=\"Intermittent Absences in past 2 weeks\"\n description=\"All intermittent absences reported to Flores Leave Solutions in the past two weeks\"\n variant=\"primary-dark\"\n reportData={ {\n reportType: 'intermittent-leave-cases',\n compid,\n } }\n count={intermittentLeaveCaseListCount}\n />\n <GenericFMLAReportTile\n title=\"Action Needed\"\n description=\"Open cases that are pending a response from you\"\n variant=\"primary-dark\"\n reportData={ {\n reportType: 'action-needed',\n compid,\n } }\n count={pendingInfoCount}\n />\n <GenericFMLAReportTile\n title=\"Return to Work Confirmation Needed\"\n description=\"Continuous LOA cases pending a return to work confirmation\"\n variant=\"primary-dark\"\n reportData={ {\n reportType: 'rtw-confirmation-needed',\n compid,\n } }\n count={returnToWorkConfirmationCount}\n />\n </div>\n </div>\n );\n}\n","import React, { ReactElement } from 'react';\nimport PageContentPaper from 'components/layout/PageContentPaper';\n\nexport function FMLAMarketingTabPanel(): ReactElement {\n return (\n <div className=\"w-full flex space-x-8\">\n <PageContentPaper className=\"w-full\">\n <p>\n These reports are available to clients with our Leave Solutions\n service. Are you in need of a leave administration provider? Flores\n Leave Solutions can help! <br />Contact your Flores Account Manager to learn\n more.\n </p>\n </PageContentPaper>\n </div>\n );\n}\n","import { useState } from 'react';\nimport { compose, F, T, tap } from 'ramda';\nimport dayjs from 'dayjs';\nimport Paper from '@mui/material/Paper';\n\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useSelector } from 'react-redux';\nimport { downloadGlobalReimbursementsReport } from 'shared/api/globalReimbursementsApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport ReportExportButton from 'reports/shared/ReportExportButton';\nimport AdapterDayJS from '@mui/lab/AdapterDayjs';\nimport LocalizationProvider from '@mui/lab/LocalizationProvider';\nimport DatePicker from '@mui/lab/DatePicker';\nimport TextField from '@mui/material/TextField';\n\nfunction GlobalReimbursements() {\n const [ startDate, setStartDate ] = useState<string>(dayjs().startOf('month').format('YYYY-MM-DD'));\n const [ endDate, setEndDate ] = useState<string>(dayjs().endOf('month').format('YYYY-MM-DD'));\n const [ dateHasError, setDateHasError ] = useState(false);\n const [ downloading, setDownloading ] = useState(false);\n const doneDownloading = compose(setDownloading, F);\n const startDownloading = compose(setDownloading, T);\n\n const errorNotifier = useErrorNotifier();\n const handleError = compose(tap(doneDownloading), errorNotifier);\n\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n function handleExport() {\n startDownloading();\n downloadGlobalReimbursementsReport(compid, startDate, endDate)\n .then(doneDownloading)\n .catch(handleError);\n }\n\n function handleStartDateChange(newDate: any) {\n setDateHasError(!newDate || !newDate.isValid());\n setStartDate(newDate?.format('YYYY-MM-DD') ?? '');\n }\n\n function handleEndDateChange(newDate: any) {\n setDateHasError(!newDate || !newDate.isValid());\n setEndDate(newDate?.format('YYYY-MM-DD') ?? '');\n }\n\n return (\n <Paper elevation={2} className=\"p-4 border-neutral5\">\n <div className=\"flex flex-row justify-between\">\n <h5 className=\"text-base text-high-em\">\n Global Reimbursements\n </h5>\n </div>\n <div className=\"w-full\">\n <div className=\"flex flex-row justify-between my-4\">\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n className=\"w-1/3\"\n label=\"Report Start Date\"\n inputFormat=\"MM/DD/YYYY\"\n value={startDate ? dayjs(startDate, 'YYYY-MM-DD').format('MM/DD/YYYY') : null}\n onChange={handleStartDateChange}\n InputProps={\n {\n className: `${!startDate ? 'MuiFormLabel-root' : ''} text-sm`,\n classes: {\n input: 'px-2 py-3',\n adornedEnd: 'pr-1',\n },\n }\n }\n InputAdornmentProps={ { classes: { positionEnd: 'ml-1' } } }\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n data-testid=\"monthly-report-date-range-filter-start\"\n variant=\"outlined\"\n className=\"w-full\"\n {...params}\n error={dateHasError}\n helperText={dateHasError && 'Please enter valid dates.'}\n />\n )}\n />\n </LocalizationProvider>\n\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n className=\"w-1/3\"\n label=\"Report End Date\"\n inputFormat=\"MM/DD/YYYY\"\n value={endDate ? dayjs(endDate, 'YYYY-MM-DD').format('MM/DD/YYYY') : null}\n onChange={handleEndDateChange}\n InputProps={\n {\n className: `${!endDate ? 'MuiFormLabel-root' : ''} text-sm`,\n classes: {\n input: 'px-2 py-3',\n adornedEnd: 'pr-1',\n },\n }\n }\n InputAdornmentProps={ { classes: { positionEnd: 'ml-1' } } }\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n data-testid=\"monthly-report-date-range-filter-end\"\n variant=\"outlined\"\n className=\"w-full\"\n {...params}\n error={dateHasError}\n helperText={dateHasError && 'Please enter valid dates.'}\n />\n )}\n />\n </LocalizationProvider>\n\n <ReportExportButton\n variant=\"light\"\n onExport={handleExport}\n title=\"Export Global Reimbursements\"\n disabled={dateHasError}\n downloading={downloading}\n />\n </div>\n </div>\n <p className=\"mt-4 text-gray-chateu\">\n All participant reimbursements for all plans in the selected date range.\n </p>\n </Paper>\n );\n}\n\nexport default GlobalReimbursements;\n","import dayjs from 'dayjs';\nimport { validateDate } from 'shared/api/validateDate';\nimport request, { ContentType } from 'shared/api-request';\n\nexport function downloadGlobalReimbursementsReport(companyId: number, startDate?: string, endDate?: string) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download monthly payments report for invalid company.'));\n }\n\n try {\n let uri = `/api/companies/${companyId}/reports/global-reimbursements/export`;\n const start = validateDate('Cannot download monthly payments report for invalid start date.',\n startDate ?? dayjs().format());\n const end = validateDate('Cannot download monthly payments report for invalid end date.',\n endDate ?? dayjs().format());\n let queryString = [];\n\n if (start) {\n queryString.push(`startDate=${start.format('YYYY-MM-DD')}`);\n }\n\n if (end) {\n queryString.push(`endDate=${end.format('YYYY-MM-DD')}`);\n }\n\n if (queryString.length) {\n uri += `?${queryString.join('&')}`;\n }\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.XLSX } });\n } catch (err) {\n return Promise.reject(err);\n }\n}\n","import GlobalReimbursements from 'reports/global/tiles/GlobalReimbursements';\n\nexport function GlobalReports() {\n return (\n <div>\n <h3 className=\"text-base font-medium uppercase\">Global Reports</h3>\n <div className=\"flex flex-row justify-start space-x-8 my-4\">\n <div className=\"w-1/3\">\n <GlobalReimbursements />\n </div>\n </div>\n </div>\n );\n}\n\nexport default GlobalReports;\n","import { useState, ChangeEvent } from 'react';\nimport { useParams } from 'react-router';\nimport Tab from '@mui/material/Tab';\nimport Tabs from '@mui/material/Tabs';\n\nimport { ReportType } from './reports.types';\nimport ReportsTabPanels from './ReportsTabPanels';\nimport styles from './ReportsTabs.module.css';\nimport GlobalReports from './global/GlobalReports';\n\ninterface ReportsTabsProps {\n reportTypes: ReportType[];\n}\n\nconst tabTypeMap: Map<ReportType, string> = new Map([\n [ 'balance', 'Balance Accounts' ],\n [ 'cobra', 'COBRA' ],\n [ 'retiree', 'Retiree Billing' ],\n [ 'loa', 'LOA Billing' ],\n [ 'custom', 'Custom Reimbursement' ],\n [ 'fmla', 'Leave Solutions' ],\n]);\n\nfunction ReportsTabs({ reportTypes }: ReportsTabsProps) {\n const { tab } = useParams<{tab?: ReportType;}>();\n const [ activeTab, setActiveTab ] = useState<ReportType>(tab ?? reportTypes[0]);\n\n function onChangeTab(e: ChangeEvent<{}>, newTab: ReportType) {\n if (newTab !== activeTab) {\n setActiveTab(newTab);\n }\n }\n\n return (\n <div className=\"w-full\">\n <GlobalReports />\n <Tabs\n indicatorColor=\"primary\"\n textColor=\"primary\"\n className=\"mb-4\"\n value={activeTab}\n onChange={onChangeTab}\n classes={ { flexContainer: styles.tabsBottomBoder } }\n >\n {\n reportTypes.map((type) => (\n <Tab value={type} label={tabTypeMap.get(type)} key={`${type}-tab`} className=\"min-w-0 max-w-none\" />\n ))\n }\n {\n !reportTypes.includes('fmla') && (\n <Tab\n value=\"fmla-marketing\"\n label=\"Leave Solutions\"\n key=\"fmla-marketing-tab\"\n className=\"min-w-0 max-w-none\"\n data-testid=\"fmla-marketing-tab\"\n />\n )\n }\n </Tabs>\n <ReportsTabPanels\n reportTypes={!reportTypes.includes('fmla') ? [ ...reportTypes, 'fmla-marketing' ] : reportTypes}\n activeTab={activeTab}\n />\n </div>\n );\n}\n\nexport default ReportsTabs;\n","import { useState, useRef, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { compose, tap, always } from 'ramda';\n\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { getReportTypes } from 'shared/api/reportsApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { ReportType } from './reports.types';\n\nexport function useReportTypes() {\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n const errorNotifier = useErrorNotifier();\n\n const [ reportTypes, setReportTypes ] = useState<ReportType[] | null>(null);\n const [ setDefault ] = useState(() => compose(setReportTypes, always([])));\n const [ handleError ] = useState(() => compose(tap(setDefault), errorNotifier));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n if (compid) {\n getReportTypes(compid)\n .then((result) => {\n if (mountedRef.current) {\n setReportTypes(result ?? []);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n }\n\n return () => {\n mountedRef.current = false;\n };\n }, [ handleError, compid ]);\n\n return reportTypes;\n}\n","import Loading from 'components/shared/Loading';\nimport ReportsTabs from './ReportsTabs';\nimport { useReportTypes } from './useReportTypes';\n\nfunction Reports() {\n const reportTypes = useReportTypes();\n\n return (\n <div className=\"w-full flex flex-col p-4\">\n <h2 className=\"page-title\">Reports</h2>\n <div className=\"w-full flex\">\n {\n reportTypes !== null\n ? <ReportsTabs reportTypes={reportTypes} />\n : <Loading text=\"Loading report types\" />\n }\n </div>\n </div>\n );\n}\n\nexport default Reports;\n","import { ReactElement, useEffect } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport { useSelector } from 'react-redux';\n\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { createAndSubmitForm } from 'shared/utils';\n\nfunction OpenEnrollment(): ReactElement {\n const history = useHistory();\n const { medplancd = '' } = useSelector(selectSelectedCompany) ?? {};\n\n useEffect(() => {\n if (medplancd) {\n createAndSubmitForm(document.createElement('form'), medplancd)\n .then(() => {\n history.goBack();\n });\n }\n }, [ history, medplancd ]);\n\n return (\n <>\n <PageContentPaper className=\"m-4\">\n <p>Redirecting to open enrollment checklist...</p>\n </PageContentPaper>\n </>\n );\n}\n\nexport default OpenEnrollment;\n","import PersonOutlineIcon from '@mui/icons-material/PersonOutline';\nimport PeopleOutlineIcon from '@mui/icons-material/PeopleOutline';\nimport LocalHospitalIcon from '@mui/icons-material/LocalHospital';\nimport DescriptionIcon from '@mui/icons-material/Description';\nimport EventIcon from '@mui/icons-material/Event';\n\nimport { WizardStep } from 'components/shared/WizardStepper';\n\nexport type DBEStepSlug = 'personal-details' | 'event-info' | 'dependents' | 'benefits' | 'summary';\n\nconst wizardSteps: Map<DBEStepSlug, WizardStep> = new Map([\n [\n 'personal-details',\n {\n label: 'Personal Details',\n icon: PersonOutlineIcon,\n slug: 'personal-details',\n next: 'event-info',\n },\n ],\n [\n 'event-info',\n {\n label: 'Event Info',\n icon: EventIcon,\n slug: 'event-info',\n next: 'dependents',\n prev: 'personal-details',\n },\n ],\n [\n 'dependents',\n {\n label: 'Dependents',\n icon: PeopleOutlineIcon,\n slug: 'dependents',\n next: 'benefits',\n prev: 'event-info',\n },\n ],\n [\n 'benefits',\n {\n label: 'Benefits',\n icon: LocalHospitalIcon,\n slug: 'benefits',\n next: 'summary',\n prev: 'dependents',\n },\n ],\n [\n 'summary',\n {\n label: 'Summary',\n icon: DescriptionIcon,\n slug: 'summary',\n prev: 'benefits',\n },\n ],\n]);\n\nexport default wizardSteps;\n","import { useState } from 'react';\nimport Button from '@mui/material/Button';\nimport { useFormik, FormikProps } from 'formik';\nimport { compose, T } from 'ramda';\n\nimport PayrollIdParticipantLookupInput, {\n setParticipantValues,\n} from 'components/shared/PayrollIdParticipantLookupInput';\nimport { Participant } from 'participant-search/participant-list.types';\nimport { DBParticipant, DirectBillingStepProps } from '../direct-billing.types';\nimport { validationSchema } from 'enter-cobra-qe/personal-details/cobra-qe-personal-details.validators';\nimport ParticipantDetails from 'components/shared/ParticipantDetails';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { resetEntry, selectDirectBillingQeEntry, setParticipant } from '../direct-billing.slice';\nimport { setSelectedParticipant } from 'participant-search/participant.slice';\nimport { defaultParticipant } from 'shared/constants';\nimport { useHistory } from 'react-router-dom';\nimport { QeParticipant } from 'shared/types/non-plan-year.types';\nimport store from 'store';\n\nfunction DirectBillingPersonalDetails({ onCancel }: DirectBillingStepProps) {\n const dispatch = useDispatch<typeof store.dispatch>();\n const history = useHistory();\n const [ searching, setSearching ] = useState(false);\n const details = useSelector(selectDirectBillingQeEntry);\n\n const form = useFormik<Partial<QeParticipant>>({\n initialValues: {\n ...defaultParticipant,\n ...details.participant,\n },\n validationSchema,\n onSubmit: (values) => {\n dispatch(setParticipant(values as DBParticipant));\n dispatch(setSelectedParticipant(values as Participant));\n history.push(`/direct-bill-event/event-info`);\n },\n });\n const setParticipantDetails = setParticipantValues(form.setFieldValue);\n\n const handleSearchStarted = compose(setSearching, T);\n\n function handleParticipant(p: Participant) {\n dispatch(resetEntry());\n setParticipantDetails(p);\n setSearching(false);\n }\n\n function handleCustomFieldChange(field: string) {\n return (value: string) => form.setFieldValue(field, value);\n }\n\n return (\n /* eslint-disable @typescript-eslint/no-unnecessary-condition */\n <form data-testid=\"directBillingPersonalDetails\">\n <div className=\"flex flex-col space-y-4\">\n <p>\n Enter the demographic information for the Retiree/LOA participant below.\n </p>\n <div className=\"flex flex-row pr-4\">\n <PayrollIdParticipantLookupInput\n className=\"w-1/2\"\n data-testid=\"participantLookup\"\n onSearchStarted={handleSearchStarted}\n onParticipantFound={handleParticipant}\n name=\"payrollid\"\n value={form.values.payrollid ?? ''}\n error={form.touched.payrollid && !!form.errors.payrollid}\n helperText={form.touched.payrollid && form.errors.payrollid}\n onTextChanged={handleCustomFieldChange('payrollid')}\n />\n </div>\n <ParticipantDetails form={form as FormikProps<Partial<QeParticipant>>} />\n </div>\n <div className=\"flex justify-end my-4\">\n <Button\n color=\"primary\"\n data-testid=\"cancelDirectBilling\"\n onClick={onCancel}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"button\"\n onClick={form.submitForm}\n data-testid=\"directBillingNextStep\"\n className=\"ml-4\"\n disabled={searching || (!!Object.values(form.touched).length && !!Object.values(form.errors).length)}\n >\n Next Step\n </Button>\n </div>\n </form>\n /* eslint-enable @typescript-eslint/no-unnecessary-condition */\n );\n}\n\nexport default DirectBillingPersonalDetails;\n","import { useSelector, useDispatch } from 'react-redux';\nimport { useEffect } from 'react';\nimport { useFormikContext } from 'formik';\nimport dayjs from 'dayjs';\nimport { compose } from 'ramda';\n\nimport styles from './DirectBillingEventInfoForm.module.css';\nimport {\n loadAvailableBenefits,\n loadEventTypes,\n selectDirectBillingEventTypes,\n} from 'direct-billing/direct-billing.slice';\nimport { handleDateChange, mapToSelectOption } from 'shared/form-helpers';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport CommonSelect from 'components/shared/form/CommonSelect';\nimport { DirectBillingEventType } from 'direct-billing/direct-billing.types';\nimport { noop } from 'shared/utils';\nimport AdapterDayJS from '@mui/lab/AdapterDayjs';\nimport LocalizationProvider from '@mui/lab/LocalizationProvider';\nimport DatePicker from '@mui/lab/DatePicker';\nimport TextField from '@mui/material/TextField';\nimport store from 'store';\nimport Skeleton from '@mui/material/Skeleton';\n\ninterface EventInfoFormProps {\n letterSent?: boolean;\n respPostmark?: boolean;\n updatingEvent?: boolean;\n}\n\nfunction mapEventTypesToOptions(events: DirectBillingEventType[] | null) {\n return mapToSelectOption(events ?? [], 'desc', 'r_qualevid');\n}\n\nfunction DirectBillingEventInfoForm({\n updatingEvent = false,\n letterSent = false,\n respPostmark = false,\n}: EventInfoFormProps) {\n const form = useFormikContext<any>();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const dispatch = useDispatch<typeof store.dispatch>();\n\n // don't load benefits in the create event wizard since it's handled elsewhere\n const updateBenefits = updatingEvent\n ? compose(dispatch, loadAvailableBenefits.bind(null, compid))\n : (_: string) => noop;\n\n function handleCoverageChange(event: any) {\n const value = event ? dayjs(event, 'MM/DD/YYYY').format('YYYY-MM-DD') : null;\n form.setFieldValue('coverageBegins', value);\n\n if (value) {\n updateBenefits(value);\n }\n }\n\n useEffect(() => {\n dispatch(loadEventTypes(compid));\n }, [ dispatch, compid ]);\n const events = useSelector(selectDirectBillingEventTypes);\n\n const EventSelectWithLoading = withLoopIcon(\n CommonSelect,\n 'Loading event types...',\n events === null,\n 'event-type-loading',\n );\n const options = mapEventTypesToOptions(events);\n\n return (\n <>\n <div className=\"flex flex-row basis-full mb-4\">\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n label=\"Event Date\"\n value={form.values.eventDate ? dayjs(form.values.eventDate, 'YYYY-MM-DD').format('MM/DD/YYYY') : null}\n onChange={handleDateChange('eventDate', form)}\n inputFormat=\"MM/DD/YYYY\"\n InputProps={\n {\n className: !form.values.eventDate ? 'MuiFormLabel-root' : '',\n tabIndex: -1,\n disabled: respPostmark,\n }\n }\n disabled={respPostmark}\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n data-testid=\"event-date\"\n className=\"event-info-event-date basis-2/4 mr-4\"\n variant=\"outlined\"\n name=\"eventDate\"\n {...params}\n error={form.touched.eventDate && Boolean(form.errors.eventDate)}\n helperText={form.touched.eventDate && form.errors.eventDate as any}\n />\n )}\n />\n </LocalizationProvider>\n {\n events !== null\n ?\n <EventSelectWithLoading\n onSelectChange={form.handleChange('eventType')}\n error={!!form.touched.eventType && !!form.errors.eventType}\n value={form.values.eventType}\n options={options}\n disabled={respPostmark}\n label=\"Retiree/LOA Events\"\n name=\"retiree-loa-events\"\n emptyOption={ {\n value: '-1',\n } }\n classes={ {\n control: `${styles.eventInfoFormField} basis-2/4 mr-4`,\n select: `event-info-type`,\n } }\n />\n :\n <div className=\"basis-2/4 mr-4\" data-testid=\"event-type-skeleton\">\n <Skeleton variant=\"rectangular\" width=\"100%\" height={60} />\n </div>\n }\n </div>\n <div className=\"flex flex-row basis-full\">\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n label=\"Coverage Begins\"\n value={\n form.values.coverageBegins ? dayjs(form.values.coverageBegins, 'YYYY-MM-DD').format('MM/DD/YYYY') : null\n }\n onChange={handleCoverageChange}\n inputFormat=\"MM/DD/YYYY\"\n className={styles.eventInfoFormField}\n InputProps={\n {\n className: !form.values.coverageBegins ? 'MuiFormLabel-root' : '',\n tabIndex: -1,\n disabled: respPostmark || letterSent,\n }\n }\n disabled={respPostmark || letterSent}\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n data-testid=\"coverage-begins\"\n variant=\"outlined\"\n className=\"event-info-coverage-begins basis-2/4 mr-4\"\n name=\"coverageBegins\"\n {...params}\n error={form.touched.coverageBegins && Boolean(form.errors.coverageBegins)}\n helperText={form.touched.coverageBegins && form.errors.coverageBegins as any}\n />\n )}\n />\n </LocalizationProvider>\n\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n label=\"Paid Through (Optional)\"\n value={form.values.paidThrough ? dayjs(form.values.paidThrough, 'YYYY-MM-DD').format('MM/DD/YYYY') : null}\n onChange={handleDateChange('paidThrough', form)}\n className={`mb-4 ${styles.eventInfoFormField}`}\n inputFormat=\"MM/DD/YYYY\"\n InputProps={\n {\n className: !form.values.paidThrough ? 'MuiFormLabel-root' : '',\n tabIndex: -1,\n disabled: respPostmark,\n }\n }\n disabled={respPostmark}\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n data-testid=\"paid-through\"\n className=\"event-info-paid-thru basis-2/4 mr-4\"\n variant=\"outlined\"\n name=\"paidThrough\"\n {...params}\n error={form.touched.paidThrough && Boolean(form.errors.paidThrough)}\n helperText={form.touched.paidThrough && form.errors.paidThrough as any}\n />\n )}\n />\n </LocalizationProvider>\n </div>\n </>\n );\n}\n\nexport default DirectBillingEventInfoForm;\n","import Button from '@mui/material/Button';\nimport { FormikProvider, useFormik } from 'formik';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport styles from './DirectBillingEventInfoForm.module.css';\nimport { validationSchema } from 'enter-cobra-qe/event-info/event-info.validators';\nimport EventInfoForm from './DirectBillingEventInfoForm';\nimport { DirectBillingStepProps } from 'direct-billing/direct-billing.types';\nimport { selectDirectBillingEventInfo, setEventInfo } from 'direct-billing/direct-billing.slice';\nimport { useHistory } from 'react-router-dom';\nimport { EventInfo } from 'shared/types/non-plan-year.types';\nimport dayjs from 'dayjs';\nimport { useMemo } from 'react';\nimport store from 'store';\n\ninterface EventInfoValues {\n eventDate?: string | null;\n eventType: string;\n coverageBegins?: string | null;\n paidThrough?: string | null;\n}\n\nfunction mapToForm(eventInfo: EventInfo) {\n return {\n eventDate: eventInfo.eventDate ? dayjs(eventInfo.eventDate).format('YYYY-MM-DD') : null,\n coverageBegins: eventInfo.coverageBegins ? dayjs(eventInfo.coverageBegins).format('YYYY-MM-DD') : null,\n paidThrough: eventInfo.paidThrough ? dayjs(eventInfo.paidThrough).format('YYYY-MM-DD') : null,\n eventType: eventInfo.eventType?.toString() ?? '-1',\n };\n}\n\nfunction mapToStore(values: EventInfoValues) {\n return {\n eventDate: values.eventDate ? dayjs(values.eventDate).format('YYYY-MM-DD') : '',\n coverageBegins: values.coverageBegins ? dayjs(values.coverageBegins).format('YYYY-MM-DD') : '',\n paidThrough: values.paidThrough ? dayjs(values.paidThrough).format('YYYY-MM-DD') : '',\n eventType: parseInt(values.eventType),\n };\n}\n\nfunction DirectBillingEventInfo({ onCancel }: DirectBillingStepProps) {\n const data = useSelector(selectDirectBillingEventInfo);\n const initialValues = useMemo(() => mapToForm(data), [ data ]);\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n const form = useFormik<EventInfoValues>({\n initialValues,\n validationSchema,\n onSubmit: (values) => {\n dispatch(setEventInfo(mapToStore(values)));\n history.push(`/direct-bill-event/dependents`);\n },\n });\n\n return (\n <form data-testid=\"event-info\">\n <div className=\"flex flex-col space-y-4\">\n <p>Enter the Retiree/LOA direct billing event details below.</p>\n <div className={`flex flex-wrap ${styles.twoCol}`}>\n <FormikProvider value={form}>\n <EventInfoForm />\n </FormikProvider>\n </div>\n </div>\n <div className=\"flex justify-end my-4\">\n <Button\n color=\"primary\"\n onClick={onCancel}\n data-testid=\"cancel\"\n tabIndex={-1}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"button\"\n onClick={form.submitForm}\n data-testid=\"next-step\"\n className=\"ml-4\"\n tabIndex={-1}\n >\n Next Step\n </Button>\n </div>\n </form>\n );\n}\n\nexport default DirectBillingEventInfo;\n","import { useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\n\nimport Dependents from 'components/shared/dependents/Dependents';\nimport { DirectBillingStepProps } from '../direct-billing.types';\nimport {\n setAddedDependents,\n loadInitialDependents,\n selectInitialDependents,\n} from 'direct-billing/direct-billing.slice';\nimport { QeDependents } from 'shared/types/non-plan-year.types';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport store from 'store';\n\nfunction DirectBillingQeDependents({\n onCancel,\n}: DirectBillingStepProps) {\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n const compid = useSelector(selectSelectedCompany)?.compid ?? 0;\n const initialDependents = useSelector(selectInitialDependents);\n\n useEffect(() => {\n dispatch(loadInitialDependents(compid));\n }, [ dispatch, compid ]);\n\n function handleNextStep(data: QeDependents) {\n dispatch(setAddedDependents(data.addedDependents));\n history.push('/direct-bill-event/benefits');\n }\n\n return (\n <div className=\"flex flex-col space-y-4\">\n <p>\n Dependents who are continuing coverage under the plan should be listed below.\n </p>\n <Dependents\n onNextStep={handleNextStep}\n onCancel={onCancel}\n dependents={initialDependents ?? []}\n initialAddedDependents={[]}\n submitText=\"Next Step\"\n cancelText=\"Cancel\"\n />\n </div>\n );\n}\n\nexport default DirectBillingQeDependents;\n","import { isNil } from 'ramda';\nimport * as yup from 'yup';\n\nexport const validationSchema = yup\n .object({\n benefits: yup\n .array()\n .of(\n yup\n .object()\n .nullable()\n .shape({\n selectedPlan: yup\n .object({\n planLevelId: yup\n .string()\n .nullable(),\n })\n .nullable(),\n\n cost: yup\n .number()\n .nullable()\n .typeError('Must be a number')\n .min(0, 'Must be a positive number'),\n\n subsidy: yup\n .number()\n .nullable()\n .typeError('Subsidy must be a number')\n .min(0, 'Subsidy must be a positive number.')\n .when('subsidyEnd', {\n is: (subsidyEnd: Date | undefined) => !!subsidyEnd,\n then: yup\n .number()\n .typeError('Subsidy must be a number.')\n .min(0, 'Subsidy must be a positive number.')\n .required('Subsidy is required.'),\n }),\n\n subsidyEnd: yup\n .date()\n .nullable()\n .when('subsidy', {\n is: (subsidy: number | undefined) => subsidy && (subsidy > 0),\n then: yup\n .date()\n .typeError('Subsidy End must be a valid date.')\n .required('Subsidy End is required.'),\n }),\n }, [ 'subsidy', 'subsidyEnd' ] as any),\n ),\n })\n .test(\n 'at-least-one-benefit-election',\n 'Please select at least one benefit election.',\n ({ benefits }) => !!benefits?.map((b) => b?.selectedPlan).some((p) => !isNil(p?.planLevelId)),\n )\n;\n","import FormControlLabel from '@mui/material/FormControlLabel';\nimport Checkbox from '@mui/material/Checkbox';\nimport { useFormikContext } from 'formik';\n\nimport { Dependent } from 'shared/types/non-plan-year.types';\nimport { DBBenefit } from 'direct-billing/direct-billing.types';\n\ninterface BenefitDependentsProps {\n dependents: Dependent[];\n index: number;\n disabled?: boolean;\n}\n\nfunction DBBenefitDependents({ dependents, index, disabled = false }: BenefitDependentsProps) {\n const { values, handleChange } = useFormikContext<{benefits: DBBenefit[];}>();\n\n return (\n <>\n <h6>Covered Dependents</h6>\n <div className=\"grid grid-cols-2 grid-flow-row\">\n {dependents.map((d, ii) => (\n <FormControlLabel\n control={\n <Checkbox\n value={ii}\n checked={!!values.benefits[index]?.coveredDependents?.includes(`${ii}` as any)}\n name={`benefits.${index}.coveredDependents`}\n color=\"primary\"\n data-testid={`checkbox-${d.name.toLocaleLowerCase().replace(/\\W+/g, '-')}`}\n onChange={!disabled ? handleChange : undefined}\n inputProps={ { disabled } }\n />\n }\n disabled={disabled}\n label={d.name}\n labelPlacement=\"end\"\n key={ii}\n />\n ))}\n </div>\n </>\n );\n}\n\nexport default DBBenefitDependents;\n","import { useFormikContext } from 'formik';\nimport TextField from '@mui/material/TextField';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport AdapterDayJS from '@mui/lab/AdapterDayjs';\nimport dayjs from 'dayjs';\nimport { path } from 'ramda';\n\nimport { Benefit } from 'shared/types/non-plan-year.types';\nimport LocalizationProvider from '@mui/lab/LocalizationProvider';\nimport DatePicker from '@mui/lab/DatePicker';\n\ninterface BenefitsSubsidyFieldsProps {\n index: number;\n disabled?: boolean;\n}\n\nfunction BenefitSubsidyFields({ index, disabled = false }: BenefitsSubsidyFieldsProps) {\n const { values, setFieldValue, handleChange, errors } = useFormikContext<{benefits: Benefit[];}>();\n\n function handleDateChange() {\n return (value: any) => setFieldValue(\n `benefits.${index}.subsidyEnd`, value ? dayjs(value, 'MM/DD/YYYY').format('YYYY-MM-DD') : null,\n );\n }\n\n return (\n <>\n <TextField\n variant=\"outlined\"\n label=\"ER Subsidy\"\n name={`benefits.${index}.subsidy`}\n value={values.benefits[index]?.subsidy ?? ''}\n InputProps={ {\n startAdornment: <InputAdornment position=\"start\">$</InputAdornment>,\n disabled,\n } }\n className=\"mt-4 mr-4\"\n data-testid={`benefits.${index}.subsidy`}\n onChange={handleChange}\n error={!!path([ 'benefits', index, 'subsidy' ], errors)}\n helperText={path([ 'benefits', index, 'subsidy' ], errors)}\n />\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n label=\"Subsidy Ends\"\n value={values.benefits[index]?.subsidyEnd\n ? dayjs(values.benefits[index]?.subsidyEnd, 'YYYY-MM-DD').format('MM/DD/YYYY')\n : null}\n onChange={handleDateChange()}\n className=\"m-4\"\n InputProps={ {\n className: !values.benefits[index]?.subsidyEnd ? 'MuiFormLabel-root' : '' ,\n disabled,\n } }\n disabled={disabled}\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n data-testid={`benefits.${index}.subsidyEnd`}\n variant=\"outlined\"\n name={`benefits.${index}.subsidyEnd`}\n className=\"w-full mt-4\"\n {...params}\n error={!!path([ 'benefits', index, 'subsidyEnd' ], errors)}\n helperText={path([ 'benefits', index, 'subsidyEnd' ], errors)}\n />\n )}\n />\n </LocalizationProvider>\n </>\n );\n}\n\nexport default BenefitSubsidyFields;\n","import { useSelector } from 'react-redux';\nimport { useFormikContext } from 'formik';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport TextField from '@mui/material/TextField';\nimport { path } from 'ramda';\n\nimport { AvailablePlan, DBBenefit } from 'direct-billing/direct-billing.types';\nimport { selectDirectBillingDependents } from 'direct-billing/direct-billing.slice';\nimport CommonSelect from 'components/shared/form/CommonSelect';\nimport { mapToSelectOption } from 'shared/form-helpers';\nimport styles from 'components/shared/qe/Benefits.module.css';\nimport BenefitDependents from 'components/shared/qe/BenefitDependents';\nimport BenefitSubsidyFields from './BenefitSubsidyFields';\n\nconst selectClasses = {\n select: 'mx-4',\n label: 'ml-4',\n error: 'planSelectHelper',\n};\n\nconst emptyOption = {\n label: 'None Selected',\n value: '-1',\n};\n\ninterface DBFormBenefitsSectionProps {\n benefit: DBBenefit;\n index: number;\n}\n\nfunction BenefitsFormSection({ benefit, index }: DBFormBenefitsSectionProps) {\n const { values, setFieldValue, handleChange, errors } = useFormikContext<{ benefits: DBBenefit[]; }>();\n const dependents = useSelector(selectDirectBillingDependents);\n\n function displayErSubsidy() {\n /*\n note: to whoever works on refactoring COBRA QE so we can use this shared component between it and Direct Billing.\n This used to check the selected company for hasCobraErsubsidy == true before rendering the subsidy fields.\n The Direct Billing form always shows these fields. We'll need to come up with some signal (prop, store, etc) to tell\n this component whether or not it should show these fields.\n */\n return <BenefitSubsidyFields index={index} />;\n }\n\n function showDependents() {\n return dependents.length > 0\n ? (\n <BenefitDependents\n dependents={dependents}\n index={index}\n />\n )\n : <></>;\n }\n\n function handleBenefitSelectChange(value: string) {\n const selected = benefit.plans.find((p) => value === p.planLevelId.toString()) ?? null;\n setFieldValue(`benefits.${index}.selectedPlan`, selected);\n }\n\n return (\n <div\n key={index}\n className={`${styles.summaryContainer} flex flex-col mb-8`}\n data-testid={`benefitSelector-${benefit.planTypeName}`}\n >\n <h6 className={`text-primary-dark ml-4 mt-4`}>{benefit.planTypeName}</h6>\n <div className=\"flex flex-row\">\n <div className=\"flex flex-grow flex-col mt-4 mr-4\">\n <CommonSelect\n options={mapToSelectOption<AvailablePlan>(benefit.plans, 'displayName', 'planLevelId')}\n value={values.benefits[index]?.selectedPlan?.planLevelId.toString() ?? emptyOption.value}\n label=\"Plan\"\n name={`benefits.${index}.selectedPlan.planLevelId`}\n error={!!path([ 'benefits', index, 'selectedPlan', 'planLevelId' ], errors)}\n data-testid={`benefits.${index}.planSelect`}\n onSelectChange={handleBenefitSelectChange}\n classes={selectClasses}\n emptyOption={emptyOption}\n />\n\n <div className=\"flex flex-row\">\n <TextField\n variant=\"outlined\"\n label=\"Cost\"\n name={`benefits.${index}.cost`}\n data-testid={`benefits.${index}.cost`}\n placeholder=\"Default\"\n value={values.benefits[index]?.cost}\n InputProps={ {\n startAdornment: <InputAdornment position=\"start\">$</InputAdornment>,\n } }\n className=\"m-4\"\n onChange={handleChange}\n error={!!path([ 'benefits', index, 'cost' ], errors)}\n helperText={path([ 'benefits', index, 'cost' ], errors)}\n />\n {displayErSubsidy()}\n </div>\n </div>\n <div className=\"flex flex-col ml-4\">\n {showDependents()}\n </div>\n </div>\n </div>\n );\n}\n\nexport default BenefitsFormSection;\n","import dayjs from 'dayjs';\nimport { useSelector } from 'react-redux';\n\nimport { DBBenefit } from 'direct-billing/direct-billing.types';\nimport { getNoBenefitsMessage } from 'shared/api/cobraQeApi';\nimport { selectDirectBillingEventInfo } from 'direct-billing/direct-billing.slice';\nimport BenefitsFormSection from 'components/shared/qe/BenefitsFormSection';\n\ninterface BenefitsFormProps {\n benefits: DBBenefit[];\n}\n\nfunction BenefitsForm({ benefits }: BenefitsFormProps) {\n const { coverageBegins } = useSelector(selectDirectBillingEventInfo);\n\n function slug(str = performance.now().toString()) {\n return str.toLocaleLowerCase().replace(/\\s/g, '-');\n }\n\n return (\n <div>\n {\n benefits.length\n ? benefits.map((b, i) => <BenefitsFormSection benefit={b} index={i} key={slug(b.planTypeName)} />)\n : <p>{getNoBenefitsMessage(dayjs(coverageBegins).format('MM/DD/YYYY'))}</p>\n }\n </div>\n );\n}\n\nexport default BenefitsForm;\n","import { Dependent } from 'shared/types/non-plan-year.types';\nimport { equals } from 'ramda';\n\nfunction hashCoveredDependents(covered: Dependent[], all: Dependent[]) {\n return covered\n .map((coveredDep) => all.findIndex((dep) => equals(coveredDep, dep)).toString())\n .filter((idx:string) => idx !== '-1');\n}\n\nexport default hashCoveredDependents;\n","import { Dependent } from 'shared/types/non-plan-year.types';\nimport { complement, isNil } from 'ramda';\n\nfunction unhashCoveredDependents(covered: string[], all: Dependent[]) {\n return covered.map((strIdx) => all[parseInt(strIdx)])\n .filter(complement(isNil));\n}\n\nexport default unhashCoveredDependents;\n","import { useEffect, useState, useRef } from 'react';\nimport { useFormik, FormikProvider } from 'formik';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport Button from '@mui/material/Button';\n\nimport Loading from 'components/shared/Loading';\nimport {\n loadAvailableBenefits,\n setBenefits,\n selectDirectBillingDependents,\n selectAvailableBenefits,\n} from 'direct-billing/direct-billing.slice';\nimport { DBBenefit, DirectBillingStepProps } from 'direct-billing/direct-billing.types';\nimport { validationSchema } from './dbbenefits.validators';\nimport BenefitsForm from 'components/shared/qe/BenefitsForm';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport FormErrorText from 'components/shared/FormErrorText';\nimport hashCoveredDependents from './hash-covered-dependents';\nimport unhashCoveredDependents from './unhash-covered-dependents';\nimport store from 'store';\n\nconst errorMap = (msg: string, i:number) => <FormErrorText className=\"text-base pb-5\" key={i} show message={msg} />;\n\ntype BenefitFormValue = Omit<DBBenefit, 'coveredDependents'> & { coveredDependents: string[] | null; };\n\nfunction DirectBillBenefits({ onCancel }: DirectBillingStepProps) {\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const availableBenefits = useSelector(selectAvailableBenefits);\n const allDependents = useSelector(selectDirectBillingDependents);\n\n const formRef = useRef<HTMLDivElement>(null);\n\n const [ wholeFormErrors, setWholeFormErrors ] = useState<string[]>([]);\n\n const form = useFormik<{benefits: BenefitFormValue[];}>({\n initialValues: {\n benefits: (availableBenefits ?? [])\n .map((benefit) => ({\n ...benefit,\n coveredDependents: hashCoveredDependents(benefit.coveredDependents ?? [], allDependents),\n })),\n },\n validationSchema,\n onSubmit: (values) => {\n try {\n const bennies = values.benefits\n .map((benefit: BenefitFormValue | undefined) => ({\n ...benefit,\n cost: parseFloat(benefit?.cost + '') || null,\n subsidy: parseFloat(benefit?.subsidy + '') || null,\n coveredDependents: unhashCoveredDependents(benefit?.coveredDependents ?? [], allDependents),\n }));\n\n validationSchema.validateSync(\n { benefits: bennies },\n {\n abortEarly: false,\n stripUnknown: false,\n },\n );\n\n dispatch(setBenefits(bennies as DBBenefit[]));\n history.push('/direct-bill-event/summary');\n } catch (err) {\n setWholeFormErrors(err.errors);\n\n if (formRef.current?.scrollIntoView) {\n formRef.current.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'start' });\n }\n }\n },\n });\n\n useEffect(() => {\n dispatch(loadAvailableBenefits(compid));\n }, [ dispatch, compid ]);\n\n return availableBenefits === null\n ? <Loading text=\"Loading Benefits...\" />\n : (\n <div className=\"w-full flex flex-col space-y-4\">\n <p>\n Select the benefits the insured and their dependent(s) are eligible to continue coverage.\n </p>\n <div className=\"w-full flex flex-col space-y-4\" ref={formRef}>\n {wholeFormErrors.length > 0 && wholeFormErrors.map(errorMap)}\n </div>\n <form data-testid=\"db-benefits-form\">\n <div className=\"flex flex-col mt-4\">\n <FormikProvider value={form}>\n <BenefitsForm benefits={availableBenefits} />\n </FormikProvider>\n </div>\n </form>\n <div className=\"flex justify-end space-x-4\">\n <Button\n color=\"primary\"\n data-testid=\"directBillQeCancel\"\n onClick={onCancel}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n data-testid=\"directBillQeNextStep\"\n className=\"ml-4\"\n type=\"button\"\n onClick={form.submitForm}\n disabled={!form.isValid}\n >\n Next Step\n </Button>\n </div>\n </div>\n );\n}\n\nexport default DirectBillBenefits;\n","import { DBBenefit } from 'direct-billing/direct-billing.types';\nimport { Participant } from 'participant-search/participant-list.types';\n\ninterface BenefitsSummaryProps {\n participant: Omit<Participant, 'pyrid' | 'planCode'>;\n benefits: DBBenefit[];\n}\n\nfunction BenefitsSummary({ benefits, participant }: BenefitsSummaryProps) {\n return (\n <div className=\"flex flex-col space-y-2\" data-testid=\"benefitsList\">\n {\n benefits.map((benefit) => {\n return (\n <div key={benefit.selectedPlan?.plansId}>\n <p className=\"text-lg text-black font-medium\">{benefit.selectedPlan?.displayName}</p>\n <p className=\"text-sm\">\n <span className=\"text-black font-medium\">Covered: </span>\n {\n ([\n { name: `${participant.fname} ${participant.lname}` },\n ...(benefit.coveredDependents ?? []),\n ])\n .map((dep) => dep.name)\n .join(', ')\n }\n </p>\n </div>\n );\n })\n }\n </div>\n );\n}\n\nexport default BenefitsSummary;\n","import { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Link, useHistory } from 'react-router-dom';\nimport Button from '@mui/material/Button';\nimport { compose, T, F, tap, always, view, replace, lensPath, set, or } from 'ramda';\n\nimport {\n resetEntry,\n selectDirectBillingEventTypes,\n selectDirectBillingQeEntry,\n selectDirectBillSavePayload,\n} from '../direct-billing.slice';\nimport { DirectBillingStepProps } from '../direct-billing.types';\nimport classes from './DirectBillingSummary.module.css';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { saveDirectBillingEvent } from 'shared/api/directBillingApi';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport Loading from 'components/shared/Loading';\nimport ParticipantSummary from 'components/shared/qe/ParticipantSummary';\nimport DependentsSummary from 'components/shared/qe/DependentsSummary';\nimport EventInfoSummary from 'components/shared/qe/EventInfoSummary';\nimport BenefitsSummary from 'components/shared/qe/BenefitsSummary';\nimport { setSelectedParticipant } from 'participant-search/participant.slice';\nimport { useHistoryBlock } from 'shared/custom-hooks/useHistoryBlock';\nimport store from 'store';\n\nfunction DirectBillingSummary({ onCancel }: DirectBillingStepProps) {\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n const entry = useSelector(selectDirectBillingQeEntry);\n const payload = useSelector(selectDirectBillSavePayload);\n const eventTypes = useSelector(selectDirectBillingEventTypes);\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const [ blockRegex, setBlockRegex ] = useState(/^\\/direct-bill-event/);\n const navUnblock = useHistoryBlock(blockRegex);\n\n const [ saving, setSaving ] = useState(false);\n const startSaving = compose(setSaving, T);\n const doneSaving = compose(setSaving, F);\n\n const errorNotifier = useErrorNotifier();\n const handleError = compose(tap(doneSaving), errorNotifier);\n\n function handleSubmit(doAnother: boolean) {\n return () => {\n startSaving();\n let pidLens = lensPath([ 'participant', 'payrollid' ]);\n let body = set(\n pidLens,\n replace(/-+/g, '', or(view(pidLens, payload), '')),\n payload,\n );\n\n saveDirectBillingEvent(compid, body)\n .then(() => {\n dispatch(setSelectedParticipant(null));\n dispatch(resetEntry());\n doneSaving();\n\n if (navUnblock) {\n navUnblock();\n }\n history.push(doAnother ? '/direct-bill-event/personal-details' : '/dashboard');\n })\n .catch(handleError);\n };\n }\n\n useEffect(() => {\n return () => {\n if (navUnblock) {\n navUnblock();\n }\n };\n }, [ navUnblock ]);\n\n const cancel = compose(onCancel, setBlockRegex, always(/^\\/dashboard/));\n\n return (\n <div className=\"w-full flex flex-col space-y-4\">\n <p className=\"mb-8\">Are you sure you want to submit this billing event?</p>\n <div className=\"flex flex-col space-y-32\">\n <div className=\"flex space-x-8\">\n <div className=\"w-1/2\">\n <div className=\"flex justify-between border-b border-solid border-gray-500 pb-1 mb-2\">\n <p className={classes.sectionHeader}>Personal Details</p>\n <Link\n to=\"/direct-bill-event/personal-details\"\n className={`${classes.link} text-sm`}\n data-testid=\"detailsLink\"\n >\n Edit\n </Link>\n </div>\n <ParticipantSummary participant={entry.participant} />\n </div>\n <div className=\"w-1/2\">\n <div className=\"flex justify-between border-b border-solid border-gray-500 pb-1 mb-2\">\n <p className={classes.sectionHeader}>Dependents</p>\n <Link\n to=\"/direct-bill-event/dependents\"\n className={`${classes.link} text-sm`}\n data-testid=\"dependentsLink\"\n >\n Edit\n </Link>\n </div>\n <DependentsSummary dependents={entry.dependents.added.concat(entry.dependents.initial ?? [])} />\n </div>\n </div>\n <div className=\"flex space-x-4\">\n <div className=\"w-1/2\">\n <div className=\"flex justify-between border-b border-solid border-gray-500 pb-1 mb-2\">\n <p className={classes.sectionHeader}>Event Info</p>\n <Link to=\"/direct-bill-event/event-info\" className={`${classes.link} text-sm`} data-testid=\"eventLink\">\n Edit\n </Link>\n </div>\n <EventInfoSummary eventInfo={entry.eventInfo} eventTypes={eventTypes} />\n </div>\n <div className=\"w-1/2\">\n <div className=\"flex justify-between border-b border-solid border-gray-500 pb-1 mb-2\">\n <p className={classes.sectionHeader}>Benefits</p>\n <Link to=\"/direct-bill-event/benefits\" className={`${classes.link} text-sm`} data-testid=\"benefitsLink\">\n Edit\n </Link>\n </div>\n <BenefitsSummary benefits={entry.benefits} participant={entry.participant} />\n </div>\n </div>\n </div>\n <div className=\"flex justify-end py-8 space-x-8\">\n <Button\n color=\"primary\"\n onClick={cancel}\n data-testid=\"cancelDirectBillEvent\"\n >\n Cancel\n </Button>\n <Button\n variant=\"outlined\"\n color=\"primary\"\n onClick={handleSubmit(false)}\n data-testid=\"submitDirectBillEvent\"\n >\n Submit\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={handleSubmit(true)}\n data-testid=\"submitDirectBillEventAndDoAgain\"\n >\n Submit & Enter Another Billing Event\n </Button>\n </div>\n {saving && <Loading text=\"Submitting Billing Event\" />}\n </div>\n );\n}\n\nexport default DirectBillingSummary;\n","import { always, compose, tap, T, F } from 'ramda';\nimport { useState } from 'react';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { useDispatch } from 'react-redux';\n\nimport wizardSteps, { DBEStepSlug } from './direct-billing-steps';\nimport WizardStepper, { WizardStep } from 'components/shared/WizardStepper';\nimport { useHistoryBlock } from 'shared/custom-hooks/useHistoryBlock';\nimport { resetEntry } from './direct-billing.slice';\nimport { noop } from 'shared/utils';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport CancelModal from 'components/shared/CancelModal';\nimport DirectBillingPersonalDetails from './personal-details/DirectBillingPersonalDetails';\nimport DirectBillingEventInfo from './event-info/DirectBillingEventInfo';\nimport DirectBillingQeDependents from './dependents/DirectBillingQeDependents';\nimport DirectBillingBenefits from './benefits/DirectBillBenefits';\nimport DirectBillingSummary from './summary/DirectBillingSummary';\nimport store from 'store';\n\nfunction DirectBillingWizard() {\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n const {\n stepSlug: activeStepSlug,\n } = useParams<{ stepSlug: DBEStepSlug; }>();\n\n const [ unmountCallback ] = useState(() => compose(dispatch, resetEntry));\n const [ blockRegex ] = useState(/^\\/direct-bill-event/);\n const navUnblock = useHistoryBlock(blockRegex, unmountCallback);\n\n const [ modalOpen, setModalOpen ] = useState(false);\n const showModal = compose(setModalOpen, T);\n const hideModal = compose(setModalOpen, F);\n\n const goToDashboard = compose(\n tap(compose(history.push, always('/dashboard'))),\n navUnblock ?? noop,\n hideModal,\n );\n\n function handleStepClick(clickedStep: WizardStep) {\n return history.push(`/direct-bill-event/${clickedStep.slug}`);\n }\n\n function onWizardCancel() {\n if (activeStepSlug !== wizardSteps.keys().next().value) {\n showModal();\n } else {\n goToDashboard();\n }\n }\n\n function renderStep() {\n switch (activeStepSlug) {\n case 'personal-details':\n return <DirectBillingPersonalDetails onCancel={onWizardCancel} />;\n case 'event-info':\n return <DirectBillingEventInfo onCancel={onWizardCancel} />;\n case 'dependents':\n return <DirectBillingQeDependents onCancel={onWizardCancel} />;\n case 'benefits':\n return <DirectBillingBenefits onCancel={onWizardCancel} />;\n case 'summary':\n return <DirectBillingSummary onCancel={onWizardCancel} />;\n }\n }\n\n return (\n <>\n <PageContentPaper className=\"mt-4 mb-8\">\n <div className=\"mb-8\">\n <WizardStepper\n steps={wizardSteps}\n allowClick\n onChange={handleStepClick}\n />\n </div>\n <div className=\"px-8\">\n {renderStep()}\n </div>\n </PageContentPaper>\n <CancelModal\n isOpen={modalOpen}\n onCancel={goToDashboard}\n onClose={hideModal}\n />\n </>\n );\n}\n\nexport default DirectBillingWizard;\n","import dayjs from 'dayjs';\nimport { useSelector } from 'react-redux';\n\nimport { selectDirectBillingDetails } from 'direct-billing/direct-billing.slice';\n\ninterface DefinitionProps {\n term: string;\n def?: string | number;\n defClass?: string;\n}\n\nfunction Definition({ term, def = '', defClass = '' }: DefinitionProps) {\n return (\n <div className=\"flex space-x-2\">\n <dt>{term}:</dt>\n <dd className={`font-bold ${defClass}`}>{def}</dd>\n </div>\n );\n}\n\nfunction DirectBillingQeDetails() {\n const details = useSelector(selectDirectBillingDetails);\n\n function formatDate(str?: string) {\n return str ? dayjs(str, 'YYYY-MM-DD').format('M/D/YYYY') : '';\n }\n\n function statusColor(status: string) {\n if (/^terminated/i.test(status)) {\n return 'text-red-600';\n }\n\n if (/^accepted/i.test(status)) {\n return 'text-green-500';\n }\n\n return '';\n }\n\n return (\n <div className=\"w-full p-6 border border-solid border-neutral5 rounded-md\">\n <dl className=\"space-y-6 text-base text-med-em\">\n <Definition term=\"Status\" def={details?.statusMessage} defClass={statusColor(details?.statusMessage ?? '')} />\n <Definition term=\"Date Letter Sent\" def={formatDate(details?.letterSent)} />\n <Definition term=\"Letter Doc #\" def={details?.letterDoc} />\n <Definition term=\"Resp Postmark\" def={formatDate(details?.postmark)} />\n <Definition term=\"Response Doc #\" def={details?.responseDoc} />\n <Definition term=\"Cover Ends\" def={formatDate(details?.coverageEnds)} />\n <Definition term=\"Coverage Term Sent\" def={formatDate(details?.coverageTermSent)} />\n </dl>\n </div>\n );\n}\n\nexport default DirectBillingQeDetails;\n","/* istanbul ignore next */ // Since this is just concatenating existing\nimport { validationSchema as eventSchema } from 'enter-cobra-qe/event-info/event-info.validators';\nimport { validationSchema as benefitsSchema } from 'direct-billing/benefits/dbbenefits.validators';\n\nexport const validationSchema = eventSchema.concat(benefitsSchema);\n/* istanbul ignore stop */\n","import { useState, useRef, useEffect } from 'react';\nimport { useFormik, FormikProvider } from 'formik';\nimport Button from '@mui/material/Button';\nimport { compose, always, T, F, tap } from 'ramda';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport hashCoveredDependents from 'direct-billing/benefits/hash-covered-dependents';\nimport unhashCoveredDependents from 'direct-billing/benefits/unhash-covered-dependents';\nimport { QeBenefits, QeEventInfo } from 'enter-cobra-qe/cobra-qe.types';\nimport DirectBillEventInfoForm from 'direct-billing/event-info/DirectBillingEventInfoForm';\nimport BenefitsForm from 'components/shared/qe/BenefitsForm';\nimport FormikErrorFocus from 'components/shared/FormikErrorFocus';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport {\n selectDirectBillingDependents,\n setBenefits,\n setEventInfo,\n selectAvailableBenefits,\n} from 'direct-billing/direct-billing.slice';\nimport { DBBenefit, DirectBillingQe, DirectBillSavePayload } from 'direct-billing/direct-billing.types';\nimport DirectBillingQeDetails from 'update-direct-bill-event/DirectBillingQeDetails';\nimport { validationSchema } from 'update-direct-bill-event/update-direct-billing-qe.validators';\nimport dayjs from 'dayjs';\nimport FormErrorText from 'components/shared/FormErrorText';\nimport { updateDirectBillingEvent } from 'shared/api/directBillingApi';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport Loading from 'components/shared/Loading';\nimport { useHistory } from 'react-router-dom';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport { Dependent } from 'shared/types/non-plan-year.types';\nimport store from 'store';\n\ninterface UpdateDirectBillingFormProps {\n entry: DirectBillingQe;\n onCancel: () => void;\n}\n\ntype UpdateQeValues = QeEventInfo & QeBenefits;\n\nconst errorMap = (msg: string, i:number) => <FormErrorText className=\"text-base pb-5\" key={i} show message={msg} />;\n\nfunction eventInfoFromValues(values: UpdateQeValues) {\n return {\n eventDate: values.eventDate ? dayjs(values.eventDate).format('YYYY-MM-DD') : '',\n coverageBegins: values.coverageBegins ? dayjs(values.coverageBegins).format('YYYY-MM-DD') : '',\n paidThrough: values.paidThrough ? dayjs(values.paidThrough).format('YYYY-MM-DD') : '',\n eventType: parseInt(values.eventType as any),\n };\n}\n\nfunction valuesFromBenefits(benefits: DBBenefit[], dependents: Dependent[]) {\n return benefits.map((benefit) => ({\n ...benefit,\n coveredDependents: hashCoveredDependents(benefit.coveredDependents ?? [], dependents),\n }));\n}\n\nfunction benefitsFromValues(values: UpdateQeValues, dependents: Dependent[]) {\n return values.benefits\n .filter((benefit: any) => benefit.selectedPlan)\n .map((benefit: any) => ({\n ...benefit,\n cost: parseFloat(benefit?.cost + '') || 0,\n subsidy: parseFloat(benefit?.subsidy + '') || 0,\n coveredDependents: unhashCoveredDependents(benefit?.coveredDependents ?? [], dependents),\n }));\n}\n\nfunction UpdateDirectBillingForm({\n entry,\n onCancel,\n}: UpdateDirectBillingFormProps) {\n const history = useHistory();\n const allDependents = useSelector(selectDirectBillingDependents);\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const availableBenefits = useSelector(selectAvailableBenefits);\n const dispatch = useDispatch<typeof store.dispatch>();\n const [ wholeFormErrors, setWholeFormErrors ] = useState<string[]>([]);\n const formRef = useRef<HTMLDivElement>(null);\n const errorNotifier = useErrorNotifier();\n\n const [ saving, setSaving ] = useState(false);\n const startSaving = compose(setSaving, T);\n const doneSaving = compose(setSaving, F);\n const handleError = compose(tap(doneSaving), errorNotifier);\n\n const form = useFormik<UpdateQeValues>({\n initialValues: {\n eventDate: entry.eventInfo.eventDate,\n eventType: entry.eventInfo.eventType,\n coverageBegins: entry.eventInfo.coverageBegins,\n paidThrough: entry.eventInfo.paidThrough,\n benefits: valuesFromBenefits(availableBenefits ?? [], allDependents),\n } as any,\n validationSchema,\n onSubmit: (values) => {\n try {\n const benefits = benefitsFromValues(values, allDependents);\n\n validationSchema.validateSync(\n {\n benefits,\n eventDate: values.eventDate,\n eventType: values.eventType,\n coverageBegins: values.coverageBegins,\n paidThrough: values.paidThrough,\n },\n {\n abortEarly: false,\n stripUnknown: false,\n },\n );\n\n dispatch(setBenefits(benefits as DBBenefit[]));\n\n const eventInfo = eventInfoFromValues(values);\n dispatch(setEventInfo(eventInfo));\n\n const payload: DirectBillSavePayload = {\n r_qualid: entry.r_qualid,\n participant: entry.participant,\n eventInfo,\n addedDependents: [],\n benefits,\n };\n\n startSaving();\n updateDirectBillingEvent(compid, payload)\n .then(() => {\n doneSaving();\n history.push(`/participant-overview/${entry.participant.empno}/plan-enrollment`);\n })\n .catch(handleError);\n } catch (err) {\n setWholeFormErrors(err.errors);\n\n if (formRef.current?.scrollIntoView) {\n formRef.current.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'start' });\n }\n }\n },\n });\n\n /* This block needs to be here because the initial benefits will be null, and formik doesn't update unless\n you explicitly set the value. I'm destructuring setFieldValue so the useEffect doesn't trigger when we get\n a new form object on render. */\n const { setFieldValue } = form;\n useEffect(() => {\n if (availableBenefits !== null) {\n setFieldValue('benefits', valuesFromBenefits(availableBenefits, allDependents));\n }\n }, [ availableBenefits, setFieldValue, allDependents ]);\n\n const BenefitsWithLoading = withLoopIcon(\n BenefitsForm,\n 'Loading available benefits...',\n availableBenefits === null,\n );\n\n return (\n <form className=\"update-cobra-qe-form w-full\">\n <div className=\"w-full flex flex-col space-y-4\" ref={formRef}>\n {wholeFormErrors.length > 0 && wholeFormErrors.map(errorMap)}\n </div>\n <div className=\"flex flex-col\">\n <FormikProvider value={form}>\n <FormikErrorFocus />\n <div className=\"flex mb-4 space-x-4\">\n <div className=\"w-1/2\">\n <DirectBillEventInfoForm\n updatingEvent\n letterSent={!!entry.details?.letterSent}\n respPostmark={!!entry.details?.postmark}\n />\n </div>\n <div className=\"w-1/2\">\n <DirectBillingQeDetails />\n </div>\n </div>\n\n <div className=\"flex-grow overflow-auto\">\n <BenefitsWithLoading benefits={availableBenefits!} />\n </div>\n </FormikProvider>\n <div className=\"flex justify-end my-4 h-8\">\n <Button\n className=\"update-qe-form-cancel\"\n color=\"primary\"\n onClick={compose(onCancel, always(undefined))}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n data-testid=\"update-qe-form-save\"\n className=\"ml-8 update-qe-form-save\"\n type=\"button\"\n onClick={form.submitForm}\n disabled={!!entry.details?.postmark}\n >\n Save QE\n </Button>\n\n {saving && <Loading text=\"Submitting Billing Event Update\" />}\n </div>\n </div>\n </form>\n );\n}\n\nexport default UpdateDirectBillingForm;\n","import { useEffect } from 'react';\nimport { useHistory } from 'react-router';\nimport { useParams } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport { usePageTitle } from 'shared/custom-hooks/usePageTitle';\nimport { selectParticipant } from 'participant-search/participant.slice';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport {\n loadDirectBillingEvent,\n resetEntry,\n selectDirectBillingQeEntry,\n} from 'direct-billing/direct-billing.slice';\nimport UpdateDirectBillingForm from 'update-direct-bill-event/UpdateDirectBillingForm';\nimport store from 'store';\n\nfunction UpdateDirectBilling() {\n usePageTitle('Update Retiree/LOA Billing');\n const history = useHistory();\n const { empno } = useSelector(selectParticipant) ?? { empno: '' };\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const entry = useSelector(selectDirectBillingQeEntry);\n const { rQualId } = useParams<{rQualId:string;}>();\n const dispatch = useDispatch<typeof store.dispatch>();\n\n useEffect(() => {\n dispatch(loadDirectBillingEvent(compid, parseInt(rQualId), empno));\n }, [ dispatch, compid, empno, rQualId ]);\n\n function handleClose() {\n dispatch(resetEntry());\n history.goBack();\n }\n\n function content() {\n return (\n <PageContentPaper className=\"mt-4\">\n {\n !!entry.r_qualid\n ? <UpdateDirectBillingForm onCancel={handleClose} entry={entry} />\n : <p>Loading retiree/LOA details...</p>\n }\n </PageContentPaper>\n );\n }\n\n return content();\n}\n\nexport default UpdateDirectBilling;\n","export default __webpack_public_path__ + \"static/media/disable-popup.2ea17103.svg\";","import { useEffect, useState } from 'react';\nimport { planCodeToPlanType } from 'shared/utils';\nimport { concat, always, cond, equals, isNil, identity, T } from 'ramda';\n\nimport { EnrollmentResourcePlan } from 'open-enrollment-resources/open-enrollment.types';\n\nfunction mapPlanTypeToAbbreviation(type: string) {\n return cond([\n [ equals('MRA'), always('HCFSA') ],\n [ equals('DCRA'), always('DCFSA') ],\n [ equals('QTE'), always('CBA') ],\n [ equals('HSA'), identity ],\n [ equals('LFSA'), identity ],\n [ equals('HRA'), identity ],\n [ T, always(undefined) ],\n ])(type as never);\n}\n\nfunction mapAbbreviationToDisplayName(type: string) {\n return cond([\n [ equals('HCFSA'), always('Health Care FSA') ],\n [ equals('DCFSA'), always('Dependent Care FSA') ],\n [ equals('CBA'), always('Commuter Benefit Account') ],\n [ equals('HSA'), always('Health Savings Account') ],\n [ equals('LFSA'), always('Limited-Purpose FSA') ],\n [ equals('HRA'), always('Health Reimbursement Account') ],\n [ equals('Custom'), always('Custom Reimbursement Account') ],\n [ equals('COBRA'), identity ],\n [ equals('Direct Bill'), identity ],\n ])(type as never);\n}\n\nexport function usePlanDisplayNames(\n plans: EnrollmentResourcePlan[] | null,\n hasCobra: boolean | undefined,\n hasDirectBill: boolean | undefined): [string[], string[]] {\n const [ planAbbreviations, setPlanAbbreviations ] = useState<string[]>([]);\n const [ planDisplayNames, setPlanDisplayNames ] = useState<string[]>([]);\n const [ mappedPlans, setMappedPlans ] = useState<EnrollmentResourcePlan[] | null>(null);\n\n useEffect(() => {\n setMappedPlans(\n plans\n ? concat(\n plans\n .filter(p => p.planCode === 'M' && (p.hasFloresHSA || p.hasOtherHSA))\n .map(p => ({ ...p, planCode: '-' })),\n plans)\n : null,\n );\n }, [ plans ]);\n\n useEffect(() => {\n let abbreviations: string[] = [];\n\n if (mappedPlans?.length) {\n abbreviations = mappedPlans\n .map(({ planCode }) => planCodeToPlanType(planCode))\n .filter(code => !isNil(code))\n .filter(code => [ 'MRA', 'DCRA', 'QTE', 'HSA', 'LFSA', 'HRA' ].includes(code!))\n .map(code => mapPlanTypeToAbbreviation(code!)) as string[];\n\n if (mappedPlans.some((plan) => plan.planId === 35)) {\n abbreviations.push('Custom');\n }\n }\n\n if (hasCobra) {\n abbreviations.push('COBRA');\n }\n\n if (hasDirectBill) {\n abbreviations.push('Direct Bill');\n }\n\n const uniqueAbbreviations = Array.from(new Set(abbreviations))\n .filter(code => !isNil(code));\n setPlanAbbreviations(uniqueAbbreviations);\n\n const displayNames = uniqueAbbreviations\n .map(a => mapAbbreviationToDisplayName(a));\n setPlanDisplayNames(displayNames);\n }, [ mappedPlans, hasCobra, hasDirectBill ]);\n\n return [ planAbbreviations, planDisplayNames ];\n}\n","export default __webpack_public_path__ + \"static/media/health-care-fsa-guide.c24a628c.svg\";","export default __webpack_public_path__ + \"static/media/hra-guide.d7cfcaff.svg\";","export default __webpack_public_path__ + \"static/media/flores-benefits-mastercard.c6a7b9e8.svg\";","export default __webpack_public_path__ + \"static/media/flores-mobile.f07ca9ac.svg\";","export default __webpack_public_path__ + \"static/media/dependent-care-fsa-guide.2f826f34.svg\";","export default __webpack_public_path__ + \"static/media/no-wait-dependent-care-fsa.78207767.svg\";","export default __webpack_public_path__ + \"static/media/commuter-benefit-account-guide.0a1fa56b.svg\";","export default __webpack_public_path__ + \"static/media/limited-purpose-fsa-guide.ed632768.svg\";","export default __webpack_public_path__ + \"static/media/reenroll-fsa-checklist.81b22ec6.svg\";","export default __webpack_public_path__ + \"static/media/reenroll-commuter-checklist.136004d9.svg\";","export default __webpack_public_path__ + \"static/media/reenroll-hra-checklist.4a42a9ca.svg\";","export default __webpack_public_path__ + \"static/media/reenroll-cobra-checklist.f7fad9f6.svg\";","export default __webpack_public_path__ + \"static/media/reenroll-hsa-checklist.1879ba24.svg\";","export default __webpack_public_path__ + \"static/media/reenroll-direct-bill-checklist.24f4fd82.svg\";","export default __webpack_public_path__ + \"static/media/hsa-guide.6e81e668.svg\";","export default __webpack_public_path__ + \"static/media/hsa-faq.2e95f78d.svg\";","import { MouseEventHandler } from 'react';\nimport Grid, { GridSize } from '@mui/material/Grid';\nimport Card from '@mui/material/Card';\nimport CardActionArea from '@mui/material/CardActionArea';\nimport CardMedia from '@mui/material/CardMedia';\nimport CardContent from '@mui/material/CardContent';\n\n/**\n * Description:\n * Material Card for display in a Grid layout.\n *\n * Example:\n * ```\n * <Grid container spacing={3}>\n * {\n * items.map(item => (\n * <GridCard\n * src=\"embedUrl\"\n * name=\"Card Title\"\n * href=\"linkUrl\"\n * />\n * )\n * }\n * </Grid>\n * ```\n */\n\ninterface Props {\n name: string;\n src?: string;\n type?: string;\n component?: 'video' | 'img' | 'iframe';\n href?: string;\n col?: GridSize;\n onClick?: MouseEventHandler<HTMLButtonElement>;\n}\n\nfunction GridCard({ src, name, href, type = 'PDF', component = 'img', col = 3, onClick }: Props) {\n function makeCard() {\n return (\n <Card>\n <CardActionArea onClick={onClick}>\n {\n src\n ? (\n <CardMedia\n component={component}\n src={src}\n title={name}\n />\n )\n : <></>\n }\n <CardContent>\n <p className=\"pb-2\">{type}</p>\n <p className=\"pb-5\">{name}</p>\n </CardContent>\n </CardActionArea>\n </Card>\n );\n }\n\n return (\n <Grid item xs={col}>\n {\n href\n ? (\n <a target=\"_blank\" rel=\"noreferrer\" href={href}>\n {makeCard()}\n </a>\n )\n : makeCard()\n }\n </Grid>\n );\n}\n\nexport default GridCard;\n","import { useEffect, useState } from 'react';\nimport LoopIcon from '@mui/icons-material/Loop';\n\nimport GridCard from 'components/shared/GridCard';\nimport fsaChecklist from 'images/reenroll-fsa-checklist.svg';\nimport { useSelector } from 'react-redux';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { doesFsaTemplateExist, downloadFsaTemplate } from 'shared/api/enrollmentResourcesApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\n\nfunction FsaEnrollmentTemplateCard() {\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const [ exists, setExists ] = useState<boolean | null>(null);\n const errorNotifier = useErrorNotifier();\n\n useEffect(() => {\n doesFsaTemplateExist(compid)\n .then((val) => setExists(!!val))\n .catch(errorNotifier);\n }, [ compid, errorNotifier ]);\n\n function downloadTemplate() {\n downloadFsaTemplate(compid)\n .catch(errorNotifier);\n }\n\n switch (exists) {\n case null:\n return <LoopIcon className=\"animate-spin\" data-testid=\"loading-fsa-template-card\" />;\n case true:\n return (\n <GridCard\n src={fsaChecklist}\n type=\"XLS\"\n name=\"FSA Enrollment Template\"\n onClick={downloadTemplate}\n />\n );\n case false:\n return <></>;\n }\n}\n\nexport default FsaEnrollmentTemplateCard;\n","export default __webpack_public_path__ + \"static/media/custom-checklist.f5b72393.svg\";","import { useSelector } from 'react-redux';\nimport { path } from 'ramda';\n\nimport customChecklist from 'images/custom-checklist.svg';\nimport { EnrollmentResourcePlan } from 'open-enrollment-resources/open-enrollment.types';\nimport GridCard from 'components/shared/GridCard';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { downloadCustomChecklist } from 'shared/api/enrollmentResourcesApi';\nimport { selectSelectedCompany } from 'companies/companies.slice';\n\ninterface CustomEnrollmentCardProps {\n plan: EnrollmentResourcePlan;\n subPlanIndex: number;\n}\n\nexport function CustomEnrollmentCard({ plan, subPlanIndex }: CustomEnrollmentCardProps) {\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const errorNotifier = useErrorNotifier();\n\n function downloadCustom() {\n const subPlanId = path<number>([ 'subPlans', subPlanIndex, 'pyrPlansId' ], plan) ?? 0;\n downloadCustomChecklist(compid, plan.planYearId, plan.planId, subPlanId)\n .catch(errorNotifier);\n }\n\n return (\n <GridCard\n src={customChecklist}\n name={`${path([ 'subPlans', subPlanIndex, 'planName' ], plan)} Checklist`}\n onClick={downloadCustom}\n type=\"RTF\"\n />\n );\n}\n\nexport default CustomEnrollmentCard;\n","import Grid from '@mui/material/Grid';\nimport { useSelector } from 'react-redux';\n\nimport healthCareFSAGuide from 'images/health-care-fsa-guide.svg';\nimport hraGuide from 'images/hra-guide.svg';\nimport floresBenefitsMastercard from 'images/flores-benefits-mastercard.svg';\nimport floresMobile from 'images/flores-mobile.svg';\nimport dependentCareFSAGuide from 'images/dependent-care-fsa-guide.svg';\nimport noWaitDependentCareFSA from 'images/no-wait-dependent-care-fsa.svg';\nimport commuterBenefitAccountGuide from 'images/commuter-benefit-account-guide.svg';\nimport limitedPurposeFSAGuide from 'images/limited-purpose-fsa-guide.svg';\nimport fsaChecklist from 'images/reenroll-fsa-checklist.svg';\nimport commuterChecklist from 'images/reenroll-commuter-checklist.svg';\nimport hraChecklist from 'images/reenroll-hra-checklist.svg';\nimport cobraChecklist from 'images/reenroll-cobra-checklist.svg';\nimport hsaChecklist from 'images/reenroll-hsa-checklist.svg';\nimport directBillChecklist from 'images/reenroll-direct-bill-checklist.svg';\nimport hsaGuide from 'images/hsa-guide.svg';\nimport hsaFAQ from 'images/hsa-faq.svg';\n\nimport GridCard from 'components/shared/GridCard';\nimport FsaEnrollmentTemplateCard from './FsaEnrollmentTemplateCard';\nimport CustomEnrollmentCard from './CustomEnrollmentCard';\nimport { selectEnrollmentResourcePlans } from 'open-enrollment-resources/open-enrollment-resources.slice';\n\nfunction EnrollmentSection({ plan }: { plan: string; }) {\n const plans = useSelector(selectEnrollmentResourcePlans);\n\n switch (plan) {\n case 'Health Care FSA':\n return (\n <Grid container spacing={3}>\n <GridCard\n src={fsaChecklist}\n name=\"FSA Re-Enrollment Checklist\"\n href=\"https://www.flores-associates.com/fsaforms/reenroll-FSA-checklist.pdf\"\n />\n <FsaEnrollmentTemplateCard />\n <GridCard\n src={healthCareFSAGuide}\n name=\"Health Care FSA Guide\"\n href=\"https://www.flores-associates.com/fsaforms/MRAGuide.pdf\"\n />\n <GridCard\n src={floresBenefitsMastercard}\n name=\"Flores Benefits Mastercard\"\n href=\"https://www.flores-associates.com/fsaforms/DebitCard.pdf\"\n />\n <GridCard\n src={floresMobile}\n name=\"Flores Mobile\"\n href=\"https://www.flores-associates.com/fsaforms/floresmobileflyer.pdf\"\n />\n </Grid>\n );\n case 'Dependent Care FSA':\n return (\n <Grid container spacing={3}>\n <GridCard\n src={noWaitDependentCareFSA}\n name=\"FSA Re-Enrollment Checklist\"\n href=\"https://www.flores-associates.com/fsaforms/reenroll-FSA-checklist.pdf\"\n />\n <GridCard\n src={dependentCareFSAGuide}\n name=\"Dependent Care FSA Guide\"\n href=\"https://www.flores-associates.com/fsaforms/DCRAGuide.pdf\"\n />\n <GridCard\n src={noWaitDependentCareFSA}\n name=\"No-Wait Dependent Care FSA\"\n href=\"https://www.flores-associates.com/fsaforms/NoWaitGuide.pdf\"\n />\n </Grid>\n );\n case 'Commuter Benefit Account':\n return (\n <Grid container spacing={3}>\n <GridCard\n src={commuterChecklist}\n name=\"Commuter Re-Enrollment Checklist\"\n href=\"https://www.flores-associates.com/fsaforms/reenroll-Commuter-checklist.pdf\"\n />\n <GridCard\n src={commuterBenefitAccountGuide}\n name=\"Commuter Benefit Account Guide\"\n href=\"https://www.flores-associates.com/fsaforms/qte.pdf\"\n />\n </Grid>\n );\n case 'Limited-Purpose FSA':\n return (\n <Grid container spacing={3}>\n <GridCard\n src={limitedPurposeFSAGuide}\n name=\"Limited Purpose FSA Guide\"\n href=\"https://www.flores-associates.com/fsaforms/LimitedFSA.pdf\"\n />\n </Grid>\n );\n case 'Health Reimbursement Account':\n return (\n <Grid container spacing={3}>\n <GridCard\n src={hraChecklist}\n name=\"HRA Re-Enrollment Checklist\"\n href=\"https://www.flores-associates.com/fsaforms/reenroll-HRA-checklist.pdf\"\n />\n <GridCard\n src={hraGuide}\n name=\"HRA Guide\"\n href=\"https://www.flores-associates.com/fsaforms/HRA_Guide.pdf\"\n />\n </Grid>\n );\n case 'Custom Reimbursement Account':\n return (\n <Grid container spacing={3}>\n {\n plans\n ?.filter((customPlan) => !!customPlan.subPlans?.length)\n .map((customPlan) => {\n return customPlan.subPlans!.map((subPlan, idx) => (\n <CustomEnrollmentCard\n key={`${customPlan.planYearId}-${customPlan.planId}-${subPlan.pyrPlansId}`}\n subPlanIndex={idx}\n plan={customPlan}\n />\n ));\n })\n }\n </Grid>\n );\n case 'COBRA':\n return (\n <Grid container spacing={3}>\n <GridCard\n src={cobraChecklist}\n name=\"COBRA Re-Enrollment Checklist\"\n href=\"https://www.flores-associates.com/fsaforms/reenroll-COBRA-checklist.pdf\"\n />\n <GridCard\n src={cobraChecklist}\n name=\"COBRA OE Mailing Checklist (optional)\"\n href=\"https://www.flores-associates.com/fsaforms/oe-COBRA-mailing.pdf\"\n />\n <GridCard\n src={cobraChecklist}\n name=\"COBRA Rate and Carrier Sheet\"\n href=\"https://www.flores-associates.com/fsaforms/COBRARates.pdf\"\n />\n </Grid>\n );\n case 'Direct Bill':\n return (\n <Grid container spacing={3}>\n <GridCard\n src={directBillChecklist}\n name=\"Direct Bill Re-Enrollment Checklist\"\n href=\"https://www.flores-associates.com/fsaforms/reenroll-Direct-Bill-checklist.pdf\"\n />\n </Grid>\n );\n default:\n return (\n <Grid container spacing={3}>\n <GridCard\n src={hsaChecklist}\n name=\"HSA Re-Enrollment Checklist\"\n href=\"https://www.flores-associates.com/fsaforms/reenroll-HSA-checklist.pdf\"\n />\n <GridCard\n src={hsaGuide}\n name=\"HSA Guide\"\n href=\"https://www.flores-associates.com/fsaforms/HSA_Guide.pdf\"\n />\n <GridCard\n src={hsaFAQ}\n name=\"HSA FAQ\"\n href=\"https://www.flores-associates.com/fsaforms/HSA_FAQ.pdf?pdf=HSA-FAQ\"\n />\n <GridCard\n src={floresBenefitsMastercard}\n name=\"Flores Benefits Mastercard\"\n href=\"https://www.flores-associates.com/fsaforms/DebitCard.pdf\"\n />\n </Grid>\n );\n }\n}\n\nexport default EnrollmentSection;\n","import React, { ReactElement, useEffect, useState } from 'react';\nimport Chip from '@mui/material/Chip';\nimport CardMedia from '@mui/material/CardMedia';\nimport { always, compose, isNil } from 'ramda';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport disablePopup from 'images/disable-popup.svg';\nimport { usePlanDisplayNames } from './usePlanDisplayNames';\nimport EnrollmentSection from './EnrollmentSection';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport {\n loadEnrollmentResourcePlans,\n selectEnrollmentResourcePlans,\n} from 'open-enrollment-resources/open-enrollment-resources.slice';\nimport store from 'store';\n\nfunction OpenEnrollmentResources(): ReactElement {\n const dispatch = useDispatch<typeof store.dispatch>();\n const plans = useSelector(selectEnrollmentResourcePlans);\n const { hasCobra, hasRetiree } = useSelector(selectSelectedCompany) ?? { hasCobra: undefined, hasRetiree: undefined };\n const [ abbreviations, displayNames ] = usePlanDisplayNames(plans, hasCobra, hasRetiree);\n const [ active, setActive ] = useState<number | null>(null);\n\n useEffect(() => {\n dispatch(loadEnrollmentResourcePlans());\n }, [ dispatch ]);\n\n return (\n <>\n <div className=\"w-full flex flex-col p-4\">\n <h2 className=\"page-title\">Open Enrollment Resources</h2>\n {\n plans === null\n ? <p className=\"animate-pulse text-2xl\">Loading Open Enrollment Resources...</p>\n : (\n <>\n <div className=\"w-full flex pb-4\">\n <Chip\n label=\"All\"\n variant={isNil(active) ? undefined : 'outlined'}\n className=\"cursor-pointer\"\n onClick={compose(setActive, always(null))}\n />\n {\n abbreviations.map((plan, i) => (\n <Chip\n label={plan}\n variant={i === active ? undefined : 'outlined'}\n key={plan}\n className=\"ml-2 cursor-pointer\"\n onClick={compose(setActive, always(i))}\n />\n ))\n }\n <a\n href=\"https://www.flores-associates.com/resource-open-enrollment.html\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n <Chip\n label=\"Additional Resources\"\n variant=\"outlined\"\n className=\"ml-2 cursor-pointer\"\n />\n </a>\n </div>\n <div className=\"w-full\">\n {\n displayNames\n .filter((plan, i) => isNil(active) || i === active)\n .map(plan => (\n <div key={plan} className=\"pb-4\">\n <h6 className=\"pb-2\">{plan}</h6>\n <EnrollmentSection plan={plan} />\n </div>\n ))\n }\n </div>\n </>\n )\n }\n <div className=\"mt-4 w-1/2 m-auto\">\n <p>If the online re-enrollment checklist has not opened in a new tab, you may have a pop-up blocker enabled\n that is preventing the checklist from opening. To disable, click on the icon in the highlighted box below\n and check “Allow Pop Ups for www.flores247.com only.†Click on the Open Enrollment tab again and the\n re-enrollment checklist should open. If you have any questions, or are unable to open the checklist, please\n contact your Flores Account Manager.\n </p>\n <CardMedia\n component=\"img\"\n src={disablePopup}\n title=\"Disable Popup Help Text\"\n />\n </div>\n </div>\n </>\n );\n}\n\nexport default OpenEnrollmentResources;\n","import CommonSelect from './form/CommonSelect';\nimport { mapToSelectOption } from 'shared/form-helpers';\nimport { DirectDebitAccount as DirectDebitAccountType } from 'shared/types/direct-debit-accounts.types';\n\nexport type DirectDebitAccountOption = DirectDebitAccountType;\n\nexport interface DirectDebitAccountProps {\n accounts: DirectDebitAccountOption[] | null;\n value: string;\n label?: string;\n name: string;\n onAccountChanged: (cddid: string) => void;\n error?: boolean;\n className?: string;\n isRequired?: boolean;\n disabled?: boolean;\n}\n\nfunction DirectDebitAccount({\n accounts,\n value,\n label = 'Account to Pay From',\n name,\n onAccountChanged,\n error = false,\n className = '',\n isRequired = true,\n disabled = false,\n}: DirectDebitAccountProps) {\n const options = mapToSelectOption(accounts ?? [], 'cddcomment', 'cddid');\n\n function handleChange(val: string) {\n onAccountChanged(val);\n }\n\n return (\n <CommonSelect\n options={options}\n label={label}\n name={name}\n value={value}\n onSelectChange={handleChange}\n error={isRequired && error}\n classes={ {\n control: `${className} w-full`,\n error: className,\n } }\n />\n );\n}\n\nexport default DirectDebitAccount;\n","import * as yup from 'yup';\n\nexport const validationSchema = yup.object({\n cddid: yup\n .string()\n .required(),\n});\n","import React, { ReactElement, useEffect, useState } from 'react';\nimport { useFormik } from 'formik';\nimport dayjs from 'dayjs';\nimport Table from '@mui/material/Table';\nimport TableHead from '@mui/material/TableHead';\nimport TableBody from '@mui/material/TableBody';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport Button from '@mui/material/Button';\nimport { always, compose, F } from 'ramda';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport { AdminInvoice } from './administrative-billing.types';\nimport { currencyFormatter } from 'shared/utils';\nimport withModal from 'components/shared/HOC/WithModal';\nimport DirectDebitAccountSelect from 'components/shared/DirectDebitAccountSelect';\nimport { validationSchema } from './pay-invoice.validators';\nimport { payAdminInvoice } from 'shared/api/directDebitAccountsApi';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { addHttpErrorNotification, addHttpSuccessNotification } from 'notifications/notifications.slice';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport store from 'store';\nimport {\n selectDirectDebitAccounts,\n selectFetchDirectDebitAccountStatus,\n} from 'store/slices/direct-debit/direct-debit.slice';\nimport { fetchDirectDebitAccount } from 'store/slices/direct-debit/direct-debit.thunk';\n\nexport interface InvoiceTableProps {\n invoice: AdminInvoice | null;\n onCancel: () => void;\n}\n\nfunction PayInvoice({ invoice, onCancel }: InvoiceTableProps): ReactElement {\n const dispatch = useDispatch<typeof store.dispatch>();\n const directDebitAccounts = useSelector(selectDirectDebitAccounts);\n const directDebitFetchStatus = useSelector(selectFetchDirectDebitAccountStatus);\n useEffect(() => {\n if (directDebitFetchStatus === 'uninitialized') {\n dispatch(fetchDirectDebitAccount());\n }\n }, [ dispatch, directDebitFetchStatus ]);\n const { compid: companyId } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const [ paying, setPaying ] = useState(false);\n\n const handleError = compose(\n onCancel,\n dispatch,\n addHttpErrorNotification,\n );\n const handleSuccess = compose(\n onCancel,\n () => {\n if (invoice) {\n invoice.paid = invoice.amount;\n invoice.open = 0;\n }\n },\n dispatch,\n addHttpSuccessNotification,\n always('Successfully submitted payment'),\n );\n\n const form = useFormik({\n initialValues: {\n cddid: '',\n },\n validationSchema,\n onSubmit: (values) => {\n setPaying(true);\n payAdminInvoice(companyId, invoice?.invoiceNumber ?? 0, parseInt(values.cddid))\n .then(handleSuccess)\n .catch(handleError)\n .finally(compose(setPaying, F));\n },\n });\n\n function handleChange(val: string) {\n form.setFieldValue('cddid', val);\n }\n\n const AccountSelectWithLoading = withLoopIcon(\n DirectDebitAccountSelect,\n 'Loading accounts...',\n directDebitAccounts === null,\n 'direct-debit-accounts-loading',\n );\n\n return (\n <div>\n <Table className=\"pay-invoice-table\">\n <TableHead>\n <TableRow>\n <TableCell>Invoice #</TableCell>\n <TableCell>Invoice Date</TableCell>\n <TableCell>Due Date</TableCell>\n <TableCell>Amount</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n <TableRow className=\"check-row\">\n <TableCell className=\"border-0\">{invoice?.invoiceNumber}</TableCell>\n <TableCell className=\"border-0\">{dayjs(invoice?.invoiceDate).format('M/D/YYYY')}</TableCell>\n <TableCell className=\"border-0\">{dayjs(invoice?.dueDate).format('M/D/YYYY')}</TableCell>\n <TableCell className=\"border-0\">{currencyFormatter.format(invoice?.amount ?? 0)}</TableCell>\n </TableRow>\n </TableBody>\n </Table>\n\n <form onSubmit={form.handleSubmit} className=\"mt-4\">\n <AccountSelectWithLoading\n isRequired\n accounts={directDebitAccounts}\n name=\"cddid\"\n value={form.values.cddid.toString()}\n error={form.touched.cddid && !!form.errors.cddid}\n onAccountChanged={handleChange}\n />\n\n <div className=\"flex flex-row-reverse mt-4\">\n <Button\n variant=\"contained\"\n color=\"primary\"\n className={`ml-2 ${paying && 'animate-ping'}`}\n type=\"submit\"\n disabled={directDebitAccounts === null || !form.values.cddid || paying}\n >Pay Invoice\n </Button>\n <Button\n variant=\"text\"\n color=\"primary\"\n onClick={onCancel}\n >Cancel\n </Button>\n </div>\n </form>\n </div>\n );\n}\n\nexport const PayInvoiceModal = withModal(PayInvoice);\n\nexport default PayInvoice;\n","import React, { useState } from 'react';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport Button from '@mui/material/Button';\nimport dayjs from 'dayjs';\nimport { compose, F, T } from 'ramda';\n\nimport { AdminInvoice } from './administrative-billing.types';\nimport { currencyFormatter } from 'shared/utils';\nimport { PayInvoiceModal } from './PayInvoice';\nimport { downloadAdministrativeBillingInvoice } from 'shared/api/administrativeBillingApi';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { useDispatch } from 'react-redux';\nimport store from 'store';\n\ninterface AdministrativeBillingRowProps {\n adminInvoice: AdminInvoice;\n dateFormat?: string;\n}\n\nfunction AdministrativeBillingRow({\n adminInvoice,\n dateFormat = 'MM/DD/YYYY',\n}: AdministrativeBillingRowProps): React.ReactElement {\n const dispatch = useDispatch<typeof store.dispatch>();\n\n const [ isOpen, setIsOpen ] = useState(false);\n\n function formatDate(date?: string): string {\n return date ? dayjs(date).format(dateFormat) : '';\n }\n\n function isPaid() {\n return adminInvoice.amount - adminInvoice.paid === 0;\n }\n\n function handleViewClick() {\n downloadAdministrativeBillingInvoice(adminInvoice.companyId, adminInvoice.invoiceNumber)\n .catch((err) => {\n compose(dispatch, addHttpErrorNotification)(err);\n });\n }\n\n return (\n <TableRow>\n <TableCell className=\"text-sm\">{adminInvoice.invoiceNumber}</TableCell>\n <TableCell className=\"text-sm\">{formatDate(adminInvoice.invoiceDate)}</TableCell>\n <TableCell className=\"text-sm\">{formatDate(adminInvoice.dueDate)}</TableCell>\n <TableCell className=\"text-sm\">{currencyFormatter.format(adminInvoice.amount)}</TableCell>\n <TableCell className=\"text-sm\">\n <div className=\"text-green-600 bg-green-100 font-bold\" style={ { width: 'fit-content' } }>\n {adminInvoice.paid === 0 ? null : currencyFormatter.format(adminInvoice.paid)}\n </div>\n </TableCell>\n <TableCell className=\"text-sm\">\n <div className=\"text-yellow-600 bg-yellow-200 font-bold\" style={ { width: 'fit-content' } }>\n {currencyFormatter.format(adminInvoice.open)}\n </div>\n </TableCell>\n <TableCell>\n <Button\n color=\"primary\"\n onClick={handleViewClick}\n className=\"text-sm view-admin-invoice\"\n >\n View\n </Button>\n <Button\n color=\"primary\"\n onClick={compose(setIsOpen, T)}\n className=\"text-sm pay-admin-invoice\"\n disabled={isPaid()}\n >\n Pay\n </Button>\n </TableCell>\n <PayInvoiceModal\n invoice={adminInvoice}\n title=\"Pay Invoice\"\n isOpen={isOpen}\n onClose={compose(setIsOpen, F)}\n onCancel={compose(setIsOpen, F)}\n />\n </TableRow>\n );\n}\n\nexport default AdministrativeBillingRow;\n","import request from '../api-request';\nimport { AdminInvoice } from 'administrative-billing/administrative-billing.types';\n\nexport function getAdministrativeBillingInvoices(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get administrative invoices for invalid company.'));\n }\n\n const uri = `/api/companies/${companyId}/administrative-billing/`;\n\n return request<AdminInvoice[]>(uri);\n}\n\nexport function downloadAdministrativeBillingInvoice(companyId: number, invoiceNumber: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot print administrative invoice for invalid company.'));\n }\n\n const uri = `/api/companies/${companyId}/administrative-billing/${invoiceNumber}/print`;\n\n return request<string>(uri);\n}\n","import React, { useEffect, useState, ReactElement } from 'react';\nimport Table from '@mui/material/Table';\nimport TableCell from '@mui/material/TableCell';\nimport TableRow from '@mui/material/TableRow';\nimport TableHead from '@mui/material/TableHead';\nimport TableBody from '@mui/material/TableBody';\nimport TableFooter from '@mui/material/TableFooter';\nimport TablePagination from '@mui/material/TablePagination';\nimport TableSortLabel from '@mui/material/TableSortLabel';\nimport { compose, nthArg } from 'ramda';\n\nimport AdministrativeBillingRow from './AdministrativeBillingRow';\nimport { AdminInvoice } from './administrative-billing.types';\n\ninterface AdministrativeBillingProps {\n adminInvoices: AdminInvoice[];\n}\n\nfunction stableSort(array: any[], comparator: any) {\n const stabilizedThis = array.map((el, index) => [ el, index ]);\n stabilizedThis.sort((a, b) => {\n const order = comparator(a[0], b[0]);\n if (order !== 0) return order;\n\n return a[1] - b[1];\n });\n\n return stabilizedThis.map((el) => el[0]);\n}\n\nfunction getComparator(order: any, orderBy: any) {\n return order === 'desc'\n ? (a: any, b: any) => descendingComparator(a, b, orderBy)\n : (a: any, b: any) => -descendingComparator(a, b, orderBy);\n}\n\nfunction descendingComparator(a: any, b: any, orderBy: any) {\n if (orderBy === 'invoiceDate' || orderBy === 'dueDate') {\n return (new Date(b[orderBy]).valueOf() - new Date(a[orderBy]).valueOf());\n }\n\n if (b[orderBy] < a[orderBy]) {\n return -1;\n }\n\n if (b[orderBy] > a[orderBy]) {\n return 1;\n }\n\n return 0;\n}\n\nfunction AdministrativeBillingTable({ adminInvoices }: AdministrativeBillingProps): ReactElement {\n const [ page, setPage ] = useState(0);\n const [ selectedOrder, setSelectedOrder ] = useState<'desc' | 'asc' | undefined>('desc');\n const [ selectedOrderBy, setSelectedOrderBy ] = useState('invoiceDate');\n const [ sortedAdminInvoices, setSortedAdminInvoices ] = useState(adminInvoices);\n\n const handleRequestSort = (event: any, property: any) => {\n const isAsc = selectedOrderBy === property && selectedOrder === 'asc';\n const newOrder = isAsc ? 'desc' : 'asc';\n setSelectedOrder(newOrder);\n setSelectedOrderBy(property);\n setSortedAdminInvoices(stableSort(adminInvoices, getComparator(newOrder, property)));\n };\n\n const createSortHandler = (property: any) => (event: any) => {\n handleRequestSort(event, property);\n };\n\n const headCells = [\n { id: 'invoiceNumber', numeric: false, label: 'Invoice #', sortable: false },\n { id: 'invoiceDate', numeric: false, label: 'Invoice Date', sortable: true },\n { id: 'dueDate', numeric: false, label: 'Due Date', sortable: true },\n { id: 'amount', numeric: true, label: 'Amount', sortable: true },\n { id: 'paid', numeric: true, label: 'Paid', sortable: true },\n { id: 'open', numeric: true, label: 'Open', sortable: true },\n { id: 'action', numeric: false, label: 'Action', sortable: false },\n ];\n\n useEffect(() => {\n setSelectedOrder('desc');\n setSortedAdminInvoices(stableSort(adminInvoices, getComparator('desc', 'invoiceDate')));\n }, [ adminInvoices ]);\n\n return (\n <div className=\"w-full\">\n <Table className=\"w-full\">\n <TableHead>\n <TableRow>\n {headCells.map((headCell) => (\n <TableCell\n className=\"text-sm\"\n key={headCell.id}\n align={'left'}\n sortDirection={selectedOrderBy === headCell.id ? selectedOrder : false}\n >\n <TableSortLabel\n active={selectedOrderBy === headCell.id}\n direction={selectedOrderBy === headCell.id ? selectedOrder : 'asc'}\n onClick={createSortHandler(headCell.id)}\n disabled={!headCell.sortable}\n >\n {headCell.label}\n </TableSortLabel>\n </TableCell>\n ))}\n </TableRow>\n </TableHead>\n <TableBody>\n {\n adminInvoices.length > 0\n ? sortedAdminInvoices\n .slice(page * 10, page * 10 + 10)\n .map((invoice) => <AdministrativeBillingRow adminInvoice={invoice} key={invoice.invoiceNumber} />)\n : <TableRow><TableCell colSpan={6}><p>No administrative invoices to display.</p></TableCell></TableRow>\n }\n </TableBody>\n <TableFooter>\n <TableRow>\n <TablePagination\n rowsPerPage={10}\n rowsPerPageOptions={[ 10 ]}\n colSpan={7}\n count={adminInvoices.length}\n page={page}\n onPageChange={compose(setPage, nthArg(1))}\n SelectProps={ { native: true } }\n />\n </TableRow>\n </TableFooter>\n </Table>\n </div>\n );\n}\n\nexport default AdministrativeBillingTable;\n","import { useState, useRef, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { compose, tap, always } from 'ramda';\n\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { AdminInvoice } from '../administrative-billing.types';\nimport { getAdministrativeBillingInvoices } from 'shared/api/administrativeBillingApi';\nimport { selectSelectedCompany } from 'companies/companies.slice';\n\nexport function useAdministrativeBillingInvoices() {\n const errorNotifier = useErrorNotifier();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const [ invoices, setInvoices ] = useState<AdminInvoice[] | null>(null);\n\n const [ setDefault ] = useState(() => compose(setInvoices, always(null)));\n const [ handleError ] = useState(() => compose(tap(setDefault), errorNotifier));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n if (compid > 0) {\n setInvoices(null);\n getAdministrativeBillingInvoices(compid)\n .then((result) => {\n if (mountedRef.current) {\n setInvoices(result?.map(el => ({ ...el, open: el.amount - el.paid, companyId: compid })) ?? []);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n }\n\n return () => {\n mountedRef.current = false;\n };\n }, [ handleError, compid ]);\n\n return invoices;\n}\n","import React from 'react';\nimport PageContentPaper from 'components/layout/PageContentPaper';\n\nimport AdministrativeBillingTable from './AdministrativeBillingTable';\nimport { useAdministrativeBillingInvoices } from './hooks/useAdministrativeBillingInvoices';\nimport Loading from 'components/shared/Loading';\n\nfunction AdministrativeBilling(): React.ReactElement {\n const adminInvoices = useAdministrativeBillingInvoices();\n\n return (\n <div className=\"w-full flex flex-col p-4\">\n <h2 className=\"page-title\">Administrative Billing</h2>\n <PageContentPaper className=\"flex flex-col\">\n <div className=\"w-full flex\">\n {\n adminInvoices !== null\n ? <AdministrativeBillingTable adminInvoices={adminInvoices} />\n : <Loading text=\"Loading administrative invoices...\" />\n }\n </div>\n </PageContentPaper>\n </div>\n );\n}\n\nexport default AdministrativeBilling;\n","import * as yup from 'yup';\n\nexport const validationSchema = yup.object({\n code: yup\n .string()\n .trim()\n .length(6)\n .required(),\n});\n","import React, { ReactElement, useEffect, useState } from 'react';\nimport { useFormik } from 'formik';\nimport Paper from '@mui/material/Paper';\nimport Button from '@mui/material/Button';\nimport { always, andThen, compose, equals, when, path, pipe } from 'ramda';\nimport TextField from '@mui/material/TextField';\nimport { useHistory } from 'react-router-dom';\nimport { useDispatch } from 'react-redux';\n\nimport store from 'store';\nimport { resendCode, verifyToken } from 'shared/api/multiFactorApi';\nimport { usePageTitle } from 'shared/custom-hooks/usePageTitle';\nimport { getUser } from 'authentication/authentication';\nimport { User } from 'authentication/user.types';\nimport { validationSchema } from './multi-factor-authentication.validators';\nimport { getCompaniesForUser } from 'companies/companies.slice';\n\nfunction MultiFactorAuth(): ReactElement {\n usePageTitle('2-Step Verification');\n const history = useHistory();\n const [ userName, setUserName ] = useState<string>('');\n const dispatch = useDispatch<typeof store.dispatch>();\n const getCompanies = () => getCompaniesForUser(getUser() ?? {} as User);\n\n const form = useFormik({\n initialValues: {\n code: '',\n },\n validationSchema: validationSchema,\n onSubmit: (values, { setErrors }) => {\n verifyToken({\n userName,\n passCode: values.code,\n })\n .then(compose(history.push, always('/company-select')))\n .then(compose(dispatch, getCompanies))\n .catch(\n pipe(\n path<any>([ 'status' ]),\n when(\n equals(400),\n compose(\n setErrors,\n always({ code: 'The code that you entered did not match what was sent. Please try again.' }),\n ),\n ),\n ),\n );\n },\n });\n\n useEffect(() => {\n window.localStorage.removeItem('isPartialLogin');\n setUserName((getUser() ?? {} as User).username);\n }, []);\n\n return (\n <Paper className=\"w-1/2\">\n <div className=\"flex flex-col p-4\">\n <p className=\"font-bold pt-4\">{ userName }</p>\n <p className=\"pt-4\">Check your email</p>\n <p className=\"pt-4\">Flores sent a six digit access code that will be valid for 5 minutes.</p>\n <form onSubmit={form.handleSubmit} className=\"pt-2\">\n <TextField\n variant=\"outlined\"\n label=\"Enter the code\"\n name=\"code\"\n value={form.values.code}\n error={form.touched.code && !!form.errors.code}\n helperText={form.touched.code && form.errors.code}\n onChange={form.handleChange}\n />\n <p className=\"pt-4\">Didn't get it?\n <Button variant=\"text\" color=\"primary\" className=\"normal-case\" onClick={\n pipe(\n always({ userName }),\n resendCode,\n andThen(compose(window.alert, always('Token was successfully created'))),\n )\n }\n > Resend\n </Button>\n </p>\n\n <div className=\"flex flex-row-reverse\">\n <Button variant=\"contained\" color=\"primary\" type=\"submit\">Next</Button>\n </div>\n </form>\n </div>\n </Paper>\n );\n}\n\nexport default MultiFactorAuth;\n","import { useEffect, useRef, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { always, compose, tap } from 'ramda';\n\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { getForms } from 'shared/api/documentLibraryApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { LibraryDocument } from 'document-library/document-library.types';\nimport store from 'store';\n\nexport function useDocumentLibraryForms() {\n const dispatch = useDispatch<typeof store.dispatch>();\n const errorNotifier = useErrorNotifier();\n\n const [ formDocuments, setFormDocuments ] = useState<LibraryDocument[] | null>(null);\n\n const { compid: companyId } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n\n const setDefault = compose(setFormDocuments, always([]));\n const [ handleError ] = useState(() => compose(tap(setDefault), errorNotifier));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n if (companyId) {\n getForms(companyId)\n .then((result) => {\n if (mountedRef.current) {\n setFormDocuments(result ?? []);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n }\n\n return () => {\n mountedRef.current = false;\n };\n }, [ dispatch, companyId, handleError ]);\n\n return formDocuments;\n}\n","import request from '../api-request';\nimport { LibraryDocument, EducationDocument } from 'document-library/document-library.types';\n\nexport function getForms(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get forms documents for invalid company.'));\n }\n\n return request<LibraryDocument[]>(`/api/companies/${companyId}/document-library/forms`);\n}\n\nexport function getDocumentLibraryEducation(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get education documents for invalid company.'));\n }\n\n const uri = `/api/companies/${companyId}/document-library/education`;\n\n return request<EducationDocument[]>(uri);\n}\n\nexport function getLegalDocuments(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get legal documents for invalid company.'));\n }\n\n return request<LibraryDocument[]>(`/api/companies/${companyId}/document-library/legal-docs`);\n}\n","export default __webpack_public_path__ + \"static/media/allowable-dependent-care-expenses.c6b22840.svg\";","export default __webpack_public_path__ + \"static/media/calendar-of-events.12e7362f.svg\";","export default __webpack_public_path__ + \"static/media/claim-process-flow-chart.aebd4750.svg\";","export default __webpack_public_path__ + \"static/media/fed-form-2441-child-and-dependent-care-expenses.6f0b979b.svg\";","export default __webpack_public_path__ + \"static/media/fsa-store-eligibility-list.a8b918af.svg\";","export default __webpack_public_path__ + \"static/media/guidee-to-allowable-status-changes.b35e247f.svg\";","export default __webpack_public_path__ + \"static/media/guide-to-allowable-otc-expenses.31a2d5c4.svg\";","export default __webpack_public_path__ + \"static/media/guide-to-reimbursable-dependent-care-expenses.cda70fa0.svg\";","export default __webpack_public_path__ + \"static/media/hipaa-privacy-standards.88031b93.svg\";","export default __webpack_public_path__ + \"static/media/90-merchant-list.a591bd3a.svg\";","export default __webpack_public_path__ + \"static/media/direct-deposit.f47f9d61.svg\";","export default __webpack_public_path__ + \"static/media/allowable-medical-expenses.b5adab2e.svg\";","export default __webpack_public_path__ + \"static/media/iias-approved.bb7c15fa.svg\";","export default __webpack_public_path__ + \"static/media/reimbursable-medical-expenses.c88ae9c9.svg\";","export default __webpack_public_path__ + \"static/media/default.26b8422c.svg\";","export default __webpack_public_path__ + \"static/media/dash-training-manual.a72cd9a6.svg\";","import allowableDependentCareExpenses from 'images/allowable-dependent-care-expenses.svg';\nimport calendarOfEvents from 'images/calendar-of-events.svg';\nimport claimProcessFlowChart from 'images/claim-process-flow-chart.svg';\nimport fedForm2441ChildAndDependentCareExpenses from 'images/fed-form-2441-child-and-dependent-care-expenses.svg';\nimport fsaStoreEligibilityList from 'images/fsa-store-eligibility-list.svg';\nimport guideToAllowableStatusChanges from 'images/guidee-to-allowable-status-changes.svg';\nimport guideToAllowableOTCExpenses from 'images/guide-to-allowable-otc-expenses.svg';\nimport guideToReimbursableDependentCareExpenses from 'images/guide-to-reimbursable-dependent-care-expenses.svg';\nimport hipaaPrivacyStandards from 'images/hipaa-privacy-standards.svg';\nimport ninetyPercentMerchantList from 'images/90-merchant-list.svg';\nimport commuterBenefitAccountGuide from 'images/commuter-benefit-account-guide.svg';\nimport dependentCareFSAGuide from 'images/dependent-care-fsa-guide.svg';\nimport directDeposit from 'images/direct-deposit.svg';\nimport healthCareFSAGuide from 'images/health-care-fsa-guide.svg';\nimport allowableMedicalExpenses from 'images/allowable-medical-expenses.svg';\nimport iiasApproved from 'images/iias-approved.svg';\nimport reimbursableMedicalExpenses from 'images/reimbursable-medical-expenses.svg';\nimport defaultImage from 'images/default.svg';\nimport dashTraining from 'images/dash-training-manual.svg';\n\nconst imageMap = new Map<string, string>([\n [ '90% merchant list', ninetyPercentMerchantList ],\n [ 'allowable dependent care expenses (publication 503)', allowableDependentCareExpenses ],\n [ 'calendar of events', calendarOfEvents ],\n [ 'claim process flow chart', claimProcessFlowChart ],\n [ 'fed form 2441 child and dependent care expenses', fedForm2441ChildAndDependentCareExpenses ],\n [ 'fsa store eligibility list', fsaStoreEligibilityList ],\n [ 'guide to allowable otc expenses', guideToAllowableOTCExpenses ],\n [ 'guide to allowable status changes', guideToAllowableStatusChanges ],\n [ 'guide to reimbursable dependent care expenses', guideToReimbursableDependentCareExpenses ],\n [ 'hipaa privacy standards', hipaaPrivacyStandards ],\n [ 'hipaa security statement', hipaaPrivacyStandards ],\n [ 'commuter benefit account guide', commuterBenefitAccountGuide ],\n [ 'dependent care fsa guide', dependentCareFSAGuide ],\n [ 'direct deposit', directDeposit ],\n [ 'direct deposit authorization 2019', directDeposit ],\n [ 'direct deposit authorization 2020', directDeposit ],\n [ 'direct deposit authorization 2021', directDeposit ],\n [ 'direct deposit authorization 2022', directDeposit ],\n [ 'direct deposit authorization 2023', directDeposit ],\n [ 'direct deposit authorization', directDeposit ],\n [ 'health care fsa guide', healthCareFSAGuide ],\n [ 'allowable medical expenses (publication 502)', allowableMedicalExpenses ],\n [ 'iias approved vendor list', iiasApproved ],\n [ 'guide to reimbursable medical expenses', reimbursableMedicalExpenses ],\n [ 'default', defaultImage ],\n [ 'dash training manual', dashTraining ],\n]);\n\nexport function getDocImage(name: string) {\n const key = name.trim().toLocaleLowerCase();\n\n return imageMap.get(key) ?? imageMap.get('default');\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { always, compose, tap } from 'ramda';\n\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { getLegalDocuments } from 'shared/api/documentLibraryApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { LibraryDocument } from 'document-library/document-library.types';\nimport store from 'store';\n\nexport function useLegalDocuments() {\n const dispatch = useDispatch<typeof store.dispatch>();\n const errorNotifier = useErrorNotifier();\n\n const [ legalDocs, setLegalDocs ] = useState<LibraryDocument[] | null>(null);\n\n const { compid: companyId } = useSelector(selectSelectedCompany) ?? { compid: undefined };\n\n const setDefault = compose(setLegalDocs, always([]));\n const [ handleError ] = useState(() => compose(tap(setDefault), errorNotifier));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n if (companyId) {\n getLegalDocuments(companyId)\n .then((result) => {\n if (mountedRef.current) {\n setLegalDocs(result ?? []);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n }\n\n return () => {\n mountedRef.current = false;\n };\n }, [ dispatch, companyId, handleError ]);\n\n return legalDocs;\n}\n","import { useState, useRef, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { compose, tap, always } from 'ramda';\n\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { getDocumentLibraryEducation } from 'shared/api/documentLibraryApi';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { EducationDocument } from '../../document-library.types';\n\nexport function useDocumentLibraryEducation() {\n const errorNotifier = useErrorNotifier();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const [ educationDocuments, setEducationDocuments ] = useState<EducationDocument[] | null>(null);\n\n const [ setDefault ] = useState(() => compose(setEducationDocuments, always(null)));\n const [ handleError ] = useState(() => compose(tap(setDefault), errorNotifier));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n if (compid > 0) {\n setEducationDocuments(null);\n getDocumentLibraryEducation(compid)\n .then((result) => {\n if (mountedRef.current) {\n setEducationDocuments(result ?? []);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n }\n\n return () => {\n mountedRef.current = false;\n };\n }, [ handleError, compid ]);\n\n return educationDocuments;\n}\n","import React, { ComponentType } from 'react';\n\nimport { DocumentLibraryType } from './document-library.types';\nimport TabPanel from 'components/shared/TabPanel';\nimport FormsDocumentLibrary from './forms/FormsDocumentLibrary';\nimport LegalDocumentLibrary from './legal/LegalDocumentLibrary';\nimport EducationDocumentLibrary from './education/EducationDocumentLibrary';\n\nconst tabTypeMap: Map<DocumentLibraryType, ComponentType<React.PropsWithChildren<unknown>>> = new Map([\n [ 'forms', FormsDocumentLibrary ],\n [ 'legal', LegalDocumentLibrary ],\n [ 'education', EducationDocumentLibrary ],\n]);\n\ninterface DocumentLibraryTabPanelsProps {\n documentLibraryTypes: DocumentLibraryType[];\n activeTab: DocumentLibraryType;\n}\n\nfunction DocumentLibraryTabPanels({ documentLibraryTypes, activeTab }: DocumentLibraryTabPanelsProps) {\n function renderComp(type: DocumentLibraryType) {\n const Comp = tabTypeMap.get(type);\n\n return Comp ? <div data-testid={`${type}-tab-panel`}><Comp /></div> : <></>;\n }\n\n return (\n <>\n {\n documentLibraryTypes.map((type) => {\n return (\n <TabPanel value={activeTab} index={type} key={`${type}-tab-panel`}>\n { activeTab === type ? renderComp(type) : <></> }\n </TabPanel>\n );\n })\n }\n </>\n );\n}\n\nexport default DocumentLibraryTabPanels;\n","import React, { useState, useMemo } from 'react';\nimport Chip from '@mui/material/Chip';\nimport LoopIcon from '@mui/icons-material/Loop';\nimport { always, compose, isNil } from 'ramda';\n\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport { useDocumentLibraryForms } from 'document-library/hooks/useDocumentLibraryForms';\nimport Grid from '@mui/material/Grid';\nimport GridCard from 'components/shared/GridCard';\nimport { getDocImage } from '../imageMap';\n\nfunction FormsDocumentLibrary() {\n const [ active, setActive ] = useState<number | null>(null);\n const forms = useDocumentLibraryForms();\n\n const titles = useMemo(() => forms?.reduce(\n (acc: string[], { planYear: { planYearName } }) => acc.includes(\n planYearName) ? acc : [ ...acc, planYearName ], [],\n ), [ forms ]);\n\n return (\n <PageContentPaper>\n <div className=\"flex flex-col\">\n <div className=\"w-full flex pb-4\">\n <Chip\n label=\"All\"\n variant={isNil(active) ? undefined : 'outlined'}\n className=\"cursor-pointer\"\n onClick={compose(setActive, always(null))}\n />\n {\n titles?.map((title, i) => (\n <Chip\n label={title}\n variant={i === active ? undefined : 'outlined'}\n key={title}\n className=\"ml-2 cursor-pointer\"\n onClick={compose(setActive, always(i))}\n />\n ))\n }\n </div>\n {\n titles?.map((title, i) => (\n (isNil(active) || active === i) && (\n <div>\n <div className=\"mt-10 mb-10\">\n {title}\n </div>\n <Grid className=\"grid-section\" container spacing={3}>\n {\n forms?.filter(f => f.planYear.planYearName === title)\n .map((form) => (\n <GridCard\n src={getDocImage(form.name)}\n name={form.name}\n type=\"PDF\"\n href={form.url}\n />\n ))\n }\n </Grid>\n </div>\n )\n )) || <><LoopIcon className=\"animate-spin\" /> Loading...</>\n }\n </div>\n </PageContentPaper>\n );\n}\n\nexport default FormsDocumentLibrary;\n","import React from 'react';\nimport Grid from '@mui/material/Grid';\nimport LoopIcon from '@mui/icons-material/Loop';\nimport { compose } from 'ramda';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport { useLegalDocuments } from 'document-library/hooks/useLegalDocuments';\nimport GridCard from 'components/shared/GridCard';\nimport { LibraryDocument } from 'document-library/document-library.types';\nimport { downloadCloudFile } from 'shared/api/filesApi';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { AppDispatch } from 'store';\nimport { getDocImage } from '../imageMap';\n\nfunction LegalDocumentLibrary() {\n const legalDocs = useLegalDocuments();\n const { compid: companyId } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const dispatch = useDispatch<AppDispatch>();\n\n function downloadLegalDoc(document: LibraryDocument) {\n return () => {\n downloadCloudFile(companyId, document.fileSection ?? 'LegalDocs', document.url)\n .catch((err) => {\n compose(dispatch, addHttpErrorNotification)(err);\n });\n };\n }\n\n return (\n <PageContentPaper>\n <div className=\"flex flex-col\">\n <div>\n <Grid className=\"grid-section\" container spacing={3}>\n {\n legalDocs === null\n ? <><LoopIcon className=\"animate-spin\" /> Loading...</>\n : legalDocs.map((doc, i) => {\n const urlFragments = doc.url.split('.');\n\n return (\n <GridCard\n key={doc.url}\n src={getDocImage(doc.name)}\n name={doc.name}\n type={urlFragments[urlFragments.length - 1].toUpperCase()}\n onClick={downloadLegalDoc(doc)}\n />\n );\n })\n }\n </Grid>\n </div>\n </div>\n </PageContentPaper>\n );\n}\n\nexport default LegalDocumentLibrary;\n","import request, { ContentType } from 'shared/api-request';\nimport { FilesApiSection } from 'shared/types/files-api.types';\n\nexport function listCloudFilesInSection(companyId: number, section: FilesApiSection) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot list files for invalid company.'));\n }\n\n const uri = `/api/companies/${companyId}/files/${section}/`;\n\n return request(uri);\n}\n\nexport function downloadCloudFile(companyId: number, section: FilesApiSection, fileName: string) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot download file for invalid company.'));\n }\n\n if (fileName.length === 0) {\n return Promise.reject(new Error('Cannot download file for invalid file name.'));\n }\n\n const uri = `/api/companies/${companyId}/files/${section}/${fileName}`;\n\n return request(uri, { method: 'GET', headers: { accept: ContentType.DEFAULT } });\n}\n","import { useState } from 'react';\nimport { always, compose, isNil } from 'ramda';\nimport Chip from '@mui/material/Chip';\nimport Grid from '@mui/material/Grid';\nimport LoopIcon from '@mui/icons-material/Loop';\n\nimport GridCard from 'components/shared/GridCard';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport { useDocumentLibraryEducation } from './hooks/useDocumentLibraryEducation';\nimport { getDocImage } from '../imageMap';\n\nfunction EducationDocumentLibrary() {\n const [ active, setActive ] = useState<number | null>(null);\n const educationDocuments = useDocumentLibraryEducation();\n\n return (\n <PageContentPaper>\n <div className=\"flex flex-col\">\n <div className=\"w-full flex flex-col p-4\">\n <div className=\"w-full flex pb-4\">\n <Chip\n label=\"All\"\n variant={isNil(active) ? undefined : 'outlined'}\n className=\"cursor-pointer\"\n onClick={compose(setActive, always(null))}\n />\n {\n educationDocuments === null\n ? <><LoopIcon className=\"animate-spin\" /> Loading...</>\n : educationDocuments.map((doc) => (\n <Chip\n label={doc.year}\n variant={doc.year === active ? undefined : 'outlined'}\n key={doc.year}\n className=\"ml-2 cursor-pointer\"\n onClick={compose(setActive, always(doc.year))}\n />\n ))\n }\n </div>\n {\n educationDocuments?.map((doc) => (\n <div>\n {(isNil(active) || active === doc.year) ? (\n <>\n <div className=\"mt-10 mb-10\">\n {doc.planYearName}\n </div>\n <Grid className=\"grid-section\" container spacing={3}>\n {\n doc.documents.map((d) => (\n <GridCard\n src={getDocImage(d.name)}\n name={d.name}\n type=\"PDF\"\n href={d.url}\n />\n ))\n }\n {\n <GridCard\n src={getDocImage('dash training manual')}\n name={'Dash Training Manual'}\n type={'PDF'}\n href={'https://www.flores-associates.com/fsaforms/DASH-Training-Manual-Administrators.pdf'}\n />\n }\n </Grid>\n </>\n ) : (<></>)}\n </div>\n ))\n }\n </div>\n </div>\n </PageContentPaper>\n );\n}\n\nexport default EducationDocumentLibrary;\n","import { useState, ChangeEvent } from 'react';\nimport { useParams } from 'react-router';\nimport Tab from '@mui/material/Tab';\nimport Tabs from '@mui/material/Tabs';\n\nimport { DocumentLibraryType } from './document-library.types';\nimport DocumentLibraryTabPanels from './DocumentLibraryTabPanels';\nimport styles from './DocumentLibraryTabs.module.css';\n\nconst tabTypeMap: Map<DocumentLibraryType, string> = new Map([\n [ 'forms', 'FORMS' ],\n [ 'legal', 'LEGAL' ],\n [ 'education', 'EDUCATION' ],\n]);\n\nfunction DocumentLibraryTabs() {\n const documentLibraryTabs = [ 'forms', 'legal', 'education', 'videos' ] as DocumentLibraryType[];\n const { tab } = useParams<{tab?: DocumentLibraryType;}>();\n const [ activeTab, setActiveTab ] = useState<DocumentLibraryType>(tab ?? documentLibraryTabs[0]);\n\n function onChangeTab(e: ChangeEvent<{}>, newTab: DocumentLibraryType) {\n if (newTab !== activeTab) {\n setActiveTab(newTab);\n }\n }\n\n return (\n <div className=\"w-full\">\n <Tabs\n indicatorColor=\"primary\"\n textColor=\"primary\"\n className=\"mb-4\"\n value={activeTab}\n onChange={onChangeTab}\n classes={ { flexContainer: styles.tabsBottomBoder } }\n >\n {\n documentLibraryTabs.map((type) => (\n <Tab value={type} label={tabTypeMap.get(type)} key={`${type}-tab`} className=\"min-w-0 max-w-none\" />\n ))\n }\n </Tabs>\n <DocumentLibraryTabPanels\n documentLibraryTypes={documentLibraryTabs}\n activeTab={activeTab}\n />\n </div>\n );\n}\n\nexport default DocumentLibraryTabs;\n","import DocumentLibraryTabs from './DocumentLibraryTabs';\n\nfunction DocumentLibrary() {\n return (\n <div className=\"w-full flex flex-col p-4\">\n <h2 className=\"page-title\">Document Library</h2>\n <div className=\"w-full flex\">\n <DocumentLibraryTabs />\n </div>\n </div>\n );\n}\n\nexport default DocumentLibrary;\n","import * as yup from 'yup';\n\nexport const validationSchema = yup.object({\n cddid: yup\n .string()\n .required(),\n});\n","import React, { ReactElement, useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport Button from '@mui/material/Button';\nimport { compose } from 'redux';\nimport dayjs from 'dayjs';\nimport { useFormik } from 'formik';\nimport { isNil } from 'ramda';\n\nimport { Debit } from './direct-debit.types';\nimport withModal from 'components/shared/HOC/WithModal';\nimport { validationSchema } from './perform-direct-debit.validators';\nimport { performDirectDebit } from 'shared/api/directDebitApi';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { addHttpErrorNotification } from 'notifications/notifications.slice';\nimport { currencyFormatter } from 'shared/utils';\nimport withLoopIcon from 'components/shared/HOC/WithLoopIcon';\nimport DirectDebitAccountSelect from 'components/shared/DirectDebitAccountSelect';\nimport store from 'store';\nimport {\n selectDirectDebitAccounts,\n selectFetchDirectDebitAccountStatus,\n} from 'store/slices/direct-debit/direct-debit.slice';\nimport { fetchDirectDebitAccount } from 'store/slices/direct-debit/direct-debit.thunk';\n\nfunction formatDate(date?: string): string {\n return date ? dayjs(date).format('MM/DD/YYYY') : '';\n}\n\ninterface DirectDebitConfirmationProps {\n debit?: Debit;\n onCancel: () => void;\n}\n\nfunction DirectDebitConfirmation({\n onCancel,\n debit,\n}: DirectDebitConfirmationProps): ReactElement {\n const dispatch = useDispatch<typeof store.dispatch>();\n const [ paying, setPaying ] = useState(false);\n const { compid: companyId } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const handleError = compose(\n onCancel,\n dispatch,\n addHttpErrorNotification,\n );\n const directDebitAccounts = useSelector(selectDirectDebitAccounts);\n const directDebitFetchStatus = useSelector(selectFetchDirectDebitAccountStatus);\n useEffect(() => {\n if (directDebitFetchStatus === 'uninitialized') {\n dispatch(fetchDirectDebitAccount());\n }\n }, [ dispatch, directDebitFetchStatus ]);\n const form = useFormik({\n initialValues: {\n cddid: '',\n },\n validationSchema,\n onSubmit: (values) => {\n if (debit) {\n setPaying(true);\n performDirectDebit(companyId, { ...debit, cddid: parseInt(values.cddid) })\n .catch(handleError);\n debit.status = 'In Progress';\n setPaying(false);\n onCancel();\n }\n },\n });\n\n function getCddComment(id: string): string {\n if (directDebitAccounts !== null && directDebitAccounts.length > 0) {\n return directDebitAccounts.find(i => i.cddid === parseInt(id))?.cddcomment ?? '';\n }\n\n return '';\n }\n\n const prompt = `Confirm in order to perform a direct debit from ${getCddComment(form.values.cddid)} for\n the ${formatDate(debit?.paydate)} pay date for a total of ${currencyFormatter.format(debit?.amount ?? 0)}.`;\n\n const DirectDebitAccountSelectWithLoading = withLoopIcon(\n DirectDebitAccountSelect,\n 'Loading accounts...',\n directDebitAccounts === null,\n );\n\n function handleChange(val: string) {\n form.setFieldValue('cddid', val);\n }\n\n return (\n <div>\n <p className=\"py-5\" data-testid=\"direct-debit-confirmation-modal-prompt\">\n {prompt}\n </p>\n <form onSubmit={form.handleSubmit} className=\"mt-4\">\n <DirectDebitAccountSelectWithLoading\n isRequired\n label=\"Account to Perform Debit\"\n accounts={directDebitAccounts}\n name=\"cddid\"\n value={form.values.cddid.toString()}\n error={form.touched.cddid && !!form.errors.cddid}\n onAccountChanged={handleChange}\n />\n <div className=\"flex justify-end mt-4\">\n <Button\n data-testid=\"direct-debit-confirmation-modal-cancel\"\n onClick={onCancel}\n variant=\"text\"\n >\n Cancel\n </Button>\n <Button\n data-testid=\"direct-debit-confirmation-modal-confirm\"\n variant=\"contained\"\n color=\"primary\"\n className={`ml-2 ${paying && 'animate-ping'}`}\n type=\"submit\"\n disabled={isNil(debit) || !form.values.cddid || paying}\n >\n Perform Direct Debit\n </Button>\n </div>\n </form>\n </div>\n );\n}\n\nexport const DirectDebitConfirmationModal = withModal(DirectDebitConfirmation);\n\nexport default DirectDebitConfirmation;\n","import request from '../api-request';\nimport { Debit, PostDirectDebit } from 'direct-debit/direct-debit.types';\n\nexport function getDirectDebits(companyId: number) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot get direct debits for invalid company.'));\n }\n\n const uri = `/api/companies/${companyId}/direct-debit`;\n\n return request<Debit[]>(uri);\n}\n\nexport function performDirectDebit(companyId: number, body: PostDirectDebit) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot perform direct debit for an invalid company.'));\n }\n\n if (body.cddid <= 0) {\n return Promise.reject(new Error('Cannot perform direct debit for an invalid cdd number.'));\n }\n\n const uri = `/api/companies/${companyId}/direct-debit`;\n\n return request(uri, { method: 'POST', body });\n}\n","import { ReactElement, useState } from 'react';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport Button from '@mui/material/Button';\nimport CreditCardIcon from '@mui/icons-material/CreditCard';\nimport dayjs from 'dayjs';\n\nimport { Debit } from './direct-debit.types';\nimport { currencyFormatter } from 'shared/utils';\nimport { DirectDebitConfirmationModal } from './DirectDebitConfirmation';\nimport { compose, F, isNil, T } from 'ramda';\n\ninterface DirectDebitRowProps {\n debit: Debit;\n dateFormat?: string;\n}\n\nfunction DirectDebitRow({\n debit,\n dateFormat = 'MM/DD/YYYY',\n}: DirectDebitRowProps): ReactElement {\n const [ isOpen, setIsOpen ] = useState(false);\n\n function formatDate(date?: string): string {\n return date ? dayjs(date).format(dateFormat) : '';\n }\n\n return (\n <TableRow>\n <TableCell className=\"text-sm\">{formatDate(debit.paydate)}</TableCell>\n <TableCell className=\"text-sm\">{debit.frequencies}</TableCell>\n <TableCell className=\"text-sm\">{ isNil(debit.amount) ? '' : currencyFormatter.format(debit.amount) }</TableCell>\n <TableCell className=\"text-sm\">{debit.status}</TableCell>\n {\n debit.status === '' && debit.isPayable && debit.amount > 0\n ?\n <TableCell>\n <CreditCardIcon />\n <Button\n color=\"primary\"\n onClick={compose(setIsOpen, T)}\n className=\"text-sm perform-debit\"\n >\n Perform Debit\n </Button>\n </TableCell>\n : <TableCell />\n }\n <DirectDebitConfirmationModal\n debit={debit}\n title=\"Confirm Perform Debit\"\n isOpen={isOpen}\n onClose={compose(setIsOpen, F)}\n onCancel={compose(setIsOpen, F)}\n />\n </TableRow>\n );\n}\n\nexport default DirectDebitRow;\n","import { ReactElement, useState } from 'react';\nimport Table from '@mui/material/Table';\nimport TableCell from '@mui/material/TableCell';\nimport TableRow from '@mui/material/TableRow';\nimport TableHead from '@mui/material/TableHead';\nimport TableBody from '@mui/material/TableBody';\nimport TableFooter from '@mui/material/TableFooter';\nimport TablePagination from '@mui/material/TablePagination';\nimport { compose, nthArg } from 'ramda';\n\nimport DirectDebitRow from './DirectDebitRow';\nimport { Debit } from './direct-debit.types';\n\ninterface DirectDebitProps {\n debits: Debit[];\n}\n\nfunction DirectDebitTable({ debits }: DirectDebitProps): ReactElement {\n const [ page, setPage ] = useState(0);\n\n return (\n <form className=\"mt-4 w-full\">\n <div className=\"w-full\">\n <Table className=\"w-full\">\n <TableHead>\n <TableRow>\n <TableCell className=\"text-sm\">Pay Date</TableCell>\n <TableCell className=\"text-sm\">Pay Frequency</TableCell>\n <TableCell className=\"text-sm\">Amount</TableCell>\n <TableCell className=\"text-sm\">Status</TableCell>\n <TableCell className=\"text-sm\">Action</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {\n debits.length > 0\n ? debits\n .slice(page * 10, page * 10 + 10)\n .map((d) => (\n <DirectDebitRow\n debit={d}\n key={d.unqid}\n />\n ))\n : <TableRow><TableCell colSpan={4}><p>No direct debits to display.</p></TableCell></TableRow>\n }\n </TableBody>\n <TableFooter>\n <TableRow>\n <TablePagination\n rowsPerPage={10}\n rowsPerPageOptions={[ 10 ]}\n colSpan={7}\n count={debits.length}\n page={page}\n onPageChange={compose(setPage, nthArg(1))}\n SelectProps={ { native: true } }\n />\n </TableRow>\n </TableFooter>\n </Table>\n </div>\n </form>\n );\n}\n\nexport default DirectDebitTable;\n","import { useState, useRef, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { compose, tap, always } from 'ramda';\n\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { Debit } from '../direct-debit.types';\nimport { getDirectDebits } from 'shared/api/directDebitApi';\nimport { selectSelectedCompany } from 'companies/companies.slice';\n\nexport function useDirectDebits() {\n const errorNotifier = useErrorNotifier();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const [ debits, setDebits ] = useState<Debit[] | null>(null);\n\n const [ setDefault ] = useState(() => compose(setDebits, always(null)));\n const [ handleError ] = useState(() => compose(tap(setDefault), errorNotifier));\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n if (compid > 0) {\n setDebits(null);\n getDirectDebits(compid)\n .then((result) => {\n if (mountedRef.current) {\n setDebits(result ?? []);\n }\n })\n .catch((err) => {\n if (mountedRef.current) {\n handleError(err);\n }\n });\n }\n\n return () => {\n mountedRef.current = false;\n };\n }, [ handleError, compid ]);\n\n return debits;\n}\n","import PageContentPaper from 'components/layout/PageContentPaper';\n\nimport DirectDebitTable from './DirectDebitTable';\nimport { useDirectDebits } from './hooks/useDirectDebits';\nimport Loading from 'components/shared/Loading';\n\nfunction DirectDebit(): React.ReactElement {\n const directDebits = useDirectDebits();\n\n return (\n <div className=\"w-full flex flex-col p-4\">\n <h2 className=\"page-title\">Authorize Direct Debit</h2>\n <PageContentPaper className=\"flex flex-col\">\n <div className=\"w-full flex\">\n {\n directDebits !== null\n ? <DirectDebitTable debits={directDebits} />\n : <Loading text=\"Loading Direct Debit...\" />\n }\n </div>\n </PageContentPaper>\n </div>\n );\n}\n\nexport default DirectDebit;\n","import PersonOutlineIcon from '@mui/icons-material/PersonOutline';\nimport DescriptionIcon from '@mui/icons-material/Description';\n\nimport { WizardStep } from 'components/shared/WizardStepper';\n\nexport type AddUserStepSlug = 'step-1' | 'step-2';\n\nconst wizardSteps: Map<AddUserStepSlug, WizardStep> = new Map([\n [\n 'step-1',\n {\n label: 'Step 1',\n icon: PersonOutlineIcon,\n slug: 'step-1',\n next: 'step-2',\n },\n ],\n [\n 'step-2',\n {\n label: 'Step 2',\n icon: DescriptionIcon,\n slug: 'step-2',\n prev: 'step-1',\n },\n ],\n]);\n\nexport default wizardSteps;\n","import * as yup from 'yup';\n\nimport { requiredText } from 'shared/common-validators';\n\nexport const validationSchema = yup.object({\n confname: yup\n .string()\n .trim()\n .max(15, 'First name must be 15 characters or less')\n .required('First name is required'),\n conlname: yup\n .string()\n .trim()\n .max(20, 'Last name must be 20 characters or less')\n .required('Last name is required'),\n conaddr1: yup\n .string()\n .trim()\n .max(30, 'Street address line 1 must be 30 characters or less')\n .nullable()\n .required(requiredText),\n conaddr2: yup\n .string()\n .max(30, 'Street address line 2 must be 30 characters or less')\n .nullable(),\n concity: yup\n .string()\n .trim()\n .matches(/^[a-zA-Z\\s]+$/, 'City must only include letters and spaces')\n .max(20, 'City must be 20 characters or less')\n .nullable()\n .required(requiredText),\n constate: yup\n .string()\n .trim()\n .nullable()\n .required(requiredText),\n conzip: yup\n .string()\n .trim()\n .matches(/^[\\d-]+$/, 'Zip must only include numbers and hyphens')\n .max(10, 'Zip must be 10 characters or less')\n .nullable()\n .required(requiredText),\n conphone: yup\n .string()\n .max(17, 'Phone must be 17 characters or less')\n .test('digits', 'Must be at least 10 digits',\n (phone) => !phone || phone.replace(/[A-Za-z$-.]/g, '').length >= 10)\n .required(requiredText),\n conemail: yup\n .string()\n .email()\n .max(50, 'Email must be 50 characters or less')\n .nullable()\n .required(requiredText),\n confax: yup\n .string()\n .max(17, 'Fax must be 17 characters or less')\n .test(\n 'fax-empty-or-10-chars-check',\n 'Fax must be at least 10 characters',\n (phone) => !phone || phone.length >= 10,\n )\n .nullable(),\n contitle: yup\n .string()\n .max(30, 'Street address line 2 must be 30 characters or less')\n .nullable(),\n condept: yup\n .string()\n .max(30, 'Street address line 2 must be 30 characters or less')\n .nullable(),\n});\n","import React, { ReactElement } from 'react';\nimport { useFormikContext } from 'formik';\nimport TextField from '@mui/material/TextField';\n\nimport StateSelect from 'components/shared/StateSelect';\nimport { Contact } from 'manage-settings/contact-info/contact.types';\n\nfunction ContactDetails(): ReactElement {\n const form = useFormikContext<Partial<Contact>>();\n\n function handleCustomFieldChange(field: string) {\n return (value: string) => form.setFieldValue(field, value);\n }\n\n return (\n <>\n <div className=\"flex flex-row space-x-4\">\n <TextField\n variant=\"outlined\"\n label=\"First name\"\n name=\"confname\"\n value={form.values.confname ?? ''}\n error={form.touched.confname && !!form.errors.confname}\n helperText={form.touched.confname && form.errors.confname}\n onChange={form.handleChange('confname')}\n fullWidth\n data-testid=\"firstName\"\n />\n <TextField\n variant=\"outlined\"\n label=\"Last name\"\n name=\"conlname\"\n value={form.values.conlname ?? ''}\n error={form.touched.conlname && !!form.errors.conlname}\n helperText={form.touched.conlname && form.errors.conlname}\n onChange={form.handleChange('conlname')}\n fullWidth\n data-testid=\"lastName\"\n />\n </div>\n <div className=\"flex flex-row space-x-4\">\n <TextField\n variant=\"outlined\"\n label=\"Title (Optional)\"\n name=\"contitle\"\n value={form.values.contitle ?? ''}\n error={form.touched.contitle && !!form.errors.contitle}\n helperText={form.touched.contitle && form.errors.contitle}\n onChange={form.handleChange('contitle')}\n fullWidth\n data-testid=\"title\"\n />\n <TextField\n variant=\"outlined\"\n label=\"Department (Optional)\"\n name=\"condept\"\n value={form.values.condept ?? ''}\n error={form.touched.condept && !!form.errors.condept}\n helperText={form.touched.condept && form.errors.condept}\n onChange={form.handleChange('condept')}\n fullWidth\n data-testid=\"department\"\n />\n </div>\n <div className=\"flex flex-row space-x-4\">\n <TextField\n variant=\"outlined\"\n name=\"email\"\n label=\"Email Address\"\n value={form.values.conemail ?? ''}\n error={form.touched.conemail && !!form.errors.conemail}\n helperText={form.touched.conemail && form.errors.conemail}\n onChange={form.handleChange('conemail')}\n fullWidth\n data-testid=\"email\"\n />\n <div className=\"flex flex-row space-x-4\">\n <TextField\n variant=\"outlined\"\n name=\"conphone\"\n label=\"Phone\"\n value={form.values.conphone ?? ''}\n error={form.touched.conphone && !!form.errors.conphone}\n helperText={form.touched.conphone && form.errors.conphone}\n onChange={form.handleChange('conphone')}\n fullWidth\n data-testid=\"phone\"\n />\n <TextField\n variant=\"outlined\"\n name=\"confax\"\n label=\"Fax (Optional)\"\n value={form.values.confax ?? ''}\n error={form.touched.confax && !!form.errors.confax}\n helperText={form.touched.confax && form.errors.confax}\n onChange={form.handleChange('confax')}\n fullWidth\n data-testid=\"phone\"\n />\n </div>\n </div>\n <div className=\"flex flex-row space-x-4\">\n <TextField\n variant=\"outlined\"\n label=\"Street Address\"\n name=\"conaddr1\"\n value={form.values.conaddr1 ?? ''}\n error={form.touched.conaddr1 && !!form.errors.conaddr1}\n helperText={form.touched.conaddr1 && form.errors.conaddr1}\n onChange={form.handleChange('conaddr1')}\n fullWidth\n data-testid=\"conaddr1\"\n />\n </div>\n <div className=\"flex flex-row space-x-4\">\n <TextField\n variant=\"outlined\"\n label=\"Street Address 2 (Optional)\"\n name=\"conaddr2\"\n value={form.values.conaddr2 ?? ''}\n error={form.touched.conaddr2 && !!form.errors.conaddr2}\n helperText={form.touched.conaddr2 && form.errors.conaddr2}\n onChange={form.handleChange('conaddr2')}\n fullWidth\n data-testid=\"conaddr2\"\n />\n </div>\n <div className=\"flex flex-row space-x-4\">\n <TextField\n variant=\"outlined\"\n name=\"concity\"\n label=\"City\"\n value={form.values.concity ?? ''}\n error={form.touched.concity && !!form.errors.concity}\n helperText={form.touched.concity && form.errors.concity}\n onChange={form.handleChange('concity')}\n className=\"w-1/2\"\n data-testid=\"city\"\n />\n\n <div className=\"w-1/4\" data-testid=\"state\">\n <StateSelect\n onStateChanged={handleCustomFieldChange('constate')}\n name=\"constate\"\n label=\"State\"\n value={form.values.constate ?? undefined}\n variant=\"outlined\"\n error={form.touched.constate && !!form.errors.constate}\n />\n </div>\n\n <TextField\n variant=\"outlined\"\n name=\"conzip\"\n label=\"Zip\"\n value={form.values.conzip ?? ''}\n error={form.touched.conzip && !!form.errors.conzip}\n helperText={form.touched.conzip && form.errors.conzip}\n onChange={form.handleChange('conzip')}\n className=\"w-1/4\"\n data-testid=\"zip\"\n />\n </div>\n </>\n );\n}\n\nexport default ContactDetails;\n","import { FormikProvider, useFormik } from 'formik';\nimport { useHistory } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport Button from '@mui/material/Button';\nimport { mergeDeepLeft } from 'ramda';\n\nimport { defaultContact } from 'shared/constants';\nimport { validationSchema } from './add-user-details.validators';\nimport React from 'react';\nimport { Contact } from '../contact-info/contact.types';\nimport ContactDetails from 'components/shared/ContactDetails';\nimport { selectSelectedUser, setSelectedUser } from 'manage-settings/manage-users/manage-users.slice';\nimport store from 'store';\n\ninterface Props {\n onCancel: () => void;\n}\n\nfunction AddUserStepOne(\n { onCancel }: Props,\n) {\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n const selectedUser = useSelector(selectSelectedUser);\n const form = useFormik<Partial<Contact>>({\n enableReinitialize: true,\n initialValues: {\n ...defaultContact,\n ...selectedUser,\n },\n validationSchema,\n onSubmit: (values) => {\n dispatch(setSelectedUser(mergeDeepLeft(values, selectedUser ?? {}) as any));\n history.push(`/${selectedUser?.conid ? 'edit' : 'add'}-user/step-2`);\n },\n });\n\n return (\n <>\n <h6>{`${selectedUser?.conid ? 'Edit' : 'Add'} User`}</h6>\n <p>Enter contact information in the form below for the individual being added as an administrative user.</p>\n <form className=\"mt-10\" onSubmit={form.handleSubmit}>\n <div className=\"flex flex-col space-y-4\">\n <FormikProvider value={form}>\n <ContactDetails />\n </FormikProvider>\n\n <div className=\"pt-10 flex flex-row-reverse\">\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"submit\"\n data-testid=\"add-user-next-step\"\n className=\"ml-4\"\n >\n Next Step\n </Button>\n <Button\n onClick={onCancel}\n >\n Cancel\n </Button>\n </div>\n </div>\n </form>\n </>\n );\n}\n\nexport default AddUserStepOne;\n","import React, { useState } from 'react';\nimport Button from '@mui/material/Button';\nimport { useSelector } from 'react-redux';\nimport Chip from '@mui/material/Chip';\nimport {\n always, compose, includes, ifElse, lensPath, set,\n without, view, append, pipe, when, length, equals, both,\n} from 'ramda';\n\nimport {\n selectLocations,\n selectPayFrequencies,\n selectPermissions,\n selectResponsibilities, selectSelectedUser,\n} from '../manage-users/manage-users.slice';\n\ninterface Props {\n onCancel: () => void;\n onSubmit: (selections: any) => void;\n}\n\ntype Path = 'locations' | 'payFrequencies' | 'responsibilities' | 'permissions';\n\nfunction AddUserStepTwo ({ onCancel, onSubmit }: Props) {\n const locations = useSelector(selectLocations);\n const payFrequencies = useSelector(selectPayFrequencies);\n const permissions = useSelector(selectPermissions);\n const responsibilities = useSelector(selectResponsibilities);\n const selectedUser = useSelector(selectSelectedUser);\n\n const [ selections, setSelections ] = useState({\n locations: selectedUser?.locations.length ? selectedUser.locations : [ -1 ],\n payFrequencies: selectedUser?.payFrequencies ? selectedUser.payFrequencies : [ '!' ],\n responsibilities: selectedUser?.responsibilities ? selectedUser.responsibilities : [ -1 ],\n permissions: selectedUser?.permissions ? selectedUser.permissions : [ -1 ],\n });\n\n function selectAll(path: Path) {\n return () => {\n const lens = lensPath([ path ]);\n const val = view(lens, selections);\n const allSelectedIdentifier = path === 'payFrequencies' ? '!' : -1;\n let newVal = val.includes(allSelectedIdentifier) ? [] : [ allSelectedIdentifier ];\n\n if (path === 'locations') {\n newVal = [ allSelectedIdentifier ];\n }\n const newSelections = set(lens, newVal, selections);\n setSelections(newSelections);\n };\n }\n\n function selectOne(path: Path) {\n return (id: string | number) => {\n const lens = lensPath([ path ]);\n const allSelectedIdentifier = path === 'payFrequencies' ? '!' : -1;\n const modified = pipe(\n ifElse(\n includes(id),\n without([ id ]),\n pipe(\n append(id),\n without([ allSelectedIdentifier ]),\n ),\n ),\n when(\n both(\n compose(equals('locations'), always(path)),\n compose(equals(0), length),\n ),\n always([ allSelectedIdentifier ]),\n ),\n )(view(lens, selections));\n const newSelections = set(lens, modified, selections);\n setSelections(newSelections);\n };\n }\n\n return (\n <>\n <h6>{`${selectedUser?.conid ? 'Edit' : 'Add'} User`}</h6>\n <p>\n Select the locations, pay frequencies, administrative responsibilities,\n and permissions in which the individual should have access.\n </p>\n <div className=\"mt-10\">\n <p className=\"pt-4 font-bold\">Select Locations</p>\n <div className=\"flex space-x-4 flex-wrap\">\n <Chip\n color={selections.locations.includes(-1) ? 'primary' : 'default'}\n variant={selections.locations.includes(-1) ? undefined : 'outlined'}\n className=\"mt-2 cursor-pointer\"\n onClick={selectAll('locations')}\n label=\"All\"\n data-testid=\"add-user-all-locations\"\n />\n {\n locations?.map(l => (\n <Chip\n key={`${l.loccode}`}\n color={selections.locations.includes(l.loccode) ? 'primary' : 'default'}\n variant={selections.locations.includes(l.loccode) ? undefined : 'outlined'}\n className=\"mt-2 cursor-pointer\"\n onClick={compose(selectOne('locations'), always(l.loccode))}\n label={l.location}\n />\n ))}\n </div>\n </div>\n <div>\n <p className=\"pt-4 font-bold\">Select Pay Frequencies (Optional)</p>\n <div className=\"flex space-x-4 flex-wrap\">\n <Chip\n color={selections.payFrequencies.includes('!') ? 'primary' : 'default'}\n variant={selections.payFrequencies.includes('!') ? undefined : 'outlined'}\n className=\"mt-2 cursor-pointer\"\n onClick={selectAll('payFrequencies')}\n label=\"All\"\n data-testid=\"add-user-all-payFrequencies\"\n />\n {payFrequencies?.map(pf => (\n <Chip\n key={pf.pfqid}\n color={selections.payFrequencies.includes(pf.pfqid) ? 'primary' : 'default'}\n variant={selections.payFrequencies.includes(pf.pfqid) ? undefined : 'outlined'}\n className=\"mt-2 cursor-pointer\"\n onClick={compose(selectOne('payFrequencies'), always(pf.pfqid))}\n label={pf.pfqdesc}\n />\n ))}\n </div>\n </div>\n <div>\n <p className=\"pt-4 font-bold\">Select Responsibilities (Optional)</p>\n <div className=\"flex space-x-4 flex-wrap\">\n <Chip\n color={selections.responsibilities.includes(-1) ? 'primary' : 'default'}\n variant={selections.responsibilities.includes(-1) ? undefined : 'outlined'}\n className=\"mt-2 cursor-pointer\"\n onClick={selectAll('responsibilities')}\n label=\"All\"\n data-testid=\"add-user-all-responsibilities\"\n />\n {responsibilities?.map(r => (\n <Chip\n key={`${r.ctpid}`}\n color={selections.responsibilities.includes(r.ctpid) ? 'primary' : 'default'}\n variant={selections.responsibilities.includes(r.ctpid) ? undefined : 'outlined'}\n className=\"mt-2 cursor-pointer\"\n onClick={compose(selectOne('responsibilities'), always(r.ctpid))}\n label={r.description}\n />\n ))}\n </div>\n {\n selections.responsibilities.length === 0\n ? <small className=\"text-low-em\">Please select at least one responsibility.</small>\n : <></>\n }\n </div>\n <div>\n <p className=\"pt-4 font-bold\">Select Dash Employer Portal Permissions (Optional)</p>\n <div className=\"flex space-x-4 flex-wrap\">\n <Chip\n color={selections.permissions.includes(-1) ? 'primary' : 'default'}\n variant={selections.permissions.includes(-1) ? undefined : 'outlined'}\n className=\"mt-2 cursor-pointer\"\n onClick={selectAll('permissions')}\n label=\"All\"\n data-testid=\"add-user-all-permissions\"\n />\n {permissions?.map(p => (\n <Chip\n key={`${p.prmid}`}\n color={selections.permissions.includes(p.prmid) ? 'primary' : 'default'}\n variant={selections.permissions.includes(p.prmid) ? undefined : 'outlined'}\n className=\"mt-2 cursor-pointer\"\n onClick={compose(selectOne('permissions'), always(p.prmid))}\n label={p.prmdesc}\n />\n ))}\n </div>\n </div>\n <div className=\"pt-10 flex flex-row-reverse\">\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"button\"\n onClick={compose(onSubmit, always(selections))}\n data-testid=\"directBillingNextStep\"\n className=\"ml-4\"\n >\n Submit\n </Button>\n <Button\n onClick={onCancel}\n >\n Cancel\n </Button>\n </div>\n </>\n );\n}\n\nexport default AddUserStepTwo;\n","import { ReactElement, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { always, compose, F, T, tap, cond, equals, mergeDeepRight } from 'ramda';\n\nimport WizardStepper, { WizardStep } from 'components/shared/WizardStepper';\nimport wizardSteps, { AddUserStepSlug } from './add-user-steps';\nimport { noop } from 'shared/utils';\nimport { useHistoryBlock } from 'shared/custom-hooks/useHistoryBlock';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport CancelModal from 'components/shared/CancelModal';\nimport AddUserStepOne from './AddUserStepOne';\nimport AddUserStepTwo from './AddUserStepTwo';\nimport { saveUser } from 'shared/api/usersApi';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { ContactUser } from 'manage-settings/manage-users/manage-users.types';\nimport Loading from 'components/shared/Loading';\nimport {\n selectSelectedUser,\n setSelectedUser,\n resetSelectedUser,\n} from 'manage-settings/manage-users/manage-users.slice';\nimport store from 'store';\n\nfunction AddUser(): ReactElement {\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n const {\n stepSlug: activeStepSlug,\n } = useParams<{ stepSlug: AddUserStepSlug; }>();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const selectedUser = useSelector(selectSelectedUser);\n\n const [ blockRegex ] = useState(/^\\/(add|edit)-user/);\n const navUnblock = useHistoryBlock(blockRegex);\n\n const [ modalOpen, setModalOpen ] = useState(false);\n const showModal = compose(setModalOpen, T);\n const hideModal = compose(setModalOpen, F);\n\n const [ saving, setSaving ] = useState(false);\n const startSaving = compose(setSaving, T);\n const doneSaving = compose(setSaving, F);\n const errorNotifier = useErrorNotifier();\n const handleApiError = compose(tap(doneSaving), errorNotifier);\n const handleApiSuccess = compose(tap(doneSaving), onExit);\n\n const goToManageUsers = compose(\n tap(compose(history.push, always('/manage-settings/manage-users'))),\n navUnblock ?? noop,\n hideModal,\n );\n\n function handleStepClick(clickedStep: WizardStep) {\n return history.push(`/add-user/${clickedStep.slug}`);\n }\n\n function onWizardCancel() {\n if (activeStepSlug !== wizardSteps.keys().next().value) {\n showModal();\n } else {\n onExit();\n }\n }\n\n function onExit() {\n dispatch(resetSelectedUser());\n goToManageUsers();\n }\n\n function onSubmit(values: ContactUser) {\n startSaving();\n const newUser = mergeDeepRight(selectedUser ?? {}, values) as ContactUser;\n dispatch(setSelectedUser(newUser));\n saveUser(compid, newUser)\n .then(handleApiSuccess)\n .catch(handleApiError);\n }\n\n const renderStep = cond<string, ReactElement>([\n [\n equals('step-1'),\n always(<AddUserStepOne onCancel={onWizardCancel} />),\n ],\n [\n equals('step-2'),\n always(<AddUserStepTwo onCancel={onWizardCancel} onSubmit={onSubmit} />),\n ],\n ]);\n\n return (\n <>\n <PageContentPaper className=\"mt-4 mb-8\">\n <div className=\"mb-8\">\n <WizardStepper\n steps={wizardSteps}\n allowClick\n onChange={handleStepClick}\n />\n </div>\n <div className=\"px-8\">\n {renderStep(activeStepSlug)}\n </div>\n </PageContentPaper>\n <CancelModal\n isOpen={modalOpen}\n onCancel={onExit}\n onClose={hideModal}\n />\n {saving && <Loading text=\"Saving user\" />}\n </>\n );\n}\n\nexport default AddUser;\n","import LinearProgress from '@mui/material/LinearProgress';\nimport { Theme } from '@mui/material/styles';\n\nimport withStyles from '@mui/styles/withStyles';\nimport createStyles from '@mui/styles/createStyles';\n\nexport const BorderLinearProgress = withStyles((theme: Theme) => createStyles({\n root: {\n height: 10,\n },\n colorPrimary: {\n backgroundColor: theme.palette.grey[200],\n },\n bar: {\n borderRadius: 5,\n backgroundColor: '#19D759',\n },\n}),\n)(LinearProgress);\n","import dayjs from 'dayjs';\nimport Avatar from '@mui/material/Avatar';\nimport Paper from '@mui/material/Paper';\n\nimport { BorderLinearProgress } from 'components/shared/BorderLinearProgress';\n\ninterface Props {\n icon: JSX.Element;\n planYearStart: string;\n planYearEnd: string;\n title: string;\n buttons: JSX.Element;\n progress: number;\n}\n\nexport function ChecklistCard ({\n icon,\n planYearStart,\n planYearEnd,\n title,\n buttons,\n progress,\n}: Props) {\n return (\n <Paper className=\"mt-4\">\n <div className=\"w-full flex flex-row\">\n <div className=\"w-32 flex justify-center pt-4\">\n <Avatar className=\"bg-primary-main\" style={ { width: 50, height: 50 } }>\n { icon }\n </Avatar>\n </div>\n <div className=\"w-full flex flex-col\">\n <small className=\"pt-4\">\n {`${\n dayjs(planYearStart).format('MM/DD/YYYY')\n } - ${\n dayjs(planYearEnd).format('MM/DD/YYYY')\n }`}\n </small>\n <h5>{ title }</h5>\n <div className=\"w-full flex pr-8 my-6\">\n { buttons }\n </div>\n </div>\n </div>\n <div className=\"w-full\">\n <BorderLinearProgress variant=\"determinate\" value={progress} />\n </div>\n </Paper>\n );\n}\n","import { useHistory } from 'react-router-dom';\nimport BeachAccessRounded from '@mui/icons-material/BeachAccessRounded';\nimport { useSelector } from 'react-redux';\nimport Button from '@mui/material/Button';\nimport { ReEnrollmentChecklistPlan } from 're-enrollment-checklist/re-enrollment-checklist.types';\nimport { ChecklistCard } from 're-enrollment-checklist/ChecklistCard';\nimport { selectCobraPlan, selectCobraOeProgress } from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport { compose, always, equals, all } from 'ramda';\n\nexport function CobraOePacketCard ({ plan }: { plan: ReEnrollmentChecklistPlan; }) {\n const history = useHistory();\n const progress = useSelector(selectCobraOeProgress);\n const {\n coverLetterSectionComplete,\n oePacketsSectionComplete,\n } = useSelector(selectCobraPlan);\n\n const summaryDisabled = !all(\n equals(true),\n [\n coverLetterSectionComplete,\n oePacketsSectionComplete,\n ],\n );\n\n const icon = <BeachAccessRounded style={ { fontSize: 32 } } />;\n const buttons = (\n <>\n <Button\n variant=\"outlined\"\n className=\"mr-5\"\n onClick={\n compose(\n history.push,\n always(`/reenrollment-checklist/cobra/${plan.planYearId}/cover-letter-info`),\n )\n }\n >Cover Letter\n </Button>\n <Button\n variant=\"outlined\"\n className=\"mr-5\"\n onClick={\n compose(\n history.push,\n always(`/reenrollment-checklist/cobra/${plan.planYearId}/oe-packets`),\n )\n }\n disabled={!coverLetterSectionComplete}\n >OE Packet\n </Button>\n <Button\n variant=\"outlined\"\n disabled={summaryDisabled}\n onClick={\n compose(\n history.push,\n always(`/reenrollment-checklist/cobra/${plan.planYearId}/summary`),\n )\n }\n >Summary\n </Button>\n </>\n );\n\n return (\n <ChecklistCard\n icon={icon}\n title=\"COBRA Open Enrollment Packets\"\n planYearStart={plan.planYearStart}\n planYearEnd={plan.planYearEnd}\n buttons={buttons}\n progress={progress}\n />\n );\n}\n","import BeachAccessRounded from '@mui/icons-material/BeachAccessRounded';\nimport Button from '@mui/material/Button';\nimport { useHistory } from 'react-router-dom';\nimport { always, compose } from 'ramda';\n\nimport { ReEnrollmentChecklistPlan } from 're-enrollment-checklist/re-enrollment-checklist.types';\nimport { ChecklistCard } from 're-enrollment-checklist/ChecklistCard';\nimport { useSelector } from 'react-redux';\nimport {\n selectCobraChecklistProgress,\n selectIsFinalizeCobraChecklistDisabled,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\n\nexport function CobraPlanCard ({ plan }: { plan: ReEnrollmentChecklistPlan; }) {\n const icon = <BeachAccessRounded style={ { fontSize: 32 } } />;\n const history = useHistory();\n const summaryDisabled = useSelector(selectIsFinalizeCobraChecklistDisabled);\n const percentComplete = useSelector(selectCobraChecklistProgress);\n const buttons = (\n <div className=\"justify-start\" data-testid=\"cobra-card-buttons\">\n <Button\n variant=\"outlined\"\n className=\"mr-5\"\n onClick={compose(\n history.push,\n always(`/reenrollment-checklist/cobra-plan/${plan.planYearId}/eligible-count`),\n )}\n >Eligible Count\n </Button>\n <Button\n variant=\"outlined\"\n className=\"mr-5\"\n onClick={compose(\n history.push,\n always(`/reenrollment-checklist/cobra-plan/${plan.planYearId}/oe-packets-options`),\n )}\n >OE Packets\n </Button>\n <Button\n variant=\"outlined\"\n className=\"mr-5\"\n onClick={compose(\n history.push,\n always(`/reenrollment-checklist/cobra-plan/${plan.planYearId}/plan-rates`),\n )}\n >Plan Rates\n </Button>\n <Button\n variant=\"outlined\"\n onClick={compose(\n history.push,\n always(`/reenrollment-checklist/cobra-plan/${plan.planYearId}/summary`),\n )}\n disabled={summaryDisabled}\n >Summary\n </Button>\n </div>\n );\n\n return (\n <ChecklistCard\n icon={icon}\n title=\"COBRA\"\n planYearStart={plan.planYearStart}\n planYearEnd={plan.planYearEnd}\n buttons={buttons}\n progress={percentComplete}\n />\n );\n}\n","export default function setLegacyChecklistCompletionProgress(isComplete: boolean) {\n return isComplete ? 100 : 0;\n}\n","import SavingsRoundedIcon from '@mui/icons-material/SavingsRounded';\nimport Button from '@mui/material/Button';\nimport { useHistory } from 'react-router-dom';\nimport { always, compose } from 'ramda';\nimport { ReEnrollmentChecklistPlan } from 're-enrollment-checklist/re-enrollment-checklist.types';\nimport { ChecklistCard } from 're-enrollment-checklist/ChecklistCard';\nimport setLegacyChecklistCompletionProgress from 'shared/utils/set-legacy-checklist-completion-progress';\n\nfunction HsaPlanCard ({ plan }: { plan: ReEnrollmentChecklistPlan; }) {\n const icon = <SavingsRoundedIcon style={ { fontSize: 32 } } />;\n const history = useHistory();\n const buttons = (\n <div className=\"justify-start\" data-testid=\"hsa-plan-buttons\">\n <Button\n variant=\"outlined\"\n className=\"mr-5\"\n data-testid=\"hsa-link\"\n onClick={compose(\n history.push,\n always(`/reenrollment-checklist/hsa/${plan.planYearId}`),\n )}\n >Health Savings account\n </Button>\n </div>\n );\n\n return (\n <ChecklistCard\n icon={icon}\n title=\"Health Savings Account\"\n planYearStart={plan.planYearStart}\n planYearEnd={plan.planYearEnd}\n buttons={buttons}\n progress={setLegacyChecklistCompletionProgress(plan.legacyChecklistComplete)}\n />\n );\n}\n\nexport default HsaPlanCard;\n\n","import HealthAndSafety from '@mui/icons-material/HealthAndSafety';\nimport Button from '@mui/material/Button';\nimport { useHistory } from 'react-router-dom';\nimport { always, compose } from 'ramda';\nimport { ReEnrollmentChecklistPlan } from 're-enrollment-checklist/re-enrollment-checklist.types';\nimport { ChecklistCard } from 're-enrollment-checklist/ChecklistCard';\nimport { selectCustomPlanNames } from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport { useSelector } from 'react-redux';\nimport setLegacyChecklistCompletionProgress from 'shared/utils/set-legacy-checklist-completion-progress';\n\nfunction CustomPlanCard ({ plan }: { plan: ReEnrollmentChecklistPlan; }) {\n const icon = <HealthAndSafety style={ { fontSize: 32 } } />;\n const history = useHistory();\n const planNames = useSelector(selectCustomPlanNames);\n const buttons = (\n <div className=\"justify-start\" data-testid=\"custom-plan-buttons\">\n <Button\n variant=\"outlined\"\n className=\"mr-5\"\n data-testid=\"custom-link\"\n onClick={compose(\n history.push,\n always(`/reenrollment-checklist/custom/${plan.planYearId}`),\n )}\n >\n <div className=\"justify-start\">\n <div>Custom Reimbursement Plans</div>\n {planNames.map(planName => (\n <div>\n {planName}\n </div>\n ))}\n </div>\n </Button>\n </div>\n );\n\n return (\n <ChecklistCard\n icon={icon}\n title=\"Custom Account\"\n planYearStart={plan.planYearStart}\n planYearEnd={plan.planYearEnd}\n buttons={buttons}\n progress={setLegacyChecklistCompletionProgress(plan.legacyChecklistComplete)}\n />\n );\n}\n\nexport default CustomPlanCard;\n\n","import AddShoppingCartIcon from '@mui/icons-material/AddShoppingCart';\nimport Button from '@mui/material/Button';\nimport { useHistory } from 'react-router-dom';\nimport { always, compose } from 'ramda';\nimport { ReEnrollmentChecklistPlan } from 're-enrollment-checklist/re-enrollment-checklist.types';\nimport { ChecklistCard } from 're-enrollment-checklist/ChecklistCard';\nimport setLegacyChecklistCompletionProgress from 'shared/utils/set-legacy-checklist-completion-progress';\n\nfunction FsaPlanCard ({ plan }: { plan: ReEnrollmentChecklistPlan; }) {\n const icon = <AddShoppingCartIcon style={ { fontSize: 32 } } />;\n const history = useHistory();\n const buttons = (\n <div className=\"justify-start\" data-testid=\"fsa-plan-buttons\">\n <Button\n variant=\"outlined\"\n className=\"mr-5\"\n data-testid=\"fsa-link\"\n onClick={compose(\n history.push,\n always(`/reenrollment-checklist/fsa/${plan.planYearId}`),\n )}\n >\n <div className=\"justify-start\">\n <div>Flexible Spending Account</div>\n </div>\n </Button>\n </div>\n );\n\n return (\n <ChecklistCard\n icon={icon}\n title=\"Flexible Spending Account\"\n planYearStart={plan.planYearStart}\n planYearEnd={plan.planYearEnd}\n buttons={buttons}\n progress={setLegacyChecklistCompletionProgress(plan.legacyChecklistComplete)}\n />\n );\n}\n\nexport default FsaPlanCard;\n\n","export default __webpack_public_path__ + \"static/media/hra-round.ffae9cd2.svg\";","import { useHistory } from 'react-router-dom';\nimport { always, compose } from 'ramda';\nimport Button from '@mui/material/Button';\nimport CardMedia from '@mui/material/CardMedia';\nimport hraIcon from 'images/hra-round.svg';\nimport { ReEnrollmentChecklistPlan } from 're-enrollment-checklist/re-enrollment-checklist.types';\nimport { ChecklistCard } from 're-enrollment-checklist/ChecklistCard';\nimport setLegacyChecklistCompletionProgress from 'shared/utils/set-legacy-checklist-completion-progress';\n\nfunction HraPlanCard ({ plan }: { plan: ReEnrollmentChecklistPlan; }) {\n const icon = (\n <CardMedia\n component=\"img\"\n src={hraIcon}\n title=\"HRA\"\n />\n );\n\n const history = useHistory();\n const buttons = (\n <div className=\"justify-start\" data-testid=\"hra-plan-buttons\">\n <Button\n variant=\"outlined\"\n className=\"mr-5\"\n data-testid=\"hra-link\"\n onClick={compose(\n history.push,\n always(`/reenrollment-checklist/hra/${plan.planYearId}`),\n )}\n >\n <div className=\"justify-start\">\n <div>Health Reimbursement Account</div>\n </div>\n </Button>\n </div>\n );\n\n return (\n <ChecklistCard\n icon={icon}\n title=\"Health Reimbursement Account\"\n planYearStart={plan.planYearStart}\n planYearEnd={plan.planYearEnd}\n buttons={buttons}\n progress={setLegacyChecklistCompletionProgress(plan.legacyChecklistComplete)}\n />\n );\n}\n\nexport default HraPlanCard;\n\n","import DirectionsBusIcon from '@mui/icons-material/DirectionsBus';\nimport Button from '@mui/material/Button';\nimport { useHistory } from 'react-router-dom';\nimport { always, compose } from 'ramda';\nimport { ReEnrollmentChecklistPlan } from 're-enrollment-checklist/re-enrollment-checklist.types';\nimport { ChecklistCard } from 're-enrollment-checklist/ChecklistCard';\nimport setLegacyChecklistCompletionProgress from 'shared/utils/set-legacy-checklist-completion-progress';\n\nfunction QtePlanCard ({ plan }: { plan: ReEnrollmentChecklistPlan; }) {\n const icon = <DirectionsBusIcon style={ { fontSize: 32 } } />;\n const history = useHistory();\n const buttons = (\n <div className=\"justify-start\" data-testid=\"qte-plan-buttons\">\n <Button\n variant=\"outlined\"\n className=\"mr-5\"\n data-testid=\"qte-link\"\n onClick={compose(\n history.push,\n always(`/reenrollment-checklist/qte/${plan.planYearId}`),\n )}\n >\n <div className=\"justify-start\">\n <div>Commuter</div>\n </div>\n </Button>\n </div>\n );\n\n return (\n <ChecklistCard\n icon={icon}\n title=\"Commuter Account\"\n planYearStart={plan.planYearStart}\n planYearEnd={plan.planYearEnd}\n buttons={buttons}\n progress={setLegacyChecklistCompletionProgress(plan.legacyChecklistComplete)}\n />\n );\n}\n\nexport default QtePlanCard;\n\n","import React from 'react';\nimport WorkHistoryIcon from '@mui/icons-material/WorkHistory';\nimport Button from '@mui/material/Button';\nimport { always, compose } from 'ramda';\nimport { useHistory } from 'react-router-dom';\nimport { ChecklistCard } from 're-enrollment-checklist/ChecklistCard';\nimport { ReEnrollmentChecklistPlan } from 're-enrollment-checklist/re-enrollment-checklist.types';\nimport setLegacyChecklistCompletionProgress from 'shared/utils/set-legacy-checklist-completion-progress';\n\nfunction DirectBillPlanCard({ plan }: { plan: ReEnrollmentChecklistPlan; }) {\n const history = useHistory();\n\n const icon = <WorkHistoryIcon style={ { fontSize: 32 } } />;\n const buttons = (\n <div className=\"justify-start\">\n <Button\n variant=\"outlined\"\n className=\"mr-5\"\n data-testid=\"db-link\"\n onClick={compose(\n history.push,\n always(`/reenrollment-checklist/db/${plan.planYearId}`),\n )}\n >\n <div className=\"justify-start\">\n <div>Direct Bill Account</div>\n </div>\n </Button>\n </div>\n );\n\n return (\n <ChecklistCard\n icon={icon}\n title=\"Direct Billing Re-Enrollment Checklist\"\n planYearStart={plan.planYearStart}\n planYearEnd={plan.planYearEnd}\n buttons={buttons}\n progress={setLegacyChecklistCompletionProgress(plan.legacyChecklistComplete)}\n />\n );\n}\n\nexport default DirectBillPlanCard;\n","import Button from '@mui/material/Button';\nimport { useHistory } from 'react-router-dom';\nimport { always, compose } from 'ramda';\nimport { ReEnrollmentChecklistPlan } from 're-enrollment-checklist/re-enrollment-checklist.types';\nimport { ChecklistCard } from 're-enrollment-checklist/ChecklistCard';\nimport setLegacyChecklistCompletionProgress from 'shared/utils/set-legacy-checklist-completion-progress';\nimport BeachAccessRounded from '@mui/icons-material/BeachAccessRounded';\n\nfunction CobraLegacyPlanCard ({ plan }: Readonly<{plan: ReEnrollmentChecklistPlan;}>) {\n const icon = <BeachAccessRounded style={ { fontSize: 32 } } />;\n const history = useHistory();\n const buttons = (\n <div className=\"justify-start\" data-testid=\"cobra-legacy-buttons\">\n <Button\n variant=\"outlined\"\n className=\"mr-5\"\n data-testid=\"cobra-legacy-link\"\n onClick={compose(\n history.push,\n always(`/reenrollment-checklist/cobra/${plan.planYearId}`),\n )}\n >\n <div className=\"justify-start\">\n <div>COBRA Account</div>\n </div>\n </Button>\n </div>\n );\n\n return (\n <ChecklistCard\n icon={icon}\n title=\"COBRA\"\n planYearStart={plan.planYearStart}\n planYearEnd={plan.planYearEnd}\n buttons={buttons}\n progress={setLegacyChecklistCompletionProgress(plan.legacyChecklistComplete)}\n />\n );\n}\n\nexport default CobraLegacyPlanCard;\n\n","import { ReactElement, useEffect } from 'react';\nimport QueryBuilderIcon from '@mui/icons-material/QueryBuilder';\nimport Skeleton from '@mui/material/Skeleton';\nimport { useDispatch, useSelector } from 'react-redux';\nimport dayjs from 'dayjs';\nimport { always, cond, equals, compose, when, allPass, any } from 'ramda';\nimport store from 'store';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport { getUser } from 'authentication/authentication';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport {\n ApiStatus,\n selectFetchPlansStatus,\n selectReEnrollmentChecklistPlans,\n selectReEnrollmentChecklistRenewalDate,\n selectCustomPlanNamesFetchStatus,\n selectCanShowOePackets,\n selectFetchCobraChecklistPlansStatus,\n} from './re-enrollment-checklist.slice';\nimport {\n selectFetchFeatureFlagsStatus,\n} from 'components/app-settings.slice';\nimport { loadContactInfo, selectContactInfo } from 'manage-settings/contact-info/contact-info.slice';\nimport { CobraOePacketCard } from 're-enrollment-checklist/cobra-checklist/CobraOePacketCard';\nimport { CobraPlanCard } from 're-enrollment-checklist/cobra-reenrollment-checklist/CobraPlanCard';\nimport {\n fetchCobraChecklistPlans,\n fetchCustomPlans,\n fetchReEnrollmentChecklistPlan,\n} from 're-enrollment-checklist/re-enrollment-checklist.thunks';\nimport { fetchFeatureFlags } from 'components/app-settings.thunks';\nimport { useErrorNotifier } from 'shared/custom-hooks/useNotifiers';\nimport HsaPlanCard from 're-enrollment-checklist/hsa-reenrollment-checklist/HsaPlanCard';\nimport CustomPlanCard from 're-enrollment-checklist/custom-reenrollment-checklist/CustomPlanCard';\nimport FsaPlanCard from 're-enrollment-checklist/fsa-reenrollment-checklist/FsaPlanCard';\nimport HraPlanCard from 're-enrollment-checklist/hra-reenrollment-checklist/HraPlanCard';\nimport QtePlanCard from 're-enrollment-checklist/qte-reenrollment-checklist/QtePlanCard';\nimport DirectBillPlanCard from 're-enrollment-checklist/direct-bill-reenrollment-checklist/DirectBillPlanCard';\nimport { ReEnrollmentChecklistPlan } from './re-enrollment-checklist.types';\nimport { ApiFetchStatus } from 'shared/enums/api-fetch-status.enum';\nimport { PlanTypesString } from 'shared/enums/plan-types-string.enum';\nimport CobraLegacyPlanCard from './cobra-checklist/CobraLegacyCard';\n\ninterface ChecklistPlans {\n cobra?: ReEnrollmentChecklistPlan;\n directBill?: ReEnrollmentChecklistPlan;\n custom?: ReEnrollmentChecklistPlan;\n hsa?: ReEnrollmentChecklistPlan;\n fsa?: ReEnrollmentChecklistPlan;\n hra?: ReEnrollmentChecklistPlan;\n qte?: ReEnrollmentChecklistPlan;\n}\n\nfunction populateChecklistPlans(plans: ReEnrollmentChecklistPlan[]): ChecklistPlans {\n const result: ChecklistPlans = {};\n\n plans.forEach(plan => {\n switch (plan.type) {\n case PlanTypesString.COBRA:\n result.cobra = result.cobra ?? plan; // only get 1st. revisit when legacy removed.\n break;\n case PlanTypesString.DIRECTBILL:\n result.directBill = result.directBill ?? plan; // only get 1st. revisit when legacy removed.\n break;\n case PlanTypesString.CUSTOM:\n result.custom = result.custom ?? plan; // only get 1st. revisit when legacy removed.\n break;\n case PlanTypesString.HSA:\n result.hsa = result.hsa ?? plan; // only get 1st. revisit when legacy removed.\n break;\n case PlanTypesString.FSA:\n result.fsa = result.fsa ?? plan; // only get 1st. revisit when legacy removed.\n break;\n case PlanTypesString.HRA:\n result.hra = result.hra ?? plan; // only get 1st. revisit when legacy removed.\n break;\n case PlanTypesString.QTE:\n result.qte = result.qte ?? plan; // only get 1st. revisit when legacy removed.\n break;\n default:\n return;\n }\n });\n\n return result;\n}\n\nfunction ReEnrollmentChecklist(): ReactElement {\n const dispatch = useDispatch<typeof store.dispatch>();\n const errorNotifier = useErrorNotifier();\n const { compid: companyId } = useSelector(selectSelectedCompany)\n ?? { compid: 0, medplancd: '' };\n const { confname: firstName } = useSelector(selectContactInfo) ?? { confname: '' };\n const dueDate = useSelector(selectReEnrollmentChecklistRenewalDate);\n const daysLeft = dayjs(dueDate).diff(dayjs(), 'days');\n const plans = useSelector(selectReEnrollmentChecklistPlans);\n const checklistPlans = populateChecklistPlans(plans);\n const fetchPlanStatus = useSelector(selectFetchPlansStatus);\n const fetchCustomPlanNameStatus = useSelector(selectCustomPlanNamesFetchStatus);\n const fetchCobraChecklistPlansStatus = useSelector(selectFetchCobraChecklistPlansStatus);\n const fetchFeatureFlagsStatus = useSelector(selectFetchFeatureFlagsStatus);\n const canShowOePackets = useSelector(selectCanShowOePackets);\n\n const fetchStatuses = [\n fetchPlanStatus,\n fetchCustomPlanNameStatus,\n fetchCobraChecklistPlansStatus,\n fetchFeatureFlagsStatus,\n ];\n const isPending = () => any(\n equals(ApiFetchStatus.PENDING),\n )(fetchStatuses);\n const isRejected = () => any(\n equals(ApiFetchStatus.REJECTED),\n )(fetchStatuses);\n const isFulfilled = () => equals(fetchPlanStatus, ApiFetchStatus.FULFILLED)\n || equals(fetchCustomPlanNameStatus, ApiFetchStatus.FULFILLED);\n\n useEffect(() => {\n if (!firstName) {\n const user = getUser();\n dispatch(loadContactInfo(companyId, user!.conuserid));\n }\n }, [ dispatch, companyId, firstName, errorNotifier ]);\n\n useEffect(() => {\n dispatch(fetchReEnrollmentChecklistPlan(companyId));\n dispatch(fetchCustomPlans(companyId));\n }, [ dispatch, companyId ]);\n\n useEffect(() => {\n when(\n equals(ApiFetchStatus.UNINITIALIZED),\n compose(dispatch, fetchFeatureFlags),\n )(fetchFeatureFlagsStatus);\n\n when(\n allPass([\n always(!!checklistPlans.cobra),\n compose(equals(ApiFetchStatus.UNINITIALIZED), always(fetchCobraChecklistPlansStatus)),\n compose(equals(ApiFetchStatus.FULFILLED), always(fetchPlanStatus)),\n ]),\n compose(dispatch, fetchCobraChecklistPlans),\n )(checklistPlans.cobra as ReEnrollmentChecklistPlan);\n }, [\n dispatch,\n fetchFeatureFlagsStatus,\n fetchCobraChecklistPlansStatus,\n fetchPlanStatus,\n checklistPlans.cobra,\n companyId,\n ]);\n\n function loading() {\n return (\n <div className=\"flex flex-row justify-between\" data-testid=\"checklist-skeletons\">\n <div className=\"w-3/4\">\n <Skeleton variant=\"rectangular\" width=\"100%\" height={176} />\n <Skeleton variant=\"rectangular\" width=\"100%\" height={176} className=\"mt-4\" />\n <Skeleton variant=\"rectangular\" width=\"100%\" height={176} className=\"mt-4\" />\n </div>\n <div className=\"w-1/4 mx-5\">\n <Skeleton variant=\"rectangular\" width=\"100%\" height={93} />\n </div>\n </div>\n );\n }\n\n function renderCobra() {\n if (!checklistPlans.cobra) {\n return (<></>);\n }\n\n return (\n checklistPlans.cobra.legacyChecklistComplete && !checklistPlans.cobra.checklistComplete\n ? (<CobraLegacyPlanCard plan={checklistPlans.cobra} />)\n : (\n <>\n { canShowOePackets && (<CobraOePacketCard plan={checklistPlans.cobra} />) }\n <CobraPlanCard plan={checklistPlans.cobra} />\n </>\n )\n );\n }\n\n function renderDirectBill() {\n return (\n !checklistPlans.directBill\n ? (<></>)\n : (<DirectBillPlanCard plan={checklistPlans.directBill} />)\n );\n }\n\n function renderCustom() {\n return (\n !checklistPlans.custom\n ? (<></>)\n : (<CustomPlanCard plan={checklistPlans.custom} />)\n );\n }\n\n function renderHsa() {\n return (\n !checklistPlans.hsa\n ? (<></>)\n : (<HsaPlanCard plan={checklistPlans.hsa} />)\n );\n }\n\n function renderFsa() {\n return (\n !checklistPlans.fsa\n ? (<></>)\n : (<FsaPlanCard plan={checklistPlans.fsa} />)\n );\n }\n\n function renderHra() {\n return (\n !checklistPlans.hra\n ? (<></>)\n : (<HraPlanCard plan={checklistPlans.hra} />)\n );\n }\n\n function renderQte() {\n return (\n !checklistPlans.qte\n ? (<></>)\n : (<QtePlanCard plan={checklistPlans.qte} />)\n );\n }\n\n function pageContent() {\n return (\n <div className=\"flex flex-row justify-between\">\n <div className=\"w-3/4\">\n <PageContentPaper className=\"px-5\">\n <h5>Hi {firstName}, welcome to the re-enrollment checklist!</h5>\n <div>\n At your earliest convenience, please complete the form(s) below, and we will ensure\n your plan information is up to date prior to the start of your new plan year.\n </div>\n </PageContentPaper>\n { renderCobra() }\n { renderDirectBill() }\n { renderCustom() }\n { renderHsa() }\n { renderFsa() }\n { renderHra() }\n { renderQte() }\n </div>\n <div className=\"w-1/4 mx-5\">\n <PageContentPaper className=\"bg-sand\" >\n <h5 className=\"uppercase\">\n <QueryBuilderIcon />\n {Math.abs(daysLeft)} day{daysLeft === 1 ? '' : 's'} {daysLeft < 0 ? 'overdue' : 'left'}\n </h5>\n <hr />\n <div>\n to enroll by {dayjs(dueDate).format('MMMM D, YYYY')}\n </div>\n </PageContentPaper>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"w-full flex flex-col p-4 mx-5\">\n <h2 className=\"page-title\">Re-Enrollment Checklist</h2>\n {\n cond<ApiStatus, JSX.Element>([\n [ isPending, loading ],\n [ isRejected, always(<></>) ],\n [ isFulfilled, pageContent ],\n ])()\n }\n </div>\n );\n}\n\nexport default ReEnrollmentChecklist;\n","import React, { ReactElement, useState } from 'react';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport dayjs from 'dayjs';\nimport { F, T, always, andThen, anyPass, compose, equals, hasPath, ifElse, isNil, path, when } from 'ramda';\nimport LocalizationProvider from '@mui/lab/LocalizationProvider';\nimport AdapterDayJS from '@mui/lab/AdapterDayjs';\nimport DatePicker from '@mui/lab/DatePicker';\nimport RadioGroup from '@mui/material/RadioGroup';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport Radio from '@mui/material/Radio';\nimport Button from '@mui/material/Button';\n\nimport {\n cancelModalOpened,\n selectCobraPlan,\n selectCobraOeValidations,\n setCobraOeResponseDeadline,\n setCobraOeResponseRequired,\n setCobraOeSendPackets,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport TextField from '@mui/material/TextField';\nimport { saveCobraOePacketInfo, generateOeDocuments } from 're-enrollment-checklist/re-enrollment-checklist.thunks';\nimport { noop, toNumber } from 'shared/utils';\nimport store from 'store';\n\nfunction CoverLetterInfoTab(): ReactElement {\n const dispatch = useDispatch<typeof store.dispatch>();\n const {\n cobraOeSendPackets,\n cobraOeResponseDeadline,\n cobraOeResponseRequired,\n oePacketsChecklistComplete,\n companyId,\n } = useSelector(selectCobraPlan);\n const validations = useSelector(selectCobraOeValidations);\n const [ isFormValid, setIsFormValid ] = useState<boolean>(true);\n const history = useHistory();\n const { planYearId = '0' } = useParams<{planYearId: string;}>();\n const changeRoute = compose(history.push, always(`/reenrollment-checklist/cobra/${planYearId}/oe-packets`));\n\n const handleValidate = compose(\n ifElse(\n compose(\n anyPass([\n hasPath([ 'cobraOeSendPackets' ]),\n hasPath([ 'cobraOeResponseDeadline' ]),\n ]),\n always(validations),\n ),\n compose(F, setIsFormValid, F),\n compose(T, setIsFormValid, T),\n ),\n );\n\n const handleSave = compose(\n andThen(\n compose(\n andThen(\n changeRoute,\n ),\n dispatch,\n compose(generateOeDocuments, always({ companyId, planYearId })),\n ),\n ),\n dispatch,\n saveCobraOePacketInfo,\n );\n\n const handleContinue = compose(\n ifElse(\n equals(false),\n compose(\n when(\n equals(true),\n handleSave,\n ),\n handleValidate,\n ),\n changeRoute,\n ),\n always(oePacketsChecklistComplete),\n );\n\n const isContinueDisabled = anyPass([\n compose(isNil, always(cobraOeSendPackets)),\n compose(isNil, always(cobraOeResponseDeadline)),\n ])();\n\n function formatDate(event: any): string {\n return dayjs(event, 'YYYY-MM-DD').format();\n }\n\n function displayDate(date: string): string | null {\n return date ? dayjs(date).format('MM/DD/YYYY') : null;\n }\n\n return (\n <>\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <form className=\"my-10\">\n <div className=\"w-2/5 my-5\">\n <DatePicker\n label=\"What date must packets be sent by?\"\n value={displayDate(cobraOeSendPackets)}\n onChange={compose(\n dispatch,\n setCobraOeSendPackets,\n formatDate,\n )}\n disabled={oePacketsChecklistComplete}\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n {...params}\n fullWidth\n data-testid=\"cobraOeSendPackets\"\n variant=\"outlined\"\n name=\"cobraOeBegins\"\n error={!isFormValid && !!validations.cobraOeSendPackets}\n helperText={!isFormValid && validations.cobraOeSendPackets}\n />\n )}\n />\n </div>\n <div className=\"w-2/5 my-5\">\n <DatePicker\n label=\"What date must packets be returned by?\"\n value={displayDate(cobraOeResponseDeadline)}\n onChange={compose(\n dispatch,\n setCobraOeResponseDeadline,\n formatDate,\n )}\n disabled={oePacketsChecklistComplete}\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n {...params}\n fullWidth\n data-testid=\"cobraOeResponseDeadline\"\n variant=\"outlined\"\n name=\"cobraOeResponseDeadline\"\n error={!isFormValid && !!validations.cobraOeResponseDeadline}\n helperText={!isFormValid && validations.cobraOeResponseDeadline}\n />\n )}\n />\n </div>\n <div className=\"mt-10\">\n <p className=\"mt-5\">\n If a participant does not return an election form,\n are they termed or assumed to continue with their current elections?\n </p>\n <RadioGroup\n aria-label=\"oe response required?\"\n name=\"cobraOeResponseRequired\"\n // response can be 0, 1, or 2. Needs to be 1 or 2\n value={(cobraOeResponseRequired === 1 ? 1 : 2).toString()}\n onChange={compose(\n dispatch,\n setCobraOeResponseRequired,\n toNumber,\n path<any>([ 'target', 'value' ]),\n )}\n >\n <FormControlLabel\n value=\"2\"\n control={<Radio color=\"primary\" />}\n label=\"Assumed to continue with their current elections (recommended)\"\n disabled={oePacketsChecklistComplete}\n />\n <FormControlLabel\n value=\"1\"\n control={<Radio color=\"primary\" />}\n label=\"They are termed\"\n disabled={oePacketsChecklistComplete}\n />\n </RadioGroup>\n </div>\n </form>\n </LocalizationProvider>\n\n <div className=\"flex flex-row-reverse\">\n <Button\n data-testid=\"cover-letter-continue\"\n variant=\"contained\"\n color=\"primary\"\n onClick={handleContinue}\n disabled={isContinueDisabled}\n >Continue\n </Button>\n\n <Button\n className=\"mr-4\"\n onClick={compose(dispatch, cancelModalOpened, noop)}\n >Cancel\n </Button>\n </div>\n </>\n );\n}\n\nexport default CoverLetterInfoTab;\n","import { downloadDocument } from 'shared/api/cobraChecklistDocumentsApi';\n\n/* istanbul ignore next */\nexport default function handleDownloadDocument(companyId: number, planYearId: string, fileName: string) {\n return () => downloadDocument(companyId, planYearId, fileName)\n .then((response: any) => {\n let blob = window.URL.createObjectURL(new Blob([ response.data ]));\n let link = document.createElement('a');\n link.href = blob;\n link.setAttribute('download', `${fileName}`);\n document.body.appendChild(link);\n link.click();\n })\n .catch(() => {});\n}\n/* istanbul ignore stop */\n","import DescriptionIcon from '@mui/icons-material/Description';\nimport DownloadIcon from '@mui/icons-material/Download';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport IconButton from '@mui/material/IconButton';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { __, always, assoc, compose } from 'ramda';\n\nimport { FileListItem } from 're-enrollment-checklist/re-enrollment-checklist.types';\nimport { selectOePacketFiles } from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport store from 'store';\nimport handleDownloadDocument from 'shared/utils/download-document';\nimport { deleteOeDocument } from 're-enrollment-checklist/re-enrollment-checklist.thunks';\n\ninterface Props {\n companyId: number;\n planYearId: string;\n showDelete?: boolean;\n showDownload?: boolean;\n}\n\nfunction OeFiles({ companyId, planYearId, showDelete, showDownload }: Props) {\n const dispatch = useDispatch<typeof store.dispatch>();\n const oePacketFiles = useSelector(selectOePacketFiles);\n\n function handleDelete(fileName: string) {\n return compose(\n dispatch,\n deleteOeDocument,\n assoc('fileName', __, { companyId, planYearId }),\n always(fileName),\n );\n }\n\n return (\n <div className=\"flex flex-wrap\">\n {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n Array.from(oePacketFiles ?? []).map((f: FileListItem) => (\n <div key={f.name} className=\"w-1/3 p-2\">\n <div className=\"flex content-center items-center px-2 border rounded-lg border-gray-200 h-32 relative\">\n <div className=\"flex flex-row-reverse absolute w-full top-0\">\n {showDelete && (\n <IconButton color=\"primary\" className=\"mr-2\">\n <DeleteIcon\n className=\"px-1\"\n data-testid=\"oefile-delete\"\n onClick={handleDelete(`${f.fullName}`)}\n />\n </IconButton>\n )}\n {showDownload && (\n <IconButton color=\"primary\">\n <DownloadIcon\n className=\"px-1\"\n data-testid=\"oefile-download\"\n onClick={handleDownloadDocument(companyId, planYearId, `${f.fullName}`)}\n />\n </IconButton>\n )}\n </div>\n <p className=\"self-center mt-2\"><DescriptionIcon color=\"primary\" /> {f.name}{f.extension}</p>\n </div>\n </div>\n ))\n }\n </div>\n );\n}\n\nexport default OeFiles;\n","// https://dev.azure.com/flores247/Flores%20Agile/_wiki/wikis/Flores-Agile.wiki/359/Plan-code-to-description-mapping\nexport const PlanCodes = {\n BOOT: 'B',\n DCRA: 'D',\n RESPONSE: 'C',\n PREM: 'E',\n HRAF: 'H',\n TOOL: 'L',\n MRA: 'M',\n POP: 'P',\n HSA: 'S',\n QRE: 'T',\n AUTH_FORM: 'V',\n EXCEP: 'X',\n PVP: 'Y',\n CUST: 'O',\n DENT: '1',\n VIS: '2',\n HRA: '3',\n EDU: '4',\n COBRA: '5',\n RETIREE: '6',\n LOA: '7',\n LFSA: '-',\n};\n","import { ReactElement } from 'react';\nimport dayjs from 'dayjs';\nimport Button from '@mui/material/Button';\nimport { all, always, andThen, compose, equals, ifElse } from 'ramda';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport {\n cancelModalOpened,\n selectCobraPlan,\n selectCompanyId,\n selectCobraOePrintOptionBlackAndWhite,\n selectCobraOePrintOptionTwoSided,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport OeFiles from 're-enrollment-checklist/cobra/oe-packets/OeFiles';\nimport { completeChecklist } from 're-enrollment-checklist/re-enrollment-checklist.thunks';\nimport { noop } from 'shared/utils';\nimport store from 'store';\nimport { PlanCodes } from 'shared/enums/plan-codes.enum';\n\ninterface Props {\n onComplete: () => void;\n}\n\nfunction SummaryInfo({ onComplete }: Props): ReactElement {\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n const { planYearId = '0' } = useParams<{planYearId: string;}>();\n const plan = useSelector(selectCobraPlan);\n const companyId = useSelector(selectCompanyId);\n const blackAndWhite = useSelector(selectCobraOePrintOptionBlackAndWhite);\n const twoSided = useSelector(selectCobraOePrintOptionTwoSided);\n const disabled = plan.cobraOeHandler === 0 && !plan.cobraOeTemplateCoverLetter\n ? !plan.generalSectionComplete\n : !all(equals(true),\n [\n plan.generalSectionComplete,\n plan.coverLetterSectionComplete,\n plan.oePacketsSectionComplete,\n ]);\n const handleContinue = ifElse(\n always(plan.oePacketsChecklistComplete),\n compose(history.push, always('/reenrollment-checklist')),\n compose(\n compose(\n andThen(\n onComplete,\n ),\n dispatch, compose(completeChecklist, always(PlanCodes.COBRA)),\n ),\n ),\n );\n\n return (\n <>\n <div>\n <div className=\"my-10\">\n <div className=\"flex justify-between\">\n <p>Cover Letter Info</p>\n <Button\n className=\"text-sm\"\n variant=\"text\"\n onClick={\n compose(\n history.push,\n always(`/reenrollment-checklist/cobra/${planYearId}/cover-letter-info`))\n }\n >Edit\n </Button>\n </div>\n <hr />\n <div className=\"w-3/5\">\n <div className=\"my-5\">\n <h6 className=\"inline\">Packets must be sent by:</h6>\n <p className=\"inline mx-3\">{dayjs(plan.cobraOeSendPackets).format('MM/DD/YYYY')}</p>\n </div>\n\n <div className=\"my-5\">\n <h6 className=\"inline\">Packets must be returned by:</h6>\n <p className=\"inline mx-3\">{dayjs(plan.cobraOeResponseDeadline).format('MM/DD/YYYY')}</p>\n </div>\n\n <div className=\"my-5\">\n <h6>\n If a participant does not return an election form,\n are they termed or assumed to continue with their current elections?\n </h6>\n <p>\n {plan.cobraOeResponseRequired === 2\n ? 'Assumed to continue with their current elections (recommended)'\n : 'They are termed'}\n </p>\n </div>\n </div>\n </div>\n\n <div className=\"my-10\">\n\n <div className=\"flex justify-between\">\n <p>OE Packets</p>\n <Button\n className=\"text-sm\"\n variant=\"text\"\n onClick={compose(history.push, always(`/reenrollment-checklist/cobra/${planYearId}/oe-packets`))}\n >Edit\n </Button>\n </div>\n <hr />\n <div className=\"w-3/5\">\n <div className=\"my-5\">\n <h6>Included Files</h6>\n <OeFiles showDownload companyId={companyId} planYearId={planYearId} />\n </div>\n </div>\n\n <div className=\"w-3/5\">\n <div className=\"my-5\">\n <h6>Page Count:</h6>\n {!!twoSided ? 'Two Sided (Recommended)' : 'Single Sided'}\n </div>\n </div>\n\n <div className=\"w-3/5\">\n <div className=\"my-5\">\n <h6>Color Options:</h6>\n {!!blackAndWhite ? 'Black and White' : 'Color'}\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"flex flex-row-reverse\">\n <Button\n data-testid=\"complete-button\"\n variant=\"contained\"\n color=\"primary\"\n onClick={handleContinue}\n disabled={disabled}\n >Complete and Submit\n </Button>\n\n <Button\n className=\"mr-4\"\n onClick={compose(dispatch, cancelModalOpened, noop)}\n >Cancel\n </Button>\n </div>\n </>\n );\n}\n\nexport default SummaryInfo;\n","import React, { ReactElement } from 'react';\nimport SummaryInfo from './SummaryInfo';\nimport { useHistory } from 'react-router-dom';\nimport { always, compose } from 'ramda';\n\nfunction SummaryTab(): ReactElement {\n const history = useHistory();\n const onComplete = compose(\n history.push,\n always(`/reenrollment-checklist`),\n );\n\n return (\n <SummaryInfo onComplete={onComplete} />\n );\n}\n\nexport default SummaryTab;\n\n","/* eslint-disable react/jsx-no-bind */\nimport { ReactElement, useState, useRef, DragEventHandler } from 'react';\n\ntype Props = { onDrop: (files: File[]) => void; disabled?: boolean; }\n\nfunction DragAndDropUpload({ onDrop, disabled = false }: Props): ReactElement {\n const [ dragActive, setDragActive ] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n function handleDrag(e: any) {\n e.preventDefault();\n e.stopPropagation();\n\n if (e.type === 'dragenter' || e.type === 'dragover') {\n setDragActive(true);\n } else if (e.type === 'dragleave') {\n setDragActive(false);\n }\n }\n\n function handleDrop(e: any) {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(false);\n\n if (e?.dataTransfer?.files?.length) {\n onDrop(e.dataTransfer.files);\n }\n }\n\n function handleChange(e: any) {\n e.preventDefault();\n\n if (e.target?.files?.length) {\n onDrop(e.target.files);\n }\n }\n\n const onButtonClick = () => {\n inputRef.current?.click();\n };\n\n return (\n <>\n <form\n className=\"h-64 w-full text-center relative\"\n onDragEnter={handleDrag as unknown as DragEventHandler<HTMLFormElement>}\n onSubmit={(e: any) => e.preventDefault()}\n >\n <input\n ref={inputRef}\n type=\"file\"\n className=\"hidden\"\n data-testid=\"upload-input\"\n multiple\n onChange={handleChange}\n disabled={disabled}\n />\n\n <label\n htmlFor=\"input-file-upload\"\n data-testid=\"upload-label\"\n className={`${\n dragActive ? 'bg-gray-400' : 'bg-gray-100'\n } h-full flex items-center justify-center border-2 rounded-lg border-dashed border-gray-400`}\n >\n <p className=\"d-inline\">Drag and drop or</p>\n <button\n className=\"cursor-pointer p-1 border-0 bg-transparent d-inline text-blue-500\"\n data-testid=\"upload-button\"\n onClick={onButtonClick}\n >browse\n </button>\n <p className=\"d-inine\">your files</p>\n </label>\n {\n dragActive && (\n <div\n className=\"absolute w-full h-full rounded-lg top-0 right-0 bottom-0 left-0\"\n data-testid=\"drag-file-element\"\n onDragEnter={handleDrag}\n onDragLeave={handleDrag}\n onDragOver={handleDrag}\n onDrop={handleDrop}\n />\n )\n }\n </form>\n </>\n );\n}\n\nexport default DragAndDropUpload;\n","export default __webpack_public_path__ + \"static/media/confirm-cover-letter.da74915f.png\";","import FormControlLabel from '@mui/material/FormControlLabel';\nimport DescriptionIcon from '@mui/icons-material/Description';\nimport CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline';\nimport BlockIcon from '@mui/icons-material/Block';\nimport DownloadIcon from '@mui/icons-material/Download';\nimport Button from '@mui/material/Button';\nimport Checkbox from '@mui/material/Checkbox';\nimport { FileListItem } from 're-enrollment-checklist/re-enrollment-checklist.types';\nimport coverLetterBanner from 'images/confirm-cover-letter.png';\n\ninterface Props {\n file: FileListItem | null;\n title: string;\n fileType: string;\n reviewStatus: boolean;\n approvalStatus: boolean;\n onChangeReviewStatus: (x0: any) => unknown;\n onChangeApprovalStatus: (x0: any) => unknown;\n onDownload: Function;\n inputsDisabled: boolean;\n}\n\nfunction OeGeneratedFile({\n file,\n title,\n fileType,\n reviewStatus,\n approvalStatus,\n onChangeReviewStatus,\n onChangeApprovalStatus,\n onDownload,\n inputsDisabled,\n}: Props) {\n const confirmReviewedLabel =\n 'By checking this box I confirm that I have downloaded and reviewed this document for accuracy and errors';\n const buttonBaseClasses: string[] = [\n 'text-primary-main',\n 'border-primary-main',\n 'h-12',\n 'basis-full',\n 'my-2',\n ];\n const buttonApprovedClasses: string[] = [\n 'text-black',\n 'border-green-500',\n 'bg-green-50',\n ];\n const buttonDisabledClasses: string[] = [ 'opacity-50' ];\n\n function setApproveButtonClass() {\n let classNamesArray = buttonBaseClasses;\n const isDocApproved = approvalStatus;\n const isDocReviewed = reviewStatus;\n\n if (isDocApproved) {\n classNamesArray = classNamesArray.concat(buttonApprovedClasses);\n classNamesArray.shift();\n }\n\n if ((!isDocApproved && !isDocReviewed)) {\n classNamesArray = classNamesArray.concat(buttonDisabledClasses);\n }\n\n const classNamesString = classNamesArray.join(' ');\n\n return classNamesString;\n }\n\n return (\n <>\n {!!file?.fullName &&\n <div key={fileType} className=\"w-1/3 rounded-2xl border mr-4 border-gray-400\">\n <img src={coverLetterBanner} className=\"rounded-t-2xl\" alt={title} />\n <div className=\"border-t border-gray-400 py-4 px-8\">\n <h6><DescriptionIcon color=\"primary\" />{title}</h6>\n {!inputsDisabled && !approvalStatus &&\n <FormControlLabel\n control={\n <Checkbox\n color=\"primary\"\n id={`${fileType}-review-checkbox`}\n data-testid={`${fileType}-review-checkbox`}\n value={reviewStatus}\n checked={reviewStatus}\n onChange={onChangeReviewStatus}\n />\n }\n classes={ { root: 'mt-2 mr-0', label: 'text-sm' } }\n label={confirmReviewedLabel}\n labelPlacement=\"end\"\n />}\n <div className=\"flex flex-wrap justify-center pt-4\">\n <Button\n className={setApproveButtonClass()}\n id={`${fileType}-approve-button`}\n data-testid={`${fileType}-approve-button`}\n variant={'outlined'}\n onClick={onChangeApprovalStatus}\n disabled={inputsDisabled || approvalStatus || !reviewStatus}\n >\n\n {approvalStatus\n ? (<><CheckCircleOutlineIcon className=\"mr-2 text-green-500\" /> Approved</>)\n : 'Approve'}\n\n </Button>\n\n {!inputsDisabled && approvalStatus &&\n <Button\n className={buttonBaseClasses.join(' ')}\n id={`${fileType}-unapprove-button`}\n data-testid={`${fileType}-unapprove-button`}\n variant={'outlined'}\n onClick={onChangeApprovalStatus}\n >\n <BlockIcon className=\"mr-2\" /> Unapprove\n </Button>}\n\n <Button\n className={buttonBaseClasses.join(' ')}\n id={`${fileType}-download-button`}\n data-testid={`${fileType}-download-button`}\n variant={'outlined'}\n onClick={onDownload(`${file.fullName}`)}\n >\n <DownloadIcon className=\"mr-2\" /> Download\n </Button>\n </div>\n </div>\n </div>}\n </>\n );\n}\n\nexport default OeGeneratedFile;\n","/* eslint-disable react/jsx-no-bind */\nimport { ReactElement, useState } from 'react';\nimport { useHistory, useParams } from 'react-router-dom';\nimport Radio from '@mui/material/Radio';\nimport FormControl from '@mui/material/FormControl';\nimport RadioGroup from '@mui/material/RadioGroup';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport Button from '@mui/material/Button';\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n compose,\n path,\n always,\n tap,\n andThen,\n otherwise,\n pathOr,\n equals,\n ifElse,\n} from 'ramda';\nimport {\n ApiStatus,\n selectCobraOeProgress,\n selectCompanyId,\n selectCobraOePrintOptionBlackAndWhite,\n selectCobraOePrintOptionTwoSided,\n setCobraOePacketFiles,\n setCobraOePrintOptionsBlackAndWhite,\n setCobraOePrintOptionsTwoSided,\n setCobraOeSubmitFileStatus,\n cancelModalOpened,\n selectCobraOeCoverLetterApproved,\n selectCobraOeElectionFormApproved,\n setCobraOeCoverLetterApproved,\n setCobraOeElectionFormApproved,\n selectCobraOeCoverLetter,\n selectCobraOeElectionForm,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport DragAndDropUpload from 'components/shared/DragAndDropUpload';\nimport {\n saveCobraOePacketInfo,\n} from 're-enrollment-checklist/re-enrollment-checklist.thunks';\nimport OeFiles from 're-enrollment-checklist/cobra/oe-packets/OeFiles';\nimport { uploadCobraOePacketDoc } from 'shared/api/reEnrollmentChecklistApi';\nimport { FileListItem } from 're-enrollment-checklist/re-enrollment-checklist.types';\nimport { noop } from 'shared/utils';\nimport store from 'store';\nimport handleDownloadDocument from 'shared/utils/download-document';\nimport OeGeneratedFile from './OeGeneratedFile';\n\nfunction OePacketsTab(): ReactElement {\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n const { planYearId = '0' } = useParams<{planYearId: string;}>();\n const companyId = useSelector(selectCompanyId);\n const blackAndWhite = useSelector(selectCobraOePrintOptionBlackAndWhite);\n const twoSided = useSelector(selectCobraOePrintOptionTwoSided);\n const isCoverLetterApproved = useSelector(selectCobraOeCoverLetterApproved);\n const isElectionApproved = useSelector(selectCobraOeElectionFormApproved);\n const [ isCoverLetterReviewed, setIsCoverLetterReviewed ] = useState(false);\n const [ isElectionFormReviewed, setIsElectionFormReviewed ] = useState(false);\n const inputsDisabled = useSelector(selectCobraOeProgress) >= 100;\n const changeRoute = compose(history.push, always(`/reenrollment-checklist/cobra/${planYearId}/summary`));\n const submitFile = compose(\n otherwise(compose(dispatch, compose(setCobraOeSubmitFileStatus, always<ApiStatus>('rejected')))),\n andThen(compose(dispatch, compose(setCobraOeSubmitFileStatus, always<ApiStatus>('fulfilled')))),\n andThen(compose(\n compose(dispatch, setCobraOePacketFiles),\n pathOr<FileListItem[]>([],[ 'oePacketFiles' ]),\n )),\n compose(uploadCobraOePacketDoc(companyId, +planYearId)),\n tap(compose(dispatch, compose(setCobraOeSubmitFileStatus, always<ApiStatus>('pending')))),\n );\n\n const coverLetter = useSelector(selectCobraOeCoverLetter);\n const electionForm = useSelector(selectCobraOeElectionForm);\n\n function handleDownload (fileName: string) {\n try {\n return handleDownloadDocument(companyId, planYearId, fileName);\n } catch {}\n }\n\n const handleCoverLetterChangeReviewStatus = compose(\n compose(setIsCoverLetterReviewed, always(!isCoverLetterReviewed)),\n path([ 'target', 'id' ]),\n );\n\n const handleElectionFormChangeReviewStatus = compose(\n compose(setIsElectionFormReviewed, always(!isElectionFormReviewed)),\n path([ 'target', 'id' ]),\n );\n\n const handleCoverLetterChangeApprovalStatus = compose(\n compose(\n dispatch,\n saveCobraOePacketInfo,\n dispatch,\n setCobraOeCoverLetterApproved,\n always(!isCoverLetterApproved),\n ),\n path([ 'target', 'id' ]),\n );\n\n const handleElectionFormChangeApprovalStatus = compose(\n compose(\n dispatch,\n saveCobraOePacketInfo,\n dispatch,\n setCobraOeElectionFormApproved,\n always(!isElectionApproved),\n ),\n path([ 'target', 'id' ]),\n );\n\n return (\n <>\n <h5 className=\"py-6\">Please review and confirm your cover letter and election form.</h5>\n <div className=\"flex pb-10\">\n <OeGeneratedFile\n file={coverLetter}\n title=\"Cover Letter\"\n fileType=\"cover-letter\"\n inputsDisabled={inputsDisabled}\n approvalStatus={isCoverLetterApproved}\n reviewStatus={isCoverLetterReviewed}\n onChangeApprovalStatus={handleCoverLetterChangeApprovalStatus}\n onChangeReviewStatus={handleCoverLetterChangeReviewStatus}\n onDownload={handleDownload}\n />\n <OeGeneratedFile\n file={electionForm}\n title=\"Election Form\"\n fileType=\"election-form\"\n inputsDisabled={inputsDisabled}\n approvalStatus={isElectionApproved}\n reviewStatus={isElectionFormReviewed}\n onChangeApprovalStatus={handleElectionFormChangeApprovalStatus}\n onChangeReviewStatus={handleElectionFormChangeReviewStatus}\n onDownload={handleDownload}\n />\n </div>\n\n <hr />\n\n <h5 className=\"py-4\">\n Please upload any additional documents that you would like to be included in the\n Open Enrollment Packets. This should include a SPD for all plans that your participants will\n have the option to elect.\n </h5>\n\n {!inputsDisabled && (\n <DragAndDropUpload\n onDrop={submitFile}\n />)}\n\n <OeFiles showDelete={!inputsDisabled} showDownload companyId={companyId} planYearId={planYearId} />\n\n <div className=\"pt-6\">\n <p>If other documents should be included, please attach below</p>\n <div className=\"flex flex-column\">\n <FormControl component=\"fieldset\" className=\"mb-8\">\n <h5>Page Count</h5>\n <RadioGroup\n aria-label=\"twoSided\"\n name=\"twoSided\"\n value={!!twoSided ? 'two' : 'single'}\n onChange={\n compose(\n dispatch,\n setCobraOePrintOptionsTwoSided,\n equals('two'),\n path([ 'target', 'value' ]) as any,\n )\n }\n >\n <FormControlLabel\n value=\"two\"\n control={\n <Radio\n color=\"primary\"\n id=\"page-count-two-sided\"\n data-testid=\"page-count-two-sided\"\n />\n }\n label=\"Two Sided (Recommended)\"\n disabled={inputsDisabled}\n\n />\n <FormControlLabel\n value=\"single\"\n control={\n <Radio\n color=\"primary\"\n id=\"page-count-single-sided\"\n data-testid=\"page-count-single-sided\"\n />}\n label=\"Single Sided (Results in increased billing due to printing costs)\"\n disabled={inputsDisabled}\n />\n </RadioGroup>\n </FormControl>\n </div>\n\n <div className=\"flex flex-column\">\n <FormControl component=\"fieldset\" className=\"mb-8\">\n <h5>Color Options</h5>\n <RadioGroup\n aria-label=\"blackAndWhite\"\n name=\"blackAndWhite\"\n value={!!blackAndWhite ? 'blackAndWhite' : 'color'}\n onChange={\n compose(\n dispatch,\n setCobraOePrintOptionsBlackAndWhite,\n equals('blackAndWhite'),\n path([ 'target', 'value' ]) as any,\n )\n }\n >\n <FormControlLabel\n value=\"blackAndWhite\"\n control={\n <Radio\n color=\"primary\"\n id=\"color-options-black-and-white\"\n data-testid=\"color-options-black-and-white\"\n />\n }\n label=\"Black and White\"\n disabled={inputsDisabled}\n />\n <FormControlLabel\n value=\"color\"\n control={\n <Radio\n color=\"primary\"\n id=\"color-options-color\"\n data-testid=\"color-options-color\"\n />\n }\n label=\"Color (Results in increased billing due to printing costs)\"\n disabled={inputsDisabled}\n />\n </RadioGroup>\n </FormControl>\n </div>\n\n </div>\n\n <hr />\n\n <div className=\"flex flex-row-reverse pt-10\">\n <Button\n data-testid=\"oe-general-continue\"\n variant=\"contained\"\n color=\"primary\"\n onClick={\n compose(\n ifElse(\n equals(false),\n compose(andThen(changeRoute), dispatch, compose(saveCobraOePacketInfo)),\n changeRoute,\n ),\n always(inputsDisabled),\n )\n }\n disabled={!isCoverLetterApproved || !isElectionApproved}\n >Continue\n </Button>\n\n <Button\n className=\"mr-4\"\n onClick={compose(dispatch, cancelModalOpened, noop)}\n >Cancel\n </Button>\n </div>\n </>\n );\n}\n\nexport default OePacketsTab;\n","import React, { ReactElement, useEffect } from 'react';\nimport { useHistory, useParams } from 'react-router-dom';\nimport Tabs from '@mui/material/Tabs';\nimport Tab from '@mui/material/Tab';\nimport Skeleton from '@mui/material/Skeleton';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { usePageTitle } from 'shared/custom-hooks/usePageTitle';\nimport {\n cancelModalClosed,\n selectCancelModalStatus,\n selectCompleteChecklistRequestStatus,\n selectFetchPlansStatus,\n selectReEnrollmentPlansByPlanYearId,\n selectSaveCobraOePacketInfoStatus,\n selectCobraOeSubmitDocStatus,\n selectCobraPlan,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport { fetchReEnrollmentChecklistPlan } from 're-enrollment-checklist/re-enrollment-checklist.thunks';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport TabPanel from 'components/shared/TabPanel';\nimport Loading from 'components/shared/Loading';\nimport CoverLetterInfoTab from './cover-letter/CoverLetterInfoTab';\nimport SummaryTab from './summary/SummaryTab';\nimport OePacketsTab from './oe-packets/OePacketsTab';\nimport CancelModal from 'components/shared/CancelModal';\nimport { compose, always, cond, equals, T } from 'ramda';\nimport store from 'store';\n\ntype CobraTab = 'cover-letter-info' | 'oe-packets' | 'summary'\n\nfunction CobraReEnrollmentChecklist(): ReactElement {\n usePageTitle('COBRA Open Enrollment Packets');\n\n const history = useHistory();\n const { compid } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const { planYearId = '0', tab = 'general-info' } = useParams<{planYearId: string; tab?: CobraTab;}>();\n const plan = useSelector(selectReEnrollmentPlansByPlanYearId(+planYearId));\n const dispatch = useDispatch<typeof store.dispatch>();\n const saveStatus = useSelector(selectSaveCobraOePacketInfoStatus);\n const fetchStatus = useSelector(selectFetchPlansStatus);\n const submitDocStatus = useSelector(selectCobraOeSubmitDocStatus);\n const completeChecklistStatus = useSelector(selectCompleteChecklistRequestStatus);\n const cancelModalStatus = useSelector(selectCancelModalStatus);\n const {\n coverLetterSectionComplete,\n oePacketsSectionComplete,\n } = useSelector(selectCobraPlan);\n\n useEffect(() => {\n if (!plan) {\n dispatch(fetchReEnrollmentChecklistPlan(compid));\n }\n }, [ planYearId, dispatch, plan, compid ]);\n\n function handleTabChange (_: React.ChangeEvent<{}>, newTab: string) {\n history.push(`/reenrollment-checklist/cobra/${planYearId}/${newTab}`);\n }\n\n return (\n <>\n <PageContentPaper className=\"mt-4 mb-8\">\n <div className=\"flex flex-col justify-around\">\n <Tabs\n indicatorColor=\"primary\"\n textColor=\"primary\"\n className=\"-ml-4 -mt-4 flex justify-around\"\n value={tab}\n centered\n onChange={handleTabChange}\n >\n <Tab\n data-testid=\"cover-letter-tab\"\n value=\"cover-letter-info\"\n label=\"Cover Letter Info\"\n />\n <Tab\n data-testid=\"oe-packets-tab\"\n value=\"oe-packets\"\n label=\"OE Packets\"\n disabled={!coverLetterSectionComplete}\n />\n <Tab\n disabled={!oePacketsSectionComplete || !coverLetterSectionComplete}\n data-testid=\"summary-tab\"\n value=\"summary\"\n label=\"Summary\"\n />\n </Tabs>\n <hr />\n <TabPanel value={tab} index=\"cover-letter-info\">\n {\n cond<string, ReactElement>([\n [ equals('pending'), always(\n <>\n <Skeleton variant=\"rectangular\" height={50} className=\"w-2/5 my-5\" />\n <Skeleton variant=\"rectangular\" height={50} className=\"w-2/5 my-5\" />\n <Skeleton variant=\"rectangular\" height={50} className=\"w-2/5 my-5\" />\n <Skeleton variant=\"rectangular\" height={150} className=\"w-4/5 my-5\" />\n <Skeleton variant=\"rectangular\" height={150} className=\"w-4/5 my-5\" />\n </>,\n ) ],\n [ T, always(<CoverLetterInfoTab />) ]],\n )(fetchStatus)\n }\n </TabPanel>\n <TabPanel value={tab} index=\"oe-packets\">\n {\n cond<string, ReactElement>([\n [ equals('pending'), always(\n <>\n <Skeleton variant=\"rectangular\" height={50} className=\"w-1/2 my-5\" />\n <div className=\"flex\">\n <Skeleton variant=\"rectangular\" height={250} className=\"w-1/3 my-5 mr-5\" />\n <Skeleton variant=\"rectangular\" height={250} className=\"w-1/3 my-5\" />\n </div>\n <Skeleton variant=\"rectangular\" height={500} className=\"w-full my-5\" />\n </>,\n ) ],\n [ T, always(<OePacketsTab />) ]],\n )(fetchStatus)\n }\n </TabPanel>\n <TabPanel value={tab} index=\"summary\">\n {\n cond<string, ReactElement>([\n [ equals('pending'), always(\n <>\n <Skeleton variant=\"rectangular\" height={250} className=\"my-5\" />\n <Skeleton variant=\"rectangular\" height={300} className=\"my-5\" />\n <Skeleton variant=\"rectangular\" height={300} className=\"my-5\" />\n </>,\n ) ],\n [ T, always(<SummaryTab />) ]],\n )(fetchStatus)\n }\n </TabPanel>\n </div>\n </PageContentPaper>\n {\n saveStatus === 'pending'\n || submitDocStatus === 'pending'\n || completeChecklistStatus === 'pending'\n ? <Loading />\n : <></>\n }\n <CancelModal\n isOpen={cancelModalStatus === 'open'}\n onCancel={compose(history.push, always('/reenrollment-checklist'))}\n onClose={compose(dispatch, cancelModalClosed)}\n />\n </>\n );\n}\n\nexport default CobraReEnrollmentChecklist;\n","import { ReactElement } from 'react';\nimport { useHistory, useParams } from 'react-router-dom';\nimport Radio from '@mui/material/Radio';\nimport FormControl from '@mui/material/FormControl';\nimport RadioGroup from '@mui/material/RadioGroup';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport Button from '@mui/material/Button';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { compose, path, always, ifElse, equals, andThen, F, T, when, isNil } from 'ramda';\n\nimport {\n cancelModalOpened,\n selectCobraOeHandler,\n selectCobraOeTemplateCoverLetter,\n setCobraOeHandler,\n setCobraOeTemplateCoverLetter,\n selectCobraPlan,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport { saveCobraOePacketInfo } from 're-enrollment-checklist/re-enrollment-checklist.thunks';\nimport { noop } from 'shared/utils';\nimport store from 'store';\n\nfunction OePacketsOptions(): ReactElement {\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n const { planYearId = '0' } = useParams<{planYearId: string;}>();\n const cobraOeHandler = useSelector(selectCobraOeHandler);\n const cobraOeCoverLetter = useSelector(selectCobraOeTemplateCoverLetter);\n const { checklistComplete } = useSelector(selectCobraPlan);\n\n const changeRoute = compose(\n history.push,\n always(`/reenrollment-checklist/cobra-plan/${planYearId}/plan-rates`),\n );\n\n const handleOeHandlerChange = compose(\n dispatch,\n setCobraOeHandler,\n ifElse(\n equals('1'),\n always(1),\n always(2),\n ),\n path([ 'target', 'value' ]),\n );\n\n const handleOeTemplatesChange = compose(\n dispatch,\n setCobraOeTemplateCoverLetter,\n ifElse(\n equals('yes'),\n T,\n F,\n ),\n path([ 'target', 'value' ]),\n );\n\n const handleContinue = compose(\n ifElse(\n equals(false),\n compose(\n andThen(changeRoute),\n dispatch,\n compose(saveCobraOePacketInfo),\n when(\n compose(isNil, always(cobraOeCoverLetter)),\n compose(dispatch, setCobraOeTemplateCoverLetter , F),\n ),\n ),\n changeRoute,\n ),\n always(checklistComplete),\n );\n\n return (\n <>\n <FormControl component=\"fieldset\" className=\"my-8\">\n <p>Would you like Flores to mail your packets to participants directly?</p>\n <RadioGroup\n aria-label=\"mail\"\n name=\"mail\"\n value={(cobraOeHandler ?? 2).toString()}\n onChange={handleOeHandlerChange}\n >\n <FormControlLabel\n value=\"1\"\n control={<Radio color=\"primary\" data-testid=\"mail-packets-yes\" />}\n label=\"Yes (results in a fee of $15 per packet plus printing and shipping, $75 minimum.)\"\n disabled={checklistComplete}\n />\n <FormControlLabel\n value=\"2\"\n control={<Radio color=\"primary\" data-testid=\"mail-packets-no\" />}\n label=\"No (no fee)\"\n disabled={checklistComplete}\n />\n </RadioGroup>\n </FormControl>\n\n {\n (2 === cobraOeHandler) && (\n <FormControl component=\"fieldset\" className=\"mb-8\" data-testid=\"question-2\">\n <p>\n Would you like to use Flores' system to generate a template cover letter and\n election form that you can mail to your participants at no additional cost?\n </p>\n <RadioGroup\n aria-label=\"template\"\n name=\"template\"\n value={!!cobraOeCoverLetter ? 'yes' : 'no'}\n onChange={handleOeTemplatesChange}\n >\n <FormControlLabel\n value=\"yes\"\n control={<Radio color=\"primary\" data-testid=\"generate-docs-yes\" />}\n label=\"Yes\"\n disabled={checklistComplete}\n />\n <FormControlLabel\n value=\"no\"\n control={<Radio color=\"primary\" data-testid=\"generate-docs-no\" />}\n label=\"No\"\n disabled={checklistComplete}\n />\n </RadioGroup>\n </FormControl>\n )\n }\n\n <div className=\"flex flex-row-reverse\">\n <Button\n data-testid=\"oe-general-continue\"\n variant=\"contained\"\n color=\"primary\"\n onClick={handleContinue}\n >Continue\n </Button>\n\n <Button\n className=\"mr-4\"\n onClick={compose(dispatch, cancelModalOpened, noop)}\n >Cancel\n </Button>\n </div>\n </>\n );\n}\n\nexport default OePacketsOptions;\n","import React, { ReactElement, useState } from 'react';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { always, andThen, compose, gt, ifElse, isNil, lte, pathOr, when } from 'ramda';\nimport TextField from '@mui/material/TextField';\nimport Button from '@mui/material/Button';\nimport FormControl from '@mui/material/FormControl';\nimport {\n cancelModalOpened,\n selectCobraPlanNewEligibleCount,\n selectEligibilityCountDifference,\n setCobraPlanNewEligibilityCount,\n selectCobraPlan,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport { noop, toNumber } from 'shared/utils';\nimport store from 'store';\nimport { saveCobraOePacketInfo } from 're-enrollment-checklist/re-enrollment-checklist.thunks';\nimport CancelModal from 'components/shared/CancelModal';\n\ntype warningModalStatus = 'closed' | 'open'\n\nfunction CobraEligibilityCount(): ReactElement {\n const [ warningModalStatus, setWarningModalStatus ] = useState<warningModalStatus>('closed');\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n const { planYearId = '0' } = useParams<{planYearId: string;}>();\n const eligibilityCount = useSelector(selectCobraPlanNewEligibleCount);\n const diff = useSelector(selectEligibilityCountDifference);\n const hasError = lte(eligibilityCount, 0);\n const { checklistComplete } = useSelector(selectCobraPlan);\n\n const onCountChange = compose(\n dispatch,\n setCobraPlanNewEligibilityCount,\n toNumber,\n pathOr('0', [ 'target', 'value' ]),\n );\n\n const handleNavigation = compose(\n history.push,\n always(`/reenrollment-checklist/cobra-plan/${planYearId}/oe-packets-options`),\n );\n\n const onSave = compose(\n andThen(handleNavigation),\n dispatch,\n saveCobraOePacketInfo,\n );\n\n const handleContinue = compose(\n ifElse(\n always(checklistComplete),\n handleNavigation,\n compose(\n ifElse(\n gt(diff),\n compose(setWarningModalStatus, always<warningModalStatus>('open')),\n onSave,\n ),\n always(20),\n ),\n ),\n );\n\n const setEligibilityCount = when(isNil, always(''))(eligibilityCount);\n\n return (\n <>\n <FormControl component=\"fieldset\" className=\"my-8\">\n <h5>\n Please verify your number of employees who are currently covered under one or more\n of your COBRA-eligible plans who could potentially be offered COBRA coverage.\n </h5>\n <p>\n <i>\n For example, an active employee with family medical coverage and individual only dental\n counts as one covered active employee.\n </i>\n </p>\n <div className=\"w-2/5 my-5\">\n\n <TextField\n variant=\"outlined\"\n label=\"COBRA Eligible Count\"\n name=\"cobraEligibilityCount\"\n type=\"number\"\n value={setEligibilityCount}\n onChange={onCountChange}\n error={hasError}\n helperText={hasError && 'Eligibility count must be greater than 0'}\n fullWidth\n data-testid=\"cobra-eligibility-count\"\n disabled={checklistComplete}\n />\n </div>\n </FormControl>\n <div className=\"flex flex-row-reverse\">\n <Button\n data-testid=\"eligibility-continue\"\n variant=\"contained\"\n color=\"primary\"\n disabled={hasError}\n onClick={handleContinue}\n >Continue\n </Button>\n <Button\n className=\"mr-4\"\n onClick={compose(dispatch, cancelModalOpened, noop)}\n >Cancel\n </Button>\n </div>\n <CancelModal\n title=\"Eligibility count changed by 20% or more from the previous year.\"\n prompt=\"You've changed the eligible count by 20% or more from the previous year.\n This will result in a significant change to your administrative billing, and should\n represent a roughly 20% increase or decrease in the size of your organization over the past year.\n Are you sure this is correct?\"\n cancelText=\"Yes, continue.\"\n closeText=\"No, stay here.\"\n isOpen={warningModalStatus === 'open'}\n onClose={compose(setWarningModalStatus, always<warningModalStatus>('closed'))}\n onCancel={onSave}\n />\n </>\n );\n}\n\nexport default CobraEligibilityCount;\n","export const YesNoChar = {\n YES: 'Y',\n NO: 'N',\n};\n\nexport const SelectOptions = {\n InsurerNotListed: 'Insurer Not Listed Below',\n};\n","import { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { always, compose, equals, ifElse, nthArg, pathOr, when, T, F, move, findIndex, propEq, or } from 'ramda';\nimport TextField from '@mui/material/TextField';\nimport FormControl from '@mui/material/FormControl';\nimport {\n selectCobraInsurers,\n setCobraPlanOnDeckActivateAccountType,\n setCobraPlanOnDeckPlanTypeId,\n setCobraPlanOnDeckPlanTypeDescription,\n setCobraPlanOnDeckPlanName,\n setCobraPlanOnDeckUpdatePaidThrough,\n setCobraPlanOnDeckNewCarrierName,\n selectCobraPlanOnDeckValidations,\n selectCoverageTypes,\n setCobraPlanOnDeckCarrierNameAndId,\n selectCobraPlanOnDeck,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport { toNumber } from 'shared/utils';\nimport store from 'store';\nimport InputLabel from '@mui/material/InputLabel';\nimport Select from '@mui/material/Select';\nimport RadioGroup from '@mui/material/RadioGroup';\nimport Radio from '@mui/material/Radio';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport Checkbox from '@mui/material/Checkbox';\nimport ButtonBase from '@mui/material/ButtonBase';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport Popover from '@mui/material/Popover';\nimport Typography from '@mui/material/Typography';\nimport { SelectOptions } from 'shared/enums/generic.enum';\nimport { ActivateAccountType } from 'shared/enums/insurers.enum';\n\ninterface Props {\n isChecklistComplete?: boolean;\n}\n\nfunction StepOne({ isChecklistComplete = false }: Props) {\n const dispatch = useDispatch<typeof store.dispatch>();\n const insurers = useSelector(selectCobraInsurers);\n const {\n isNewPlan,\n planTypeId,\n carrier,\n newCarrierName,\n planName,\n activateAccountType,\n updatePaidThrough,\n planTypeDescription,\n } = useSelector(selectCobraPlanOnDeck);\n const carrierFieldsDisabled = or(isChecklistComplete, equals(false, isNewPlan));\n const coverageTypes = useSelector(selectCoverageTypes);\n const validations = useSelector(selectCobraPlanOnDeckValidations);\n const [ hasPlanNameError, setHasPlanNameError ] = useState(false);\n const [ hasCarrierError, setHasCarrierError ] = useState(false);\n const [ hasNewCarrierNameError, setHasNewCarrierNameError ] = useState(false);\n const [ hasPlanTypeIdError, setHasPlanTypeIdError ] = useState(false);\n const [ hasPlanTypeDescriptionError, setHasPlanTypeDescriptionError ] = useState(false);\n const [ anchorEl, setAnchorEl ] = useState<HTMLButtonElement | null>(null);\n\n function handleBlur(error: string, setter: React.Dispatch<React.SetStateAction<boolean>>) {\n return when(always(!!error), compose(setter, T));\n }\n\n function handlePopoverOpen(event: React.MouseEvent<HTMLButtonElement>) {\n setAnchorEl(event.currentTarget);\n }\n\n function handlePopoverClose() {\n setAnchorEl(null);\n }\n\n const popoverOpen = Boolean(anchorEl);\n const popoverId = popoverOpen ? 'paid-through-popover' : undefined;\n\n const handlePlanName = compose(\n when(always(hasPlanNameError), compose(setHasPlanNameError, F)),\n dispatch,\n setCobraPlanOnDeckPlanName,\n pathOr('', [ 'target', 'value' ]),\n );\n\n const handleCarrier = compose(\n when(always(hasNewCarrierNameError), compose(setHasNewCarrierNameError, F)),\n when(always(hasCarrierError), compose(setHasCarrierError, F)),\n dispatch,\n setCobraPlanOnDeckCarrierNameAndId,\n pathOr('', [ 'target', 'value' ]),\n );\n\n const handleNewCarrierName = compose(\n when(always(hasNewCarrierNameError), compose(setHasNewCarrierNameError, F)),\n dispatch,\n setCobraPlanOnDeckNewCarrierName,\n pathOr('', [ 'target', 'value' ]),\n );\n\n const handlePlanTypeIdChange = compose(\n when(always(hasPlanTypeDescriptionError), compose(setHasPlanTypeDescriptionError, F)),\n when(always(hasPlanTypeIdError), compose(setHasPlanTypeIdError, F)),\n dispatch,\n setCobraPlanOnDeckPlanTypeId,\n toNumber,\n pathOr('0', [ 'target', 'value' ]),\n );\n\n const handlePlanTypeDescription = compose(\n when(always(hasPlanTypeDescriptionError), compose(setHasPlanTypeDescriptionError, F)),\n dispatch,\n setCobraPlanOnDeckPlanTypeDescription,\n pathOr('', [ 'target', 'value' ]),\n );\n\n const handleActivateAccountType = compose(\n dispatch,\n setCobraPlanOnDeckActivateAccountType,\n toNumber,\n pathOr(0, [ 'target', 'value' ]),\n );\n\n const handleUpdatePaidThrough = compose(\n dispatch,\n setCobraPlanOnDeckUpdatePaidThrough,\n ifElse(equals(true), always(1), always(0)),\n nthArg(1),\n );\n\n const orderedInsurers = move(findIndex(propEq('insurer', SelectOptions.InsurerNotListed), insurers), 0)(insurers);\n\n useEffect(() => {\n if (!activateAccountType) {\n dispatch(setCobraPlanOnDeckActivateAccountType(ActivateAccountType.PAYMENT));\n }\n });\n\n useEffect(() => {\n if (updatePaidThrough === undefined) {\n dispatch(setCobraPlanOnDeckUpdatePaidThrough(1));\n }\n });\n\n return (\n <>\n <FormControl component=\"fieldset\" className=\"w-full mt-8\">\n <TextField\n variant=\"outlined\"\n label=\"Plan Name\"\n name=\"planName\"\n value={planName ?? ''}\n onChange={handlePlanName}\n onBlur={handleBlur(validations.planName, setHasPlanNameError)}\n fullWidth\n data-testid=\"cobra-plan-rates-plan-name\"\n error={hasPlanNameError}\n helperText={hasPlanNameError && validations.planName}\n disabled={carrierFieldsDisabled}\n />\n </FormControl>\n\n <FormControl variant=\"outlined\" className=\"w-full mt-4\">\n <InputLabel>Carrier/Provider</InputLabel>\n <Select\n label=\"Carrier/Provider\"\n name=\"carrier\"\n onChange={handleCarrier}\n onBlur={handleBlur(validations.carrier, setHasCarrierError)}\n value={carrier}\n native\n fullWidth\n data-testid=\"cobra-plan-rates-carrier\"\n error={hasCarrierError}\n disabled={carrierFieldsDisabled}\n >\n <option value=\"\" />\n {orderedInsurers.map((i) => <option value={i.insurer} key={i.insurer}>{i.insurer}</option>)}\n </Select>\n {\n hasCarrierError && (\n <FormHelperText className=\"Mui-error\">{validations.carrier}</FormHelperText>\n )\n }\n </FormControl>\n\n {\n carrier === SelectOptions.InsurerNotListed && (\n <FormControl component=\"fieldset\" className=\"w-full mt-4\">\n <TextField\n variant=\"outlined\"\n label=\"Carrier Name\"\n name=\"newCarrierName\"\n value={newCarrierName ?? ''}\n onChange={handleNewCarrierName}\n onBlur={handleBlur(validations.newCarrierName, setHasNewCarrierNameError)}\n fullWidth\n data-testid=\"cobra-plan-rates-carrier-name\"\n error={hasNewCarrierNameError}\n helperText={hasNewCarrierNameError && validations.newCarrierName}\n disabled={carrierFieldsDisabled}\n />\n </FormControl>\n )\n }\n\n <FormControl variant=\"outlined\" className=\"w-full mt-4\">\n <InputLabel>Type of Coverage</InputLabel>\n <Select\n label=\"Type of Coverage\"\n onChange={handlePlanTypeIdChange}\n onBlur={handleBlur(validations.planTypeId, setHasPlanTypeIdError)}\n value={planTypeId}\n native\n fullWidth\n data-testid=\"cobra-plan-rates-type-of-coverage\"\n error={hasPlanTypeIdError}\n disabled={carrierFieldsDisabled}\n >\n <option value=\"\" />\n {coverageTypes.map((ct) => <option value={ct.planTypeId} key={ct.name}>{ct.name}</option>)}\n </Select>\n {\n hasPlanTypeIdError && (\n <FormHelperText className=\"Mui-error\">{validations.planTypeId}</FormHelperText>\n )\n }\n </FormControl>\n\n {\n planTypeId === 8 && (\n <FormControl component=\"fieldset\" className=\"w-full mt-4\">\n <TextField\n variant=\"outlined\"\n label=\"If Other, Please Specify\"\n name=\"planTypeDescription\"\n value={planTypeDescription ?? ''}\n onChange={handlePlanTypeDescription}\n onBlur={handleBlur(validations.planTypeDescription, setHasPlanTypeDescriptionError)}\n fullWidth\n data-testid=\"cobra-plan-rates-plan-type-description\"\n error={hasPlanTypeDescriptionError}\n helperText={hasPlanTypeDescriptionError && validations.planTypeDescription}\n disabled={carrierFieldsDisabled}\n />\n </FormControl>\n )\n }\n\n <p className=\"font-bold mt-8\">Activate account based on</p>\n\n <RadioGroup\n aria-label=\"Activate account based on\"\n name=\"activateAccountTypeRadioGroup\"\n value={activateAccountType ?? ActivateAccountType.PAYMENT}\n className=\"mt-8\"\n onChange={handleActivateAccountType}\n >\n <FormControlLabel\n value={ActivateAccountType.PAYMENT}\n control={<Radio color=\"primary\" disabled={isChecklistComplete} />}\n label=\"Payment - COBRA coverage should not be reinstated until the continuant has\n returned their completed election form and also paid their first month's premium. (recommended)\"\n />\n <FormControlLabel\n value={ActivateAccountType.ELECTION}\n className=\"mt-4\"\n control={<Radio color=\"primary\" disabled={isChecklistComplete} />}\n label=\"Election - COBRA coverage can be reinstated upon the continuant returning\n their completed election form.\"\n />\n </RadioGroup>\n\n <FormControlLabel\n className=\"w-full mt-8\"\n control={\n <Checkbox\n value={updatePaidThrough ?? 0}\n checked={updatePaidThrough === 1}\n name=\"updatePaidThrough\"\n color=\"primary\"\n onChange={handleUpdatePaidThrough}\n disabled={isChecklistComplete}\n />\n }\n label=\"Update on paid through dates\"\n labelPlacement=\"end\"\n />\n\n <ButtonBase\n aria-describedby={popoverId}\n data-testid=\"paid-through-trigger\"\n onMouseOver={handlePopoverOpen}\n onMouseOut={handlePopoverClose}\n className=\"relative ml-8 text-base text-sky-600 cursor-help\"\n disableTouchRipple\n >\n What is the paid through date?\n </ButtonBase>\n <Popover\n id=\"paid-through-popover\"\n data-testid=\"paid-through-popover\"\n sx={ { pointerEvents: 'none' } }\n open={popoverOpen}\n anchorEl={anchorEl}\n anchorOrigin={ { vertical: 'top', horizontal: 'center' } }\n transformOrigin={ { vertical: 'bottom', horizontal: 'center' } }\n disableRestoreFocus\n PaperProps={ { style: { width: 350 } } }\n >\n <Typography sx={ { p: 4 } } variant=\"body2\">Flores' recommended option. The carrier will update\n members based upon the date their premiums are paid through. This will not allow the member to\n show as eligible through the end date of their COBRA term, only their paid through date.\n </Typography>\n </Popover>\n </>\n );\n}\n\nexport default StepOne;\n","export function maskPhoneNumber(value: string) {\n const sanitized = value.replace(/[^\\d]/g, '');\n let newStr = '';\n\n if (sanitized.length < 4) {\n newStr = sanitized;\n } else if (sanitized.length < 7) {\n newStr = `(${sanitized.slice(0, 3)}) ${sanitized.slice(3)}`;\n } else {\n newStr = `(${sanitized.slice(0, 3)}) ${sanitized.slice(3,6)}-${sanitized.slice(6, 10)}`;\n }\n\n return newStr;\n}\n","import { useDispatch, useSelector } from 'react-redux';\nimport TextField from '@mui/material/TextField';\nimport FormControl from '@mui/material/FormControl';\nimport RadioGroup from '@mui/material/RadioGroup';\nimport Radio from '@mui/material/Radio';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport { compose, pathOr, always, T, F, when, ifElse, equals, append, filter, complement, join } from 'ramda';\nimport { maskPhoneNumber } from 'shared/utils/mask-phone-number';\nimport {\n setCobraPlanOnDeckCarrierUpdateMethod,\n setCobraPlanOnDeckCarrierContactName,\n setCobraPlanOnDeckCarrierContactEmail,\n setCobraPlanOnDeckCarrierContactEmailTemp,\n setCobraPlanOnDeckCarrierContactEmailArray,\n setCobraPlanOnDeckCarrierContactPhone,\n setCobraPlanOnDeckCarrierUpdateMethodNotes,\n selectCobraPlanOnDeckValidations,\n setCobraPlanOnDeckPolicyNumber,\n selectCobraPlanOnDeck,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport store from 'store';\nimport { InsurerUpdateMethod } from 're-enrollment-checklist/cobra-reenrollment-checklist/cobra-re-enrollment.types';\nimport { toNumber } from 'shared/utils';\nimport { useEffect, useState } from 'react';\nimport Button from '@mui/material/Button';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport FormHelperText from '@mui/material/FormHelperText';\ninterface Props {\n isChecklistComplete?: boolean;\n}\n\nfunction StepTwo({ isChecklistComplete = false }: Props) {\n const dispatch = useDispatch<typeof store.dispatch>();\n const {\n carrierUpdateMethod,\n carrierUpdateMethodNotes,\n planPolicyNumber,\n carrierContactName,\n carrierContactPhone,\n carrierContactEmail,\n carrierContactEmailTemp,\n carrierContactEmailArray,\n } = useSelector(selectCobraPlanOnDeck);\n const validations = useSelector(selectCobraPlanOnDeckValidations);\n const [ hasNotesError, setHasNotesError ] = useState(false);\n const [ hasPolicyNumberError, setHasPolicyNumberError ] = useState(false);\n const [ hasNameError, setHasNameError ] = useState(false);\n const [ hasEmailError, setHasEmailError ] = useState(false);\n const [ hasPhoneError, setHasPhoneError ] = useState(false);\n\n const contactEmailArray = carrierContactEmailArray ?? [];\n\n function handleBlur(error: string, setter: React.Dispatch<React.SetStateAction<boolean>>) {\n return when(always(!!error), compose(setter, T));\n }\n\n const handleContactEmailChange = compose(\n compose(setHasEmailError, F),\n dispatch,\n setCobraPlanOnDeckCarrierContactEmailTemp,\n pathOr('', [ 'target', 'value' ]),\n );\n\n const joinAndSetEmailAddressString = compose(\n dispatch,\n setCobraPlanOnDeckCarrierContactEmail,\n always(join(';', append(carrierContactEmailTemp, contactEmailArray))),\n );\n\n const resetTempEmail = compose(\n compose(setHasEmailError, F),\n dispatch,\n setCobraPlanOnDeckCarrierContactEmailTemp,\n always(''),\n );\n\n const handleAddCarrierContactEmail = compose(\n ifElse(\n compose(equals(true), always(!!validations.carrierContactEmailTemp)),\n compose(setHasEmailError, T),\n compose(resetTempEmail, joinAndSetEmailAddressString),\n ),\n );\n\n const removeCarrierContactEmail = (email: string) => compose(\n dispatch,\n setCobraPlanOnDeckCarrierContactEmail,\n join(';'),\n always(filter(complement(equals(email)), contactEmailArray)),\n );\n\n const handleCarrierUpdateMethod = compose(\n compose(setHasNotesError, F),\n compose(setHasPolicyNumberError, F),\n dispatch,\n setCobraPlanOnDeckCarrierUpdateMethod,\n toNumber,\n pathOr(InsurerUpdateMethod.ClientViaFridayReport, [ 'target', 'value' ]),\n );\n\n const handleNotes = compose(\n when(always(hasNotesError), compose(setHasNotesError, F)),\n dispatch,\n setCobraPlanOnDeckCarrierUpdateMethodNotes,\n pathOr('', [ 'target', 'value' ]),\n );\n\n const setPolicyNumberLabel = ifElse(\n equals(InsurerUpdateMethod.CarrierByTuesdayFile),\n always('Policy Number'),\n always('Policy Number (optional)'),\n )(carrierUpdateMethod);\n\n const handlePolicyNumber = compose(\n when(always(hasPolicyNumberError), compose(setHasPolicyNumberError, F)),\n dispatch,\n setCobraPlanOnDeckPolicyNumber,\n pathOr('', [ 'target', 'value' ]),\n );\n\n const handleContactName = compose(\n when(always(hasNameError), compose(setHasNameError, F)),\n dispatch,\n setCobraPlanOnDeckCarrierContactName,\n pathOr('', [ 'target', 'value' ]),\n );\n\n const handleContactPhone = compose(\n when(always(hasPhoneError), compose(setHasPhoneError, F)),\n dispatch,\n setCobraPlanOnDeckCarrierContactPhone,\n maskPhoneNumber,\n pathOr('', [ 'target', 'value' ]),\n );\n\n useEffect(() => {\n if (!carrierUpdateMethod) {\n dispatch(setCobraPlanOnDeckCarrierUpdateMethod(1));\n }\n });\n\n useEffect(() => {\n if (carrierContactEmail) {\n const emailArray = carrierContactEmail.split(';');\n dispatch(setCobraPlanOnDeckCarrierContactEmailArray(emailArray));\n }\n }, [ dispatch, carrierContactEmail ]);\n\n return (\n <>\n <p className=\"font-bold mt-8\">\n Who is responsible for updating COBRA data for your Company with the insurance carriers?\n </p>\n\n <RadioGroup\n aria-label=\"update method\"\n name=\"carrierUpdateMethod\"\n value={carrierUpdateMethod ?? '1'}\n className=\"mt-8\"\n onChange={handleCarrierUpdateMethod}\n >\n <FormControlLabel\n value={InsurerUpdateMethod.ClientViaFridayReport}\n control={<Radio color=\"primary\" disabled={isChecklistComplete} />}\n label=\"Client via Flores report - Flores will provide a weekly summary report of COBRA updates\n to be processed by HR. COBRA status can also be viewed in real-time on our administration portal\n as needed. We request that you regularly audit the bills you receive from the insurance carrier\n to ensure billing matches COBRA enrollment\"\n />\n <FormControlLabel\n value={InsurerUpdateMethod.CarrierByTuesdayFile}\n className=\"mt-4\"\n control={<Radio color=\"primary\" disabled={isChecklistComplete} />}\n label=\"Insurer via Flores standard update file - Flores will send a standard file to your\n insurance carrier on a weekly basis. Flores will rely upon the insurer's processing department\n for updates to be made timely and accurately. We request that you regularly audit the bills you\n receive from the insurance carrier to ensure billing matches COBRA enrollment\"\n />\n <FormControlLabel\n value={InsurerUpdateMethod.Other}\n className=\"mt-4\"\n control={<Radio color=\"primary\" disabled={isChecklistComplete} data-testid=\"cobra-plan-rates-other\" />}\n label=\"Other\"\n />\n </RadioGroup>\n\n {\n carrierUpdateMethod === InsurerUpdateMethod.Other && (\n <FormControl component=\"fieldset\" className=\"w-full mt-4\">\n <TextField\n variant=\"outlined\"\n label=\"If other, please explain\"\n name=\"carrierUpdateMethodNotes\"\n value={carrierUpdateMethodNotes ?? ''}\n onChange={handleNotes}\n onBlur={handleBlur(validations.carrierUpdateMethodNotes, setHasNotesError)}\n fullWidth\n data-testid=\"cobra-plan-rates-notes\"\n error={hasNotesError}\n helperText={hasNotesError && validations.carrierUpdateMethodNotes}\n disabled={isChecklistComplete}\n />\n </FormControl>\n )\n }\n <FormControl component=\"fieldset\" className=\"w-full mt-4\">\n <TextField\n variant=\"outlined\"\n label={setPolicyNumberLabel}\n name=\"planPolicyNumber\"\n value={planPolicyNumber ?? ''}\n onChange={handlePolicyNumber}\n onBlur={handleBlur(validations.planPolicyNumber, setHasPolicyNumberError)}\n fullWidth\n data-testid=\"cobra-plan-rates-policy-number\"\n error={hasPolicyNumberError}\n helperText={hasPolicyNumberError && validations.planPolicyNumber}\n disabled={isChecklistComplete}\n />\n </FormControl>\n\n <hr />\n <p className=\"font-bold mt-8\">Information for Eligibility Updates</p>\n\n <FormControl component=\"fieldset\" className=\"w-full mt-8\">\n <TextField\n variant=\"outlined\"\n label=\"Contact Name\"\n name=\"carrierContactName\"\n value={carrierContactName ?? ''}\n onChange={handleContactName}\n onBlur={handleBlur(validations.carrierContactName, setHasNameError)}\n fullWidth\n data-testid=\"cobra-plan-rates-contact-name\"\n error={hasNameError}\n helperText={hasNameError && validations.carrierContactName}\n disabled={isChecklistComplete}\n />\n </FormControl>\n <div className=\"flex\">\n <FormControl component=\"fieldset\" className=\"w-full mt-4 nowrap\">\n <TextField\n variant=\"outlined\"\n label=\"Add Contact Email\"\n name=\"addCarrierContactEmail\"\n value={carrierContactEmailTemp ?? ''}\n onChange={handleContactEmailChange}\n fullWidth\n data-testid=\"addCarrierContactEmail\"\n error={hasEmailError}\n disabled={isChecklistComplete}\n />\n </FormControl>\n <Button\n data-testid=\"add-contact-email-button\"\n variant=\"outlined\"\n className=\"w-1/3 mt-4 ml-4 px-4 whitespace-nowrap\"\n onClick={handleAddCarrierContactEmail}\n disabled={isChecklistComplete}\n >\n Add Email\n </Button>\n </div>\n { hasEmailError &&\n <FormHelperText error className=\"py-2 px-4\">\n {validations.carrierContactEmailTemp}\n </FormHelperText>\n }\n { contactEmailArray.length > 0 &&\n <ul className=\"mb-4\">\n { contactEmailArray.map((email: string, i: number) => (\n <li\n key={email}\n data-testid={email}\n className=\"flex items-center\"\n >\n <span className=\"w-full\">{email}</span>\n { !isChecklistComplete && (\n <Button\n data-testid={`remove-${email}`}\n variant=\"text\"\n className=\"w-1/3 ml-4\"\n onClick={removeCarrierContactEmail(email)}\n >\n <DeleteIcon />\n </Button>\n )}\n </li>\n ))}\n </ul>\n }\n <FormControl component=\"fieldset\" className=\"w-full mt-4\">\n <TextField\n variant=\"outlined\"\n label=\"Contact Phone (optional)\"\n name=\"carrierContactPhone\"\n value={carrierContactPhone ?? ''}\n onChange={handleContactPhone}\n onBlur={handleBlur(validations.carrierContactPhone, setHasPhoneError)}\n fullWidth\n data-testid=\"cobra-plan-rates-contact-phone\"\n inputProps={ { maxLength: 14 } }\n error={hasPhoneError}\n helperText={hasPhoneError && validations.carrierContactPhone}\n disabled={isChecklistComplete}\n />\n </FormControl>\n </>\n );\n}\n\nexport default StepTwo;\n","import FormControlLabel from '@mui/material/FormControlLabel';\nimport Radio from '@mui/material/Radio';\nimport RadioGroup from '@mui/material/RadioGroup';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { always, compose, either, gt, ifElse, isNil, pathOr, when, length } from 'ramda';\nimport {\n setCobraPlanOnDeckHasLevels,\n selectOnDeckPlanHasLevels,\n selectOnDeckPlanRatesDocuments,\n selectLevelCoverageTiersOnDeck,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport store from 'store';\nimport { YesNoChar } from 'shared/enums/generic.enum';\n\ninterface Props {\n disabled?: boolean;\n}\n\nfunction RateInformationSelection({ disabled = false }: Props) {\n const dispatch = useDispatch<typeof store.dispatch>();\n const hasRates = always(gt(length(useSelector(selectLevelCoverageTiersOnDeck)), 0));\n const hasFiles = always(gt(length(useSelector(selectOnDeckPlanRatesDocuments)), 0));\n\n const handleChange = compose(\n dispatch,\n setCobraPlanOnDeckHasLevels,\n pathOr(YesNoChar.NO, [ 'target', 'value' ]),\n );\n\n const setRateInformationNow = compose(dispatch, setCobraPlanOnDeckHasLevels, always(YesNoChar.YES));\n const setRateInformationUpload = compose(dispatch, setCobraPlanOnDeckHasLevels, always(YesNoChar.NO));\n\n const hasLevels = compose(\n when(\n isNil,\n ifElse(\n either(hasRates, hasFiles),\n ifElse(\n hasRates,\n setRateInformationNow,\n setRateInformationUpload,\n ),\n setRateInformationNow,\n ),\n ),\n )(useSelector(selectOnDeckPlanHasLevels));\n\n return (\n <div>\n <p className=\"font-bold mt-8\">Rate Information</p>\n <RadioGroup\n aria-label=\"Rate Information\"\n name=\"hasLevelsRadioGroup\"\n data-testid=\"rate-selection-input\"\n value={hasLevels}\n className=\"mt-8\"\n onChange={handleChange}\n >\n <FormControlLabel\n data-testid=\"rates-submit-file\"\n value={YesNoChar.NO}\n control={<Radio color=\"primary\" disabled={disabled} />}\n label=\"I will upload a plan rate sheet (for Age Banded plan rates)\"\n />\n <FormControlLabel\n data-testid=\"rates-enter-info\"\n value={YesNoChar.YES}\n className=\"mt-4\"\n control={<Radio color=\"primary\" disabled={disabled} />}\n label=\"I will enter rate information now\"\n />\n </RadioGroup>\n </div>\n );\n}\n\nexport default RateInformationSelection;\n","import Paper from '@mui/material/Paper';\nimport TableContainer from '@mui/material/TableContainer';\nimport Table from '@mui/material/Table';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport TableBody from '@mui/material/TableBody';\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n removeCobraPlanOnDeckPlanLevel,\n setCobraPlanOnDeckPlanRate,\n selectIsOnDeckPlanNew,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport TextField from '@mui/material/TextField';\nimport React from 'react';\nimport store from 'store';\nimport { always, assoc, compose, pathOr } from 'ramda';\nimport Button from '@mui/material/Button';\nimport { PlanLevel } from 're-enrollment-checklist/re-enrollment-checklist.types';\n\ninterface Props {\n plans: PlanLevel[];\n disabled?: boolean;\n}\n\nfunction RatesTable({ plans, disabled = false }: Props) {\n const isNewPlan = useSelector(selectIsOnDeckPlanNew);\n const dispatch = useDispatch<typeof store.dispatch>();\n const handleOnChange = (plan: PlanLevel) => compose(\n dispatch,\n setCobraPlanOnDeckPlanRate,\n (e) => assoc('levelCost', e, plan),\n pathOr(0, [ 'target', 'value' ]),\n );\n\n return (\n <div>\n <TableContainer component={Paper}>\n <Table >\n <TableHead>\n <TableRow>\n <TableCell>Coverage</TableCell>\n <TableCell>Monthly Rate (without 2%)</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {plans.map((plan) => (\n <TableRow\n key={plan.levelCoverageTier}\n >\n <TableCell component=\"th\" scope=\"row\">\n {plan.levelCoverageTier}\n </TableCell>\n <TableCell align=\"right\">\n <div className=\"flex\">\n <span style={ { alignSelf: 'center' } }>$</span>\n <TextField\n name={`${plan.levelCoverageTier}-input`}\n className=\"ml-1\"\n variant=\"standard\"\n type=\"number\"\n error={plan.levelCost < 0}\n helperText={plan.levelCost < 0 && 'Cost must be a positive number'}\n data-testid={`${plan.levelCoverageTier}-input`}\n value={plan.levelCost || ''}\n onChange={handleOnChange(plan)}\n disabled={disabled}\n />\n {\n (isNewPlan && !disabled) && (\n <Button\n variant=\"text\"\n onClick={compose(\n dispatch,\n removeCobraPlanOnDeckPlanLevel,\n always(plan.levelCoverageTier),\n )}\n > X\n </Button>\n )\n }\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n </div>\n );\n}\n\nexport default RatesTable;\n","import React, { useState } from 'react';\nimport FormControl from '@mui/material/FormControl';\nimport InputLabel from '@mui/material/InputLabel';\nimport Select from '@mui/material/Select';\nimport {\n compose,\n isEmpty,\n pathOr,\n} from 'ramda';\nimport { useDispatch, useSelector } from 'react-redux';\nimport Button from '@mui/material/Button';\nimport store from 'store';\nimport {\n selectLevelCoverageTiersOnDeck,\n setCobraPlanOnDeckNewPlanLevel,\n selectPlanLevelDescriptions,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport { toNumber } from 'shared/utils';\n\nfunction NewRateSelect() {\n const [ levelToAdd, setLevelToAdd ] = useState('');\n const addedLevels = useSelector(selectLevelCoverageTiersOnDeck).map(p => p.levelDescriptionId);\n const dispatch = useDispatch<typeof store.dispatch>();\n const planLevelOptions = useSelector(selectPlanLevelDescriptions);\n\n function handleAddLevelClick() {\n const level = planLevelOptions.find(i => i.levelId === toNumber(levelToAdd));\n dispatch(setCobraPlanOnDeckNewPlanLevel(level));\n setLevelToAdd('');\n }\n\n function isOptionDisabled(strIds: string[]) {\n return addedLevels.some(level => level ? strIds.includes(level.toString()) : false);\n }\n\n return (\n <div data-testid=\"new-rate-select\" className=\"flex\">\n <FormControl variant=\"outlined\" className=\"w-full mt-4 mr-5 w-2/3\">\n <InputLabel>Type of Coverage</InputLabel>\n <Select\n label=\"Type of Coverage\"\n onChange={compose(\n setLevelToAdd,\n pathOr('', [ 'target', 'value' ]),\n )}\n value={levelToAdd}\n native\n fullWidth\n data-testid=\"cobra-plan-rates-type-of-coverage\"\n >\n <option value=\"\" data-testid=\"option-default\" disabled />\n {planLevelOptions\n .filter(({ levelId }) => !addedLevels.includes(levelId))\n .map(({ levelName, levelId, conflictingUnqIds }) => (\n <option\n value={levelId}\n key={levelId}\n data-testid={`option-${levelId}`}\n disabled={isOptionDisabled(conflictingUnqIds.split(','))}\n >\n {levelName}\n </option>\n ))}\n </Select>\n </FormControl>\n <Button\n variant=\"outlined\"\n color=\"primary\"\n className=\"text-uppercase mt-5\"\n data-testid=\"add-rate-button\"\n onClick={handleAddLevelClick}\n disabled={isEmpty(levelToAdd)}\n >\n Add Rate\n </Button>\n </div>\n );\n}\n\nexport default NewRateSelect;\n\n","import React from 'react';\nimport DragAndDropUpload from 'components/shared/DragAndDropUpload';\nimport {\n selectCobraPlanOnDeck,\n selectCompanyId,\n selectOnDeckPlanRatesDocuments,\n setCobraPlanOnDeckPlanInProgressId,\n setCobraPlanOnDeckRatesDocuments,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { uploadPlanRatesDocuments } from 'shared/api/reEnrollmentChecklistApi';\nimport { useParams } from 'react-router-dom';\nimport store from 'store';\nimport { andThen, compose, pathOr, tap } from 'ramda';\ninterface Props {\n disabled?: boolean;\n}\n\nfunction RatesFileUploadSection({ disabled = false }: Props) {\n const dispatch = useDispatch<typeof store.dispatch>();\n const ratesDocuments = useSelector(selectOnDeckPlanRatesDocuments);\n const companyId = useSelector(selectCompanyId);\n const { planYearId = '0' } = useParams<{planYearId: string;}>();\n const onDeckPlan = useSelector(selectCobraPlanOnDeck);\n const upload = compose(\n andThen(\n compose(\n dispatch,\n setCobraPlanOnDeckRatesDocuments,\n tap(\n compose(\n dispatch,\n setCobraPlanOnDeckPlanInProgressId,\n pathOr<number>(0,[ 'planInProgressId' ]),\n ),\n ),\n ),\n ),\n uploadPlanRatesDocuments(\n companyId,\n +planYearId,\n onDeckPlan.planId,\n onDeckPlan.planInProgressId,\n onDeckPlan.isNewPlan ?? true),\n );\n\n return (\n <div key={ratesDocuments.length} data-testid=\"rates-file-upload-section\">\n <DragAndDropUpload onDrop={upload} disabled={disabled} />\n {ratesDocuments.map((file) => (\n <div className=\"my-5\">\n <div className=\"p-2 border rounded-lg border-gray-200 relative\">\n {file.name}\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nexport default RatesFileUploadSection;\n\n","import RateInformationSelection from './step-three/RateInformationSelection';\nimport RatesTable from 're-enrollment-checklist/cobra-reenrollment-checklist/plan-rates/step-three/RatesTable';\nimport NewRateSelect from 're-enrollment-checklist/cobra-reenrollment-checklist/plan-rates/step-three/NewRateSelect';\nimport {\n selectCobraPlanOnDeckConfirmRates,\n selectCobraPlanOnDeckValidations,\n selectIsOnDeckPlanNew,\n selectLevelCoverageTiersOnDeck,\n selectOnDeckPlanHasLevels,\n setCobraPlanOnDeckConfirmRates,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport { useDispatch, useSelector } from 'react-redux';\nimport RatesFileUploadSection\n from 're-enrollment-checklist/cobra-reenrollment-checklist/plan-rates/step-three/RatesFileUploadSection';\nimport { F, T, always, compose, cond, equals, nthArg, when } from 'ramda';\nimport { YesNoChar } from 'shared/enums/generic.enum';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport Checkbox from '@mui/material/Checkbox';\nimport store from 'store';\nimport { useState } from 'react';\n\ninterface Props {\n isChecklistComplete?: boolean;\n}\n\nfunction StepThree({ isChecklistComplete = false }:Props) {\n const dispatch = useDispatch<typeof store.dispatch>();\n const hasLevels = useSelector(selectOnDeckPlanHasLevels);\n const isNewPlan = useSelector(selectIsOnDeckPlanNew);\n const plans = useSelector(selectLevelCoverageTiersOnDeck);\n const [ hasConfirmRatesError, setHasConfirmRatesError ] = useState(false);\n const validations = useSelector(selectCobraPlanOnDeckValidations);\n const confirmRates = useSelector(selectCobraPlanOnDeckConfirmRates) ?? false;\n\n const handleConfirmPlanRatesChange = compose(\n when(always(hasConfirmRatesError), compose(setHasConfirmRatesError, F)),\n dispatch,\n setCobraPlanOnDeckConfirmRates,\n nthArg(1),\n );\n\n return (\n <>\n <RateInformationSelection disabled={isChecklistComplete} />\n {cond<string, JSX.Element>([\n [ equals(YesNoChar.YES), always(\n <div data-testid=\"add-rates-section\" className=\"my-5\">\n <hr />\n <div className=\"my-5\">\n <p className=\"font-bold\">Rates</p>\n <p className=\"mb-5\">\n When providing your updated rates, <strong>please do not add a 2% administration fee</strong> - the\n Flores system will calculate your monthly COBRA\n rates based on the 100% monthly premium cost you provide.\n </p>\n <RatesTable plans={plans} disabled={isChecklistComplete} />\n { !isChecklistComplete && isNewPlan && <NewRateSelect /> }\n { !isChecklistComplete &&\n <div className=\"mt-5\">\n <FormControlLabel\n className=\"w-full mb-6\"\n onBlur={when(\n always(!!validations.confirmRates),\n compose(setHasConfirmRatesError, T),\n )}\n control={\n <Checkbox\n data-testid=\"confirm-plan-rates\"\n value={confirmRates}\n checked={confirmRates}\n name=\"updatePaidThrough\"\n color=\"primary\"\n onChange={handleConfirmPlanRatesChange}\n />\n }\n label=\"I confirm that the above rates are accurate,\n final, and do not include any 2% admin fee for COBRA\"\n labelPlacement=\"end\"\n componentsProps={ { typography: { variant: 'body2' } } }\n />\n { hasConfirmRatesError &&\n <FormHelperText className=\"Mui-error ml-8\">{validations.confirmRates}</FormHelperText>\n }\n </div>\n }\n </div>\n </div>,\n ) ],\n [ equals(YesNoChar.NO), always(\n <RatesFileUploadSection disabled={isChecklistComplete} />,\n ) ],\n ])(hasLevels as string)}\n </>\n );\n}\n\nexport default StepThree;\n","import { ReactElement } from 'react';\nimport Button from '@mui/material/Button';\nimport Step from '@mui/material/Step';\nimport StepLabel from '@mui/material/StepLabel';\nimport Stepper from '@mui/material/Stepper';\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\nimport ChevronRighIcon from '@mui/icons-material/ChevronRight';\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n compose, always, cond, equals, when, gt, inc, lt, length,\n dec, isEmpty, anyPass, isNil, both, complement, ifElse, andThen, any, either, path, lte, F, T, and,\n} from 'ramda';\nimport {\n planRateWizardStepIndexChanged,\n selectPlanRateWizardStepIndex,\n selectCobraPlanOnDeckValidations,\n selectLevelCoverageTiersOnDeck,\n selectOnDeckPlanRatesDocuments,\n resetCobraPlanOnDeckNewPlanLevels,\n resetCobraPlanOnDeckRatesDocuments,\n selectCobraPlan,\n selectCobraPlanOnDeck,\n setCobraPlanOnDeckPlanLevelEffectiveFrom,\n setCobraPlanOnDeckPlanLevelEffectiveTo,\n selectCobraPlanLevelsAllPositive,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport store from 'store';\nimport StepOne from './StepOne';\nimport StepTwo from './StepTwo';\nimport StepThree from './StepThree';\nimport { saveCobraPlan } from 're-enrollment-checklist/re-enrollment-checklist.thunks';\nimport { YesNoChar } from 'shared/enums/generic.enum';\n\ninterface Props {\n onClose: () => void;\n}\n\nfunction AddRateWizardContainer({ onClose } : Props) {\n const activeStep = useSelector(selectPlanRateWizardStepIndex);\n const dispatch = useDispatch<typeof store.dispatch>();\n const {\n carrier,\n planTypeId,\n hasLevels,\n planInProgressId,\n planId,\n } = useSelector(selectCobraPlanOnDeck);\n const planLevelsValid = useSelector(selectCobraPlanLevelsAllPositive);\n const isAddNewPlan = and(isNil(planInProgressId), isNil(planId));\n const validations = useSelector(selectCobraPlanOnDeckValidations);\n const { checklistComplete, planYearEnd, planYearStart } = useSelector(selectCobraPlan);\n const setEffectiveDates = compose(\n compose(dispatch, setCobraPlanOnDeckPlanLevelEffectiveTo, always(planYearEnd)),\n compose(dispatch, setCobraPlanOnDeckPlanLevelEffectiveFrom, always(planYearStart)),\n );\n\n const notLastStep = gt(2);\n const notFirstStep = lt(0);\n\n const prevHandler = compose(\n when(\n notFirstStep,\n compose(\n dispatch,\n planRateWizardStepIndexChanged,\n dec,\n ),\n ),\n always(activeStep),\n );\n\n const handleSaveCobraPlan = compose(\n andThen(compose(\n onClose,\n )),\n dispatch,\n saveCobraPlan,\n setEffectiveDates,\n ifElse(\n equals(YesNoChar.NO),\n compose(dispatch, resetCobraPlanOnDeckNewPlanLevels),\n compose(dispatch, resetCobraPlanOnDeckRatesDocuments),\n ),\n always(hasLevels),\n );\n\n const nextHandler = compose(\n ifElse(\n notLastStep,\n compose(\n dispatch,\n planRateWizardStepIndexChanged,\n inc,\n ),\n handleSaveCobraPlan,\n ),\n always(activeStep),\n );\n\n const empty = (val: any) => () => isEmpty(val) || isNil(val);\n\n const isStepOne = equals(0);\n const isStepTwo = equals(1);\n const isStepThree = equals(2);\n\n const stepOneValidation = anyPass<number>([\n complement(empty(validations.planName)),\n complement(empty(validations.carrier)),\n complement(empty(validations.planTypeId)),\n both(\n compose(equals(8), always(planTypeId) as any),\n complement(empty(validations.planTypeDescription)),\n ),\n both(\n compose(equals('Insurer Not Listed Below'), always(carrier) as any),\n complement(empty(validations.newCarrierName)),\n ),\n ]);\n\n const stepTwoValidation = anyPass<number>([\n complement(empty(validations.carrierContactName)),\n complement(empty(validations.carrierContactEmail)),\n complement(empty(validations.carrierContactPhone)),\n complement(empty(validations.carrierUpdateMethodNotes)),\n complement(empty(validations.planPolicyNumber)),\n ]);\n\n const levels = useSelector(selectLevelCoverageTiersOnDeck);\n const files = useSelector(selectOnDeckPlanRatesDocuments);\n const hasEmptyRates = always(any(compose(either(isNil, isEmpty), path([ 'levelCost' ])))(levels));\n\n const stepThreeValidation = anyPass<number>([\n compose(\n ifElse(\n equals(YesNoChar.NO),\n always(lte(length(files), 0)),\n anyPass<boolean>([\n always(lte(length(levels), 0)),\n hasEmptyRates,\n always(!planLevelsValid),\n always(!!validations.confirmRates),\n ]),\n ),\n always(hasLevels),\n ),\n ]);\n\n const isContinueDisabled = ifElse(\n always(checklistComplete),\n ifElse(isStepThree, T, F),\n cond<number, boolean>([\n [ isStepOne, stepOneValidation ],\n [ isStepTwo, stepTwoValidation ],\n [ isStepThree, stepThreeValidation ],\n ]),\n );\n\n const setContinueButtonText = compose(\n ifElse(\n equals(2),\n ifElse(\n always(isAddNewPlan),\n always('Add Plan'),\n always('Update Plan'),\n ),\n always(<>Continue <ChevronRighIcon /></>),\n ),\n always(activeStep),\n );\n\n return (\n <>\n <div>\n <span className=\"ml-8\">COBRA Insurers/Eligible Plan Entry</span>\n <div className=\"mb-8\">\n <Stepper className=\"mt-4\" activeStep={activeStep} alternativeLabel>\n {new Array(3).fill(null).map((_, i) => (\n <Step key={i}>\n <StepLabel />\n </Step>\n ))}\n </Stepper>\n\n <div className=\"p-8\">\n {\n cond<number, ReactElement>([\n [ isStepOne, always(<StepOne isChecklistComplete={checklistComplete} />) ],\n [ isStepTwo, always(<StepTwo isChecklistComplete={checklistComplete} />) ],\n [ isStepThree, always(<StepThree isChecklistComplete={checklistComplete} />) ],\n ])(activeStep)\n }\n </div>\n\n <div className=\"flex flex-row-reverse mr-8\">\n <Button\n variant=\"contained\"\n onClick={nextHandler}\n disabled={isContinueDisabled(activeStep)}\n data-testid=\"wizard-save-button\"\n >\n {setContinueButtonText()}\n </Button>\n\n { !isStepOne(activeStep) && (\n <Button\n data-testid=\"wizard-back-button\"\n onClick={prevHandler}\n >\n <ChevronLeftIcon /> Back\n </Button>\n )}\n </div>\n </div>\n </div>\n </>\n );\n}\n\nexport default AddRateWizardContainer;\n","import Button from '@mui/material/Button';\nimport EditIcon from '@mui/icons-material/EditOutlined';\nimport { always, equals, ifElse } from 'ramda';\nimport CancelOutlined from '@mui/icons-material/CancelOutlined';\nimport CheckCircleOutline from '@mui/icons-material/CheckCircleOutline';\nimport VisibilityOutlinedIcon from '@mui/icons-material/VisibilityOutlined';\nimport { PlanRatesStatus } from 're-enrollment-checklist/re-enrollment-checklist.types';\n\ninterface Props {\n status: PlanRatesStatus;\n isNewPlan: boolean;\n checklistComplete: boolean;\n handleUpdateRates: () => void;\n handleChangeActiveStatus: () => void;\n}\n\nfunction RatesStatus({\n status,\n isNewPlan,\n checklistComplete,\n handleUpdateRates,\n handleChangeActiveStatus,\n}: Props) {\n const discontinuedClasses = ifElse(\n equals('discontinued'),\n always(' opacity-40'),\n always(''),\n )(status);\n\n const deleteButtonText = ifElse(\n equals(true),\n always('Delete'),\n always('Discontinue'),\n )(isNewPlan);\n\n const planRatesStatus = ifElse(\n equals('discontinued'),\n always(<span className=\"opacity-40\"><CancelOutlined fontSize=\"small\" className=\"mr-1\" />Discontinued</span>),\n ifElse(\n equals('reviewed'),\n always(<span className=\"text-green-600\"><CheckCircleOutline fontSize=\"small\" className=\"mr-1\" />Reviewed</span>),\n always(\n <span className=\"text-red-400\"><VisibilityOutlinedIcon fontSize=\"small\" className=\"mr-1\" />Needs Review</span>,\n ),\n ),\n )(status);\n\n const planActiveStatus = ifElse(\n equals('discontinued'),\n always(<><CheckCircleOutline fontSize=\"small\" className=\"mr-1\" />Reactivate</>),\n always(<><CancelOutlined fontSize=\"small\" className=\"mr-1\" />{deleteButtonText}</>),\n )(status);\n\n return (\n <ul className=\"rounded border text-sm w-[170px]\">\n <li className={`flex items-center p-3 pb-0${discontinuedClasses}`}>Rates status</li>\n <li className=\"flex items-center p-3\">{planRatesStatus}</li>\n {\n status !== 'discontinued' &&\n <li className=\"border-t\">\n <Button\n className=\"text-sm justify-start p-3 normal-case w-full\"\n onClick={handleUpdateRates}\n >\n <EditIcon fontSize=\"small\" className=\"mr-1\" />Update Rates\n </Button>\n </li>\n }\n <li className=\"border-t\">\n <Button\n data-testid=\"delete-discontinue-button\"\n className=\"text-sm justify-start p-3 normal-case w-full\"\n onClick={handleChangeActiveStatus}\n disabled={checklistComplete}\n >\n {planActiveStatus}\n </Button>\n </li>\n </ul>\n );\n}\n\nexport default RatesStatus;\n","import { useDispatch, useSelector } from 'react-redux';\nimport store from 'store';\nimport { always, compose, equals, ifElse, when } from 'ramda';\nimport CancelModal from 'components/shared/CancelModal';\nimport { CobraChecklistPlan } from 're-enrollment-checklist/re-enrollment-checklist.types';\nimport {\n selectCobraPlan,\n setExistingCobraPlanOnDeck,\n setCobraPlanTerminating,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport { saveCobraPlan, deleteCobraInProgressPlan } from 're-enrollment-checklist/re-enrollment-checklist.thunks';\nimport RatesStatus from './RatesStatus';\nimport { useState } from 'react';\n\ninterface Props {\n plan: CobraChecklistPlan;\n uniqueId: number;\n planYear: string;\n handleClickUpdateRates: () => void;\n resetCobraOnDeckPlan: () => void;\n}\n\nfunction PlanRatesCard({\n plan,\n uniqueId,\n planYear,\n handleClickUpdateRates,\n resetCobraOnDeckPlan,\n}: Props) {\n const dispatch = useDispatch<typeof store.dispatch>();\n const { checklistComplete } = useSelector(selectCobraPlan);\n const [ modalIsOpen, setModalIsOpen ] = useState(false);\n\n const toggleModalState = compose(\n setModalIsOpen,\n always(!modalIsOpen),\n );\n\n const deleteInProgressPlan = compose(dispatch, deleteCobraInProgressPlan, always(plan.planInProgressId ?? 0));\n const setExistingPlanTerminating = compose(\n resetCobraOnDeckPlan,\n compose(dispatch, saveCobraPlan),\n compose(dispatch, setExistingCobraPlanOnDeck, always(plan.planId)),\n compose(dispatch, setCobraPlanTerminating, always(plan)),\n when(\n compose(equals(true), always(plan.terminating)),\n deleteInProgressPlan,\n ),\n );\n\n const handleDeletePlan = compose(\n ifElse(\n equals(true),\n deleteInProgressPlan,\n setExistingPlanTerminating,\n ),\n always(plan.isNewPlan),\n );\n\n const handleChangeActiveStatus = compose(\n ifElse(\n equals(true),\n always(handleDeletePlan),\n always(toggleModalState),\n ),\n always(plan.terminating),\n );\n\n const terminatingClasses = ifElse(\n equals(true),\n always(' opacity-40'),\n always(''),\n )(plan.terminating);\n\n const modalContent = ifElse(\n compose(equals(true), always(plan.isNewPlan)),\n always(`Are you sure you want to delete the plan ${plan.planName}?`),\n always(`You are about to mark this benefit as discontinued. This means that you are not \n offering this benefit for the ${planYear} plan year. For any discontinued benefits, you \n should contact your Account Manager to confirm whether participants currently on COBRA \n with this benefit should be transferred to a new benefit plan, and if so what plan they \n should be enrolled in instead.`),\n )(plan);\n\n const modalButtonText = ifElse(\n compose(equals(true), always(plan.isNewPlan)),\n always('Delete'),\n always('Discontinue'),\n )(plan);\n\n return (\n <div className=\"flex my-5 py-5 border-t\" key={uniqueId}>\n <div className={`px-5 w-3/5${terminatingClasses}`}>\n <div>\n <label className=\"text-sm\">Title</label>\n <div className=\"text-2xl\">{plan.planName}</div>\n </div>\n <div className=\"mt-5 flex\">\n <div className=\"w-3/5\">\n <label className=\"text-sm\">Plan Type</label>\n <div className=\"text-2xl\">{plan.planTypeName}</div>\n </div>\n <div>\n <label className=\"text-sm\">Carrier/Provider</label>\n <div className=\"text-2xl\">{plan.carrier}</div>\n </div>\n </div>\n </div>\n <div className=\"w-2/5 flex items-start justify-end\">\n <RatesStatus\n status={plan.ratesStatus || 'reviewed'}\n isNewPlan={plan.isNewPlan}\n checklistComplete={checklistComplete}\n handleUpdateRates={handleClickUpdateRates}\n handleChangeActiveStatus={handleChangeActiveStatus()}\n />\n {\n !plan.terminating &&\n <CancelModal\n isOpen={modalIsOpen}\n onCancel={handleDeletePlan}\n onClose={toggleModalState}\n title={modalContent}\n prompt=\"\"\n cancelText={modalButtonText}\n />\n }\n </div>\n </div>\n );\n}\n\nexport default PlanRatesCard;\n","import React, { useEffect, useState } from 'react';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport Button from '@mui/material/Button';\nimport CloseIcon from '@mui/icons-material/Close';\nimport FormControl from '@mui/material/FormControl';\nimport Skeleton from '@mui/material/Skeleton';\nimport Drawer from '@mui/material/Drawer';\nimport { always, compose, equals,ifElse, T, F, isNil, when, and, anyPass } from 'ramda';\nimport dayjs from 'dayjs';\nimport {\n cancelModalOpened,\n selectCobraPlan,\n selectFetchCobraChecklistPlansStatus,\n selectFetchPlansStatus,\n selectUniqueCobraReEnrollmentChecklistPlans,\n selectDiscontinuedCobraChecklistPlans,\n setNewCobraPlanOnDeck,\n setExistingCobraPlanOnDeck,\n planRateWizardStepIndexChanged,\n setCobraPlanOnDeckInit,\n selectPlanRatesContinueIsDisabled,\n selectCobraPlanTypesStatus,\n selectCobraInsurersStatus,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport { noop } from 'shared/utils';\nimport store from 'store';\nimport {\n fetchCobraChecklistPlans,\n fetchCobraInsurers,\n fetchCobraPlanTypes,\n} from 're-enrollment-checklist/re-enrollment-checklist.thunks';\nimport AddRateWizardContainer from './AddRateWizardContainer';\nimport { CobraChecklistPlan } from 're-enrollment-checklist/re-enrollment-checklist.types';\nimport PlanRatesCard from './PlanRatesCard';\nimport { ApiFetchStatus } from 'shared/enums/api-fetch-status.enum';\n\ntype DrawerStatus = 'open' | 'closed';\n\nfunction PlanRates() {\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n const cobraPlanYear = useSelector(selectCobraPlan);\n const uniqueCobraPlans = useSelector(selectUniqueCobraReEnrollmentChecklistPlans);\n const discontinuedCobraPlans = useSelector(selectDiscontinuedCobraChecklistPlans);\n const [ drawerStatus, setDrawerStatus ] = useState<DrawerStatus>('closed');\n const { planYearId = '0' } = useParams<{planYearId: string;}>();\n const fetchCobraPlansStatus = useSelector(selectFetchCobraChecklistPlansStatus);\n const fetchCobraPlanTypesStatus = useSelector(selectCobraPlanTypesStatus);\n const fetchCobraInsurersStatus = useSelector(selectCobraInsurersStatus);\n const fetchPlansStatus = useSelector(selectFetchPlansStatus);\n const loading = anyPass([\n compose(equals(ApiFetchStatus.PENDING), always(fetchCobraInsurersStatus)),\n compose(equals(ApiFetchStatus.PENDING), always(fetchCobraPlanTypesStatus)),\n compose(equals(ApiFetchStatus.PENDING), always(fetchCobraPlansStatus)),\n compose(equals(ApiFetchStatus.PENDING), always(fetchPlansStatus)),\n ])();\n const isDisabled = useSelector(selectPlanRatesContinueIsDisabled);\n\n const openHandler = compose(\n setDrawerStatus,\n always<DrawerStatus>('open'),\n dispatch,\n setCobraPlanOnDeckInit,\n T,\n );\n\n const handleClickUpdateRates = (plan: CobraChecklistPlan) => compose(\n openHandler,\n compose(dispatch, planRateWizardStepIndexChanged, always(2)),\n ifElse(\n isNil,\n compose(dispatch, setNewCobraPlanOnDeck, always(plan.planInProgressId)),\n compose(dispatch, setExistingCobraPlanOnDeck, always(plan.planId)),\n ),\n always(plan.planId),\n );\n\n const resetCobraOnDeckPlan = compose(\n compose(dispatch, planRateWizardStepIndexChanged, always(0)),\n compose(dispatch, setExistingCobraPlanOnDeck, always(-1)),\n compose(dispatch, setCobraPlanOnDeckInit, F),\n );\n\n const handleClosePlanOnDeck = compose(\n resetCobraOnDeckPlan,\n setDrawerStatus,\n always<DrawerStatus>('closed'),\n );\n\n const getUniqueId = (plan: CobraChecklistPlan) => plan.planId || plan.planInProgressId;\n\n const planYear = `${dayjs(cobraPlanYear.planYearStart).format('MM/DD/YYYY')} \n - ${dayjs(cobraPlanYear.planYearEnd).format('MM/DD/YYYY')}`;\n\n useEffect(() => {\n when(\n always(and(!!cobraPlanYear.companyId, !!cobraPlanYear.planYearId)),\n compose(\n when(\n compose(equals(ApiFetchStatus.UNINITIALIZED), always(fetchCobraInsurersStatus)),\n compose(dispatch, fetchCobraInsurers, always(cobraPlanYear.companyId)),\n ),\n when(\n compose(equals(ApiFetchStatus.UNINITIALIZED), always(fetchCobraPlanTypesStatus)),\n compose(dispatch, fetchCobraPlanTypes, always(cobraPlanYear.companyId)),\n ),\n when(\n compose(equals(ApiFetchStatus.UNINITIALIZED), always(fetchCobraPlansStatus)),\n compose(dispatch, fetchCobraChecklistPlans, always(cobraPlanYear)),\n ),\n ),\n )(cobraPlanYear);\n }, [\n dispatch,\n fetchCobraInsurersStatus,\n fetchCobraPlanTypesStatus,\n fetchCobraPlansStatus,\n cobraPlanYear,\n ]);\n\n return (\n <>\n <FormControl component=\"fieldset\" className=\"my-8 w-full\">\n <p className=\"font-bold\">\n Provide all Medical, Dental, Vision, Medical FSA, HRA, and any Group Health plans eligible for COBRA.\n </p>\n {\n !cobraPlanYear.checklistComplete &&\n <Button\n data-testid=\"add-new-plan\"\n variant=\"contained\"\n color=\"primary\"\n className=\"mt-4\"\n style={ { width: 'max-content' } }\n onClick={openHandler}\n >\n + Add New Plan\n </Button>\n }\n {\n ifElse(\n equals(true),\n always(\n <>\n <Skeleton variant=\"rectangular\" height={250} className=\"w-full mt-4\" />\n <Skeleton variant=\"rectangular\" height={250} className=\"w-full mt-4\" />\n </>,\n ),\n always(uniqueCobraPlans.map(plan => {\n const uniqueId = getUniqueId(plan) as number;\n\n return (\n <PlanRatesCard\n key={uniqueId}\n plan={plan}\n uniqueId={uniqueId}\n planYear={planYear}\n handleClickUpdateRates={handleClickUpdateRates(plan)}\n resetCobraOnDeckPlan={resetCobraOnDeckPlan}\n />\n );\n })),\n )(loading)\n }\n </FormControl>\n <div className=\"flex justify-end\">\n <Button\n className=\"mr-4\"\n onClick={compose(dispatch, cancelModalOpened, noop)}\n >Cancel\n </Button>\n <Button\n data-testid=\"eligibility-continue\"\n variant=\"contained\"\n color=\"primary\"\n disabled={isDisabled}\n onClick={compose(\n history.push,\n always(`/reenrollment-checklist/cobra-plan/${planYearId}/summary`),\n )}\n >Continue\n </Button>\n </div>\n {\n discontinuedCobraPlans.length > 0 &&\n <div className=\"mt-8\">\n <h5>Discontinued Plans</h5>\n {discontinuedCobraPlans.map(plan => {\n const uniqueId = getUniqueId(plan) as number;\n\n return (\n <PlanRatesCard\n key={uniqueId}\n plan={plan}\n uniqueId={uniqueId}\n planYear={planYear}\n handleClickUpdateRates={handleClickUpdateRates(plan)}\n resetCobraOnDeckPlan={resetCobraOnDeckPlan}\n />\n );\n })}\n </div>\n }\n <Drawer\n anchor=\"right\"\n open={drawerStatus === 'open'}\n onClose={handleClosePlanOnDeck}\n >\n <div style={ { width: 500 } }>\n <div className=\"flex flex-row-reverse p-4\">\n <CloseIcon className=\"cursor-pointer\" onClick={handleClosePlanOnDeck} />\n </div>\n <AddRateWizardContainer\n onClose={handleClosePlanOnDeck}\n />\n </div>\n </Drawer>\n </>\n );\n}\n\nexport default PlanRates;\n","import React from 'react';\nimport AccordionDetails from '@mui/material/AccordionDetails';\nimport Typography from '@mui/material/Typography';\nimport { always, complement, cond, equals, pathOr, isNil, compose, either, isEmpty } from 'ramda';\nimport { InsurerUpdateMethod } from 're-enrollment-checklist/cobra-reenrollment-checklist/cobra-re-enrollment.types';\nimport RatesTable from 're-enrollment-checklist/cobra-reenrollment-checklist/plan-rates/step-three/RatesTable';\nimport { CobraChecklistPlan } from 're-enrollment-checklist/re-enrollment-checklist.types';\n\ninterface Props {\n plan: CobraChecklistPlan;\n}\n\nfunction SummaryAccordion({ plan }: Props) {\n const hasLevels = compose(\n equals('Y'),\n pathOr('', [ 'hasLevels' ]),\n )(plan);\n\n const hasUploadedFiles = compose(\n complement(either(isNil, isEmpty)),\n pathOr(null, [ 'reenrollmentRatesDocs' ]),\n )(plan);\n\n return (\n <AccordionDetails>\n <Typography>{plan.planName}</Typography>\n <div className=\"m-5 flex flex-wrap\">\n\n <div className=\"w-1/4 p-1\">\n <strong>\n Carrier/Provider:\n </strong>\n <p>{plan.carrier}</p>\n </div>\n\n {plan.planPolicyNumber && (\n <div className=\"w-1/4 p-1\">\n <strong>\n Policy Number:\n </strong>\n <p>{plan.planPolicyNumber}</p>\n </div>\n )}\n\n <div className=\"w-1/4 p-1\">\n <strong>\n Activate account based on:\n </strong>\n <p>{plan.activateAccountType === 0 ? 'Election' : 'Payment (recommended)'}</p>\n </div>\n\n <div className=\"w-1/4 p-1\">\n <strong>\n Update on paid through dates:\n </strong>\n <p>{plan.updatePaidThrough === 1 ? 'Yes' : 'No'}</p>\n </div>\n\n <div className=\"w-1/4 p-1\">\n <strong>\n Responsible for updating COBRA data for your Company with the insurance carriers?\n </strong>\n {cond([\n [ equals(InsurerUpdateMethod.ClientViaFridayReport),\n always(<p>Client via Flores report</p>) ],\n [ equals(InsurerUpdateMethod.CarrierByTuesdayFile),\n always(<p>Insurer via Flores standard update file</p>) ],\n [ equals(InsurerUpdateMethod.Other), always(<p>Other</p>) ],\n ])(plan.carrierUpdateMethod as never)}\n </div>\n\n <div className=\"w-1/4 p-1\">\n <strong>\n Eligibility Updates - Contact Name\n </strong>\n <p>{plan.carrierContactName}</p>\n </div>\n\n {!!plan.carrierContactPhone && (\n <div className=\"w-1/4 p-1\">\n <strong>\n Eligibility Updates - Contact Phone\n </strong>\n <p>{plan.carrierContactPhone}</p>\n </div>\n )}\n </div>\n {!hasLevels && hasUploadedFiles && (\n <div className=\"w-full\">\n <strong>Rate Information Files</strong>\n {plan.reenrollmentRatesDocs.map(i => (<p key={i.name}>{i.name}.{i.extension}</p>))}\n </div>\n )}\n {hasLevels && <RatesTable plans={plan.planLevels} disabled />}\n </AccordionDetails>\n );\n}\n\nexport default SummaryAccordion;\n","import React, { ReactElement } from 'react';\nimport { always, compose, equals, ifElse, andThen } from 'ramda';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport Button from '@mui/material/Button';\nimport Accordion from '@mui/material/Accordion';\nimport AccordionSummary from '@mui/material/AccordionSummary';\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\nimport Typography from '@mui/material/Typography';\nimport {\n CancelModalStatus,\n selectCobraPlan,\n selectCobraReEnrollmentChecklistPlansByType,\n selectDoesRedirectToOePackets,\n selectIsFinalizeCobraChecklistDisabled,\n selectPlanRatesContinueIsDisabled,\n selectRedirectModalStatus,\n setRedirectModalStatus,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport { CobraChecklistPlan } from 're-enrollment-checklist/re-enrollment-checklist.types';\nimport SummaryAccordion from 're-enrollment-checklist/cobra-reenrollment-checklist/summary/SummaryAccordion';\nimport { finalizeCobraPlans } from 're-enrollment-checklist/re-enrollment-checklist.thunks';\nimport store from 'store';\nimport { noop } from 'shared/utils';\nimport CancelModal from 'components/shared/CancelModal';\nimport FormHelperText from '@mui/material/FormHelperText';\n\nfunction SummaryTab(): ReactElement {\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n const { planYearId = '0' } = useParams<{planYearId: string;}>();\n const cobraOePacketPlan = useSelector(selectCobraPlan);\n const { checklistComplete } = cobraOePacketPlan;\n const isFinalizeDisabled = useSelector(selectIsFinalizeCobraChecklistDisabled);\n const oeCoverLetterAnswer = !!cobraOePacketPlan.cobraOeTemplateCoverLetter ? 'Yes' : 'No';\n const redirectModalStatus = useSelector(selectRedirectModalStatus);\n\n const cobraPlans = useSelector(selectCobraReEnrollmentChecklistPlansByType);\n const setOeHandlerAnswer = compose(\n ifElse(\n equals(1),\n always('Yes (results in a fee of $15 per packet plus printing and shipping, $75 minimum.)'),\n always('No (no fee)'),\n ),\n )(cobraOePacketPlan.cobraOeHandler);\n const setCoverLetterAnswer = compose(\n ifElse(\n equals(1),\n always('Yes'),\n always(oeCoverLetterAnswer),\n ),\n )(cobraOePacketPlan.cobraOeHandler);\n\n const skipOePackets = useSelector(selectDoesRedirectToOePackets);\n\n const changeRedirectModalStatus = (status: CancelModalStatus) => compose(\n dispatch, setRedirectModalStatus, always(status),\n );\n const isPlanRatesIncomplete = useSelector(selectPlanRatesContinueIsDisabled);\n\n return (\n <div>\n <div className=\"my-10\">\n <div className=\"flex justify-between\">\n <p>Cobra Eligible Count</p>\n <Button\n className=\"text-sm\"\n variant=\"text\"\n onClick={compose(history.push, always(`/reenrollment-checklist/cobra-plan/${planYearId}/eligible-count`))}\n >Edit\n </Button>\n </div>\n <hr />\n { !cobraOePacketPlan.eligibilitySectionComplete &&\n <FormHelperText error className=\"mt-2\" data-testid=\"eligibility-error\">\n This section is incomplete. Please click \"Edit\" above and complete the required fields.\n </FormHelperText>\n }\n <div className=\"w-3/5\">\n <div className=\"my-5\">\n <h6>\n Number of employees who are currently covered under one or more\n of your COBRA-eligible plans who could potentially be offered COBRA coverage.\n </h6>\n <p>{cobraOePacketPlan.cobraOeNewEligibleCount}</p>\n </div>\n </div>\n\n </div>\n <div className=\"my-10\">\n <div className=\"flex justify-between\">\n <p>OE Packets</p>\n <Button\n className=\"text-sm\"\n variant=\"text\"\n onClick={compose(\n history.push,\n always(`/reenrollment-checklist/cobra-plan/${planYearId}/oe-packets-options`),\n )}\n >Edit\n </Button>\n </div>\n <hr />\n { !cobraOePacketPlan.oeOptionsSectionComplete &&\n <FormHelperText error className=\"mt-2\" data-testid=\"oe-packets-error\">\n This section is incomplete. Please click \"Edit\" above and complete the required fields.\n </FormHelperText>\n }\n <div className=\"w-3/5\">\n <div className=\"my-5\">\n <h6>Would you like Flores to mail your packets to participants directly?</h6>\n { cobraOePacketPlan.oeOptionsSectionComplete &&\n <p>{setOeHandlerAnswer}</p>\n }\n </div>\n\n <div className=\"my-5\">\n <h6>\n Would you like to use Flores' system to generate a template cover letter and\n election form that you can mail to your participants at no additional cost?\n </h6>\n { cobraOePacketPlan.oeOptionsSectionComplete &&\n <p>{setCoverLetterAnswer}</p>\n }\n </div>\n </div>\n </div>\n\n <div className=\"my-10\">\n <div className=\"flex justify-between\">\n <p>Plan Rates</p>\n <Button\n className=\"text-sm\"\n variant=\"text\"\n onClick={compose(\n history.push,\n always(`/reenrollment-checklist/cobra-plan/${planYearId}/plan-rates`),\n )}\n >Edit\n </Button>\n </div>\n <hr />\n { isPlanRatesIncomplete &&\n <FormHelperText error className=\"mt-2\" data-testid=\"plan-rates-error\">\n This section is incomplete. Please click \"Edit\" above and review plans and rates.\n </FormHelperText>\n }\n\n <div className=\"my-5\">\n {Object\n .entries(cobraPlans)\n .map(([ type, plans ]: [string, CobraChecklistPlan[]]) => (\n <Accordion key={type}>\n <AccordionSummary\n expandIcon={<ExpandMoreIcon />}\n aria-controls=\"panel1a-content\"\n id=\"panel1a-header\"\n >\n <Typography>{type}</Typography>\n </AccordionSummary>\n {plans.map(plan => (\n <SummaryAccordion key={plan.planId} plan={plan} />\n ))}\n </Accordion>\n ))\n }\n </div>\n </div>\n <div className=\"flex flex-row-reverse\">\n {\n !checklistComplete &&\n <Button\n data-testid=\"complete-button\"\n variant=\"contained\"\n color=\"primary\"\n disabled={isFinalizeDisabled}\n onClick={compose(\n andThen(\n ifElse(\n always(skipOePackets),\n compose(\n history.push,\n always(`/reenrollment-checklist`),\n ),\n changeRedirectModalStatus('open'),\n ),\n ),\n dispatch,\n finalizeCobraPlans,\n noop,\n )}\n >Complete and Submit\n </Button>\n }\n\n <Button\n className=\"mr-4\"\n onClick={compose(\n history.push,\n always(`/reenrollment-checklist`),\n )}\n >\n Cancel\n </Button>\n { isFinalizeDisabled &&\n <FormHelperText error className=\"mr-4 self-center\" data-testid=\"finalize-error\">\n There are more items that need your attention before you can complete this checklist.\n </FormHelperText>\n }\n <CancelModal\n title=\"\"\n prompt=\"You have elected to have Flores generate Open Enrollment Packets for your COBRA Participants.\n This will require some additional information. You will now see a new checklist for COBRA Open Enrollment\n Packets on the Re-Enrollment landing page.\n Would you like to go to this checklist now?\"\n closeText=\"Yes, take me to the checklist\"\n cancelText=\"No, take me to the Re-Enrollment Checklist landing page\"\n isOpen={redirectModalStatus === 'open'}\n onClose={compose(\n changeRedirectModalStatus('closed'),\n history.push,\n always(`/reenrollment-checklist/cobra/${planYearId}/cover-letter-info`),\n )}\n onCancel={compose(\n changeRedirectModalStatus('closed'),\n history.push,\n always(`/reenrollment-checklist`),\n )}\n />\n </div>\n </div>\n );\n}\n\nexport default SummaryTab;\n","import React, { ReactElement, useEffect } from 'react';\nimport { useHistory, useParams } from 'react-router-dom';\nimport Tabs from '@mui/material/Tabs';\nimport Tab from '@mui/material/Tab';\nimport Skeleton from '@mui/material/Skeleton';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { compose, always, cond, equals, T, all, any } from 'ramda';\nimport { usePageTitle } from 'shared/custom-hooks/usePageTitle';\nimport {\n ApiStatus,\n cancelModalClosed,\n selectCancelModalStatus,\n selectCoverageTypesRequestStatus,\n selectFetchPlansStatus,\n selectReEnrollmentPlansByPlanYearId,\n selectSaveCobraOePacketInfoStatus,\n selectSaveCobraPlanStatus,\n selectDeleteCobraInProgressPlanStatus,\n selectIsFinalizeCobraChecklistDisabled,\n selectPlanLevelDescriptionsStatus,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport {\n fetchCoverageTypes,\n fetchPlanLevelDescriptions,\n fetchReEnrollmentChecklistPlan,\n} from 're-enrollment-checklist/re-enrollment-checklist.thunks';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport TabPanel from 'components/shared/TabPanel';\nimport Loading from 'components/shared/Loading';\nimport CancelModal from 'components/shared/CancelModal';\nimport OePacketsOptions from 're-enrollment-checklist/cobra-reenrollment-checklist/oe-packets-options/OePacketsOptions';\nimport CobraEligibilityCount\n from 're-enrollment-checklist/cobra-reenrollment-checklist/cobra-eligibility-count/CobraEligibilityCount';\nimport store from 'store';\nimport PlanRates from './plan-rates/PlanRates';\nimport SummaryTab from 're-enrollment-checklist/cobra-reenrollment-checklist/summary/Summary';\nimport { toNumber } from 'shared/utils';\n\ntype CobraTab = 'eligible-count' | 'oe-packets-options' | 'plan-rates' | 'summary';\n\nfunction CobraPlanReEnrollmentChecklist(): ReactElement {\n usePageTitle('COBRA Enrollment');\n\n const history = useHistory();\n const { compid: companyId } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const { planYearId = '0', tab = 'eligible-count' } = useParams<{planYearId: string; tab?: CobraTab;}>();\n const plan = useSelector(selectReEnrollmentPlansByPlanYearId(+planYearId));\n const dispatch = useDispatch<typeof store.dispatch>();\n const plansRequestStatus = useSelector(selectFetchPlansStatus);\n const coverageTypeRequestStatus = useSelector(selectCoverageTypesRequestStatus);\n const planLevelDescriptionsStatus = useSelector(selectPlanLevelDescriptionsStatus);\n const updateCobraPlanStatus = useSelector(selectSaveCobraPlanStatus);\n const updatePlanYearStatus = useSelector(selectSaveCobraOePacketInfoStatus);\n const cancelModalStatus = useSelector(selectCancelModalStatus);\n const deleteCobraInProgressPlanStatus = useSelector(selectDeleteCobraInProgressPlanStatus);\n const summaryDisabled = useSelector(selectIsFinalizeCobraChecklistDisabled);\n\n const fetchStatus = cond<string[], ApiStatus>([\n [ any(equals('pending')), always('pending') ],\n [ any(equals('rejected')), always('rejected') ],\n [ all(equals('fulfilled')), always('fulfilled') ],\n ])([ plansRequestStatus, coverageTypeRequestStatus, planLevelDescriptionsStatus ]);\n\n useEffect(() => {\n if (!plan) {\n dispatch(fetchReEnrollmentChecklistPlan(companyId));\n }\n\n if (coverageTypeRequestStatus === 'uninitialized') {\n dispatch(fetchCoverageTypes({ companyId, planYearId: toNumber(planYearId) }));\n }\n\n if (planLevelDescriptionsStatus === 'uninitialized') {\n dispatch(fetchPlanLevelDescriptions({ companyId, planYearId: toNumber(planYearId) }));\n }\n }, [\n planYearId,\n dispatch,\n plan,\n companyId,\n coverageTypeRequestStatus,\n planLevelDescriptionsStatus,\n ]);\n\n function handleTabChange (_: React.ChangeEvent<{}>, newTab: string) {\n history.push(`/reenrollment-checklist/cobra-plan/${planYearId}/${newTab}`);\n }\n\n return (\n <>\n <PageContentPaper className=\"mt-4 mb-8\" data-testid=\"cobra-plan-tabbed-form\">\n <div className=\"flex flex-col justify-around\">\n <Tabs\n indicatorColor=\"primary\"\n textColor=\"primary\"\n className=\"-ml-4 -mt-4 flex justify-around\"\n value={tab}\n centered\n onChange={handleTabChange}\n >\n <Tab\n data-testid=\"eligible-count-tab\"\n value=\"eligible-count\"\n label=\"Cobra Eligible Count\"\n />\n <Tab\n data-testid=\"oe-packets-options-tab\"\n value=\"oe-packets-options\"\n label=\"OE Packets\"\n />\n <Tab\n data-testid=\"plan-rates-tab\"\n value=\"plan-rates\"\n label=\"Plan Rates\"\n />\n <Tab\n data-testid=\"summary-tab\"\n value=\"summary\"\n label=\"Summary\"\n disabled={summaryDisabled}\n />\n </Tabs>\n <hr />\n <TabPanel value={tab} index=\"eligible-count\">\n {\n cond<string, ReactElement>([\n [ equals('pending'), always(\n <>\n <Skeleton variant=\"rectangular\" height={100} className=\"w-full mt-4\" />\n <Skeleton variant=\"rectangular\" height={25} className=\"w-4/5 my-2\" />\n <Skeleton variant=\"rectangular\" height={50} className=\"w-3/5 my-2\" />\n </>,\n ) ],\n [ T, always(<CobraEligibilityCount />) ]],\n )(fetchStatus)\n }\n </TabPanel>\n <TabPanel value={tab} index=\"oe-packets-options\">\n {\n cond<string, ReactElement>([\n [ equals('pending'), always(\n <>\n <Skeleton variant=\"rectangular\" height={22} className=\"w-1/2 mt-4\" />\n <Skeleton variant=\"rectangular\" height={91} className=\"w-1/3 my-2\" />\n </>,\n ) ],\n [ T, always(<OePacketsOptions />) ]],\n )(fetchStatus)\n }\n </TabPanel>\n <TabPanel value={tab} index=\"plan-rates\">\n {\n cond<string, ReactElement>([\n [ equals('pending'), always(\n <>\n <Skeleton variant=\"rectangular\" height={100} className=\"w-full mt-8\" />\n <Skeleton variant=\"rectangular\" height={50} className=\"w-1/5 my-2\" />\n <Skeleton variant=\"rectangular\" height={250} className=\"w-full mt-4\" />\n <Skeleton variant=\"rectangular\" height={250} className=\"w-full mt-4\" />\n </>,\n ) ],\n [ T, always(<PlanRates />) ]],\n )(fetchStatus)\n }\n </TabPanel>\n <TabPanel value={tab} index=\"summary\">\n {\n cond<string, ReactElement>([\n [ equals('pending'), always(\n <>\n <Skeleton variant=\"rectangular\" height={100} className=\"w-full mt-8\" />\n </>,\n ) ],\n [ T, always(<SummaryTab />) ]],\n )(fetchStatus)\n }\n </TabPanel>\n </div>\n </PageContentPaper>\n {\n\n updateCobraPlanStatus === 'pending'\n || updatePlanYearStatus === 'pending'\n || deleteCobraInProgressPlanStatus === 'pending'\n ? <Loading />\n : <></>\n }\n <CancelModal\n isOpen={cancelModalStatus === 'open'}\n onCancel={compose(history.push, always('/reenrollment-checklist'))}\n onClose={compose(dispatch, cancelModalClosed)}\n />\n </>\n );\n}\n\nexport default CobraPlanReEnrollmentChecklist;\n","import { useDispatch, useSelector } from 'react-redux';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { useParams } from 'react-router';\nimport { setPageTitle } from 'components/app-settings.slice';\nimport store from 'store';\nimport { useEffect } from 'react';\nimport { setSelectedParticipant } from 'participant-search/participant.slice';\n\nfunction LegacyChecklists() {\n const { compid: companyId, medplancd: medPlanCode } = useSelector(selectSelectedCompany)\n ?? { compid: 0, medplancd: '' };\n const { planYearId = '0', planType = '0' } = useParams<{planYearId?: string; planType: string;}>();\n const dispatch = useDispatch<typeof store.dispatch>();\n\n useEffect(() => {\n dispatch(setPageTitle(''));\n dispatch(setSelectedParticipant(null));\n }, [ dispatch ]);\n\n return (\n <div className=\"h-screen\">\n <iframe\n // eslint-disable-next-line max-len\n src={`/reenroll/reenrollment.html?planId=${medPlanCode}&compid=${companyId}&pyrid=${planYearId}&plantype=${planType}`}\n className=\"w-full h-full\"\n title={`${planType.toUpperCase} checklist`}\n data-testid=\"hsa-checklist\"\n // eslint-disable-next-line max-len\n sandbox=\"allow-scripts allow-forms allow-top-navigation allow-top-navigation-by-user-activation allow-same-origin\"\n />\n </div>\n );\n}\n\nexport default LegacyChecklists;\n\n","import { always, compose, cond, pathEq, T } from 'ramda';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport Box from '@mui/material/Box';\nimport Table from '@mui/material/Table';\nimport TableHead from '@mui/material/TableHead';\nimport TableBody from '@mui/material/TableBody';\nimport dayjs from 'dayjs';\nimport { HistoricalPlanWithRates } from 'rates-history/rates-history.types';\n\ninterface Props {\n plan: HistoricalPlanWithRates;\n}\n\nfunction PlanRow({ plan }: Props) {\n const hasRates = plan\n .coverageTiers\n .reduce((acc, cur) => {\n return acc + cur.tierRates.length;\n }, 0) > 0;\n\n const getRateAsCurrencyString = (rate: number) => {\n return rate.toLocaleString('en-US', {\n style: 'currency',\n currency: 'USD',\n });\n };\n\n const isCobra = pathEq([ 'planType' ], 'cobra', plan);\n\n const add2Percent = (rate: number) => {\n return rate + ((rate / 100) * 2);\n };\n\n return (\n <>\n {cond([\n [ always(hasRates), always(\n <>\n <TableRow data-testid=\"plan-row\">\n <TableCell className=\"w-full\" component=\"th\" scope=\"row\">\n {plan.planName}\n </TableCell>\n </TableRow>\n <TableRow>\n <TableCell style={ { paddingBottom: 0, paddingTop: 0 } } colSpan={6}>\n <Box sx={ { margin: 1 } }>\n <Table size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>Coverage Tier</TableCell>\n <TableCell>Year Begin</TableCell>\n <TableCell>Year End</TableCell>\n <TableCell>Rate</TableCell>\n {\n isCobra\n ? (\n <TableCell\n data-testId=\"2-percent-rate-header\"\n >Rate + 2%\n </TableCell>\n )\n : (<></>)\n }\n </TableRow>\n </TableHead>\n {plan.coverageTiers\n .filter(c => c.tierRates.length > 0)\n .map((coverageTier) => (\n <TableBody data-testid={coverageTier.tierId} key={coverageTier.tierId}>\n <TableRow>\n <TableCell>\n {coverageTier.tierName}\n </TableCell>\n <TableCell />\n <TableCell />\n <TableCell />\n {isCobra\n ? (<TableCell />)\n : (<></>)\n }\n </TableRow>\n {coverageTier.tierRates.map((rate) => (\n <TableRow key={rate.rateId}>\n <TableCell />\n <TableCell>{dayjs(rate.rateBeginDate).format('MM/DD/YYYY')}</TableCell>\n <TableCell>{dayjs(rate.rateEndDate).format('MM/DD/YYYY')}</TableCell>\n <TableCell>{getRateAsCurrencyString(rate.rate)}</TableCell>\n {\n isCobra ? (\n <TableCell data-testid={`${rate.rateId}-rate-with-2-percent`}>{\n compose(\n getRateAsCurrencyString,\n add2Percent,\n )(rate.rate)}\n </TableCell>\n )\n : (<></>)\n }\n </TableRow>\n ))}\n </TableBody>\n ))}\n </Table>\n </Box>\n </TableCell>\n </TableRow>\n </>,\n ) ],\n [ T, always(<></>) ],\n ])()}\n </>\n );\n}\n\nexport default PlanRow;\n","import React, { ReactElement } from 'react';\nimport FormControl from '@mui/material/FormControl';\nimport InputLabel from '@mui/material/InputLabel';\nimport Select from '@mui/material/Select';\nimport TableContainer from '@mui/material/TableContainer';\nimport Paper from '@mui/material/Paper';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport Skeleton from '@mui/material/Skeleton';\nimport { useDispatch } from 'react-redux';\nimport { ActionCreatorWithPayload } from '@reduxjs/toolkit';\nimport { always, compose, cond, equals, pathOr, T } from 'ramda';\nimport store from 'store';\nimport { toNumber } from 'shared/utils';\nimport PlanRow from 'rates-history/PlanRow';\nimport { HistoricalPlanWithRates, PlanYear } from 'rates-history/rates-history.types';\n\ninterface Props {\n plans: HistoricalPlanWithRates[];\n planYears: PlanYear[];\n reducer: ActionCreatorWithPayload<number>;\n fetchStatus: string;\n}\n\nfunction HistoryTable({ plans, planYears, reducer, fetchStatus }: Props) {\n const dispatch = useDispatch<typeof store.dispatch>();\n\n return (\n <>\n <FormControl variant=\"outlined\" className=\"w-2/5 my-4 \">\n <InputLabel>Plan Year</InputLabel>\n <Select\n label=\"Plan Year\"\n onChange={compose(\n dispatch,\n reducer,\n toNumber,\n pathOr('-1', [ 'target', 'value' ]),\n )}\n native\n >\n <option value={-1} >All Plan Years</option>\n {planYears.map((p) => <option value={p.planYearId} key={p.planYearId}>{p.planYearName}</option>)}\n </Select>\n </FormControl>\n <TableContainer component={Paper}>\n <Table>\n <TableBody>\n {\n cond<string, ReactElement| ReactElement[]>([\n [ equals('pending'), always(\n <>\n <Skeleton\n data-testid=\"loading\"\n variant=\"rectangular\"\n height={70}\n style={ { marginBottom: '0.1rem' } }\n />\n <Skeleton\n data-testid=\"loading\"\n variant=\"rectangular\"\n height={70}\n style={ { marginBottom: '0.1rem' } }\n />\n <Skeleton\n data-testid=\"loading\"\n variant=\"rectangular\" height={70}\n />\n </>,\n ) ],\n [ T, always(plans\n .filter(p => p.coverageTiers.length > 0)\n .map((plan) => (\n <PlanRow plan={plan} key={plan.planId} />\n ))) ]],\n )(fetchStatus)\n }\n </TableBody>\n </Table>\n </TableContainer>\n </>\n );\n}\n\nexport default HistoryTable;\n","import React, { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { compose, nthArg } from 'ramda';\nimport Paper from '@mui/material/Paper';\nimport Tabs from '@mui/material/Tabs';\nimport Tab from '@mui/material/Tab';\nimport store from 'store';\nimport {\n cobraPlanYearFilterChanged,\n selectFetchCobraRatesHistoryStatus,\n selectHistoricalCobraPlans,\n selectCobraHistoricalPlanYears,\n selectFetchDirectBillRatesHistoryStatus,\n selectHistoricalDirectBillPlans,\n selectDirectBillHistoricalPlanYears, directBillPlanYearFilterChanged,\n} from 'rates-history/rates-history.slice';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { fetchDirectBillRateHistory, fetchRateHistory } from 'rates-history/rates-history.thunk';\nimport TabPanel from 'components/shared/TabPanel';\nimport HistoryTable from 'rates-history/HistoryTable';\n\ntype TabValues = 'cobra' | 'directBill'\n\nfunction RatesHistory() {\n const [ tab, setTab ] = useState<TabValues>('cobra');\n const dispatch = useDispatch<typeof store.dispatch>();\n const cobraFetchStatus = useSelector(selectFetchCobraRatesHistoryStatus);\n const cobraPlans = useSelector(selectHistoricalCobraPlans);\n const cobraPlanYears = useSelector(selectCobraHistoricalPlanYears);\n\n const directBillFetchStatus = useSelector(selectFetchDirectBillRatesHistoryStatus);\n const directBillPlans = useSelector(selectHistoricalDirectBillPlans);\n const directBillPlanYears = useSelector(selectDirectBillHistoricalPlanYears);\n const company = useSelector(selectSelectedCompany);\n const companyId = company?.compid ?? 0;\n\n const companyHasCobra = company?.hasCobra;\n const companyHasRetiree = company?.hasRetiree;\n\n useEffect(() => {\n dispatch(fetchRateHistory(companyId));\n dispatch(fetchDirectBillRateHistory(companyId));\n }, [ dispatch, companyId ]);\n\n return (\n <div className=\"w-full xl:w-3/4 flex flex-col p-4\">\n <h2 className=\"page-title\">Rates History</h2>\n <Paper elevation={2} className=\"w-full flex flex-col p-4 border-neutral5\">\n <div className=\"flex flex-col justify-around\">\n <Tabs\n indicatorColor=\"primary\"\n textColor=\"primary\"\n className=\"-ml-4 -mt-4 flex justify-around\"\n value={tab}\n centered\n onChange={compose(setTab, nthArg(1))}\n >\n {companyHasCobra && (\n <Tab\n data-testid=\"cobra\"\n value=\"cobra\"\n label=\"Cobra Historical Rates\"\n />)}\n {companyHasRetiree && (\n <Tab\n data-testid=\"directBill\"\n value=\"directBill\"\n label=\"Direct Bill Historical Rates\"\n />)}\n </Tabs>\n <hr />\n <TabPanel value={tab} index=\"cobra\" >\n <HistoryTable\n fetchStatus={cobraFetchStatus}\n planYears={cobraPlanYears}\n plans={cobraPlans}\n reducer={cobraPlanYearFilterChanged}\n />\n </TabPanel>\n <TabPanel value={tab} index=\"directBill\" >\n <HistoryTable\n fetchStatus={directBillFetchStatus}\n planYears={directBillPlanYears}\n plans={directBillPlans}\n reducer={directBillPlanYearFilterChanged}\n />\n </TabPanel>\n </div>\n </Paper>\n </div>\n );\n}\n\nexport default RatesHistory;\n","import React, { ReactElement, useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { always, cond, equals, T } from 'ramda';\nimport TableContainer from '@mui/material/TableContainer';\nimport Skeleton from '@mui/material/Skeleton';\nimport Paper from '@mui/material/Paper';\nimport store from 'store';\nimport {\n selectContributionsNotForwarded,\n selectContributionsNotForwardedFetchStatus,\n} from 'action-items/action-items.slice';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport ContributionsNotForwardedTable\n from 'reports/shared/ContributionsNotForwardedTable/ContributionsNotForwardedTable';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport { fetchHsaContributionsNotForwarded } from 'action-items/action-items.thunks';\nimport { selectFetchParticipantStatus } from 'participant-search/participant.slice';\nimport Loading from 'components/shared/Loading';\n\nfunction ContributionsNotForwarded() {\n const { compid: companyId } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n\n const contributionsNotForwarded = useSelector(selectContributionsNotForwarded);\n const fetchStatus = useSelector(selectContributionsNotForwardedFetchStatus);\n const fetchParticipantStatus = useSelector(selectFetchParticipantStatus);\n\n const dispatch = useDispatch<typeof store.dispatch>();\n\n useEffect(() => {\n if (fetchStatus === 'uninitialized') {\n dispatch(fetchHsaContributionsNotForwarded(companyId));\n }\n }, [ dispatch, companyId, fetchStatus ]);\n\n return (\n <div className=\"w-4/5\">\n {fetchParticipantStatus === 'pending' ? <Loading /> : <></>}\n {cond<string, ReactElement>(\n [\n [ equals('fulfilled'), always(\n <ContributionsNotForwardedTable rows={contributionsNotForwarded} />,\n ) ],\n [ T, always(\n <PageContentPaper className=\"m-4\">\n <TableContainer component={Paper}>\n <Skeleton\n data-testid=\"loading\"\n variant=\"rectangular\"\n height={70}\n style={ { marginBottom: '0.1rem' } }\n />\n <Skeleton\n data-testid=\"loading\"\n variant=\"rectangular\"\n height={70}\n style={ { marginBottom: '0.1rem' } }\n />\n <Skeleton\n data-testid=\"loading\"\n variant=\"rectangular\" height={70}\n />\n </TableContainer>\n </PageContentPaper>,\n ) ],\n ],\n )(fetchStatus)}\n </div>\n );\n}\n\nexport default ContributionsNotForwarded;\n","import { ReactElement } from 'react';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport dayjs from 'dayjs';\nimport { always, andThen, anyPass, complement, compose, equals, ifElse, isNil, pathOr } from 'ramda';\nimport LocalizationProvider from '@mui/lab/LocalizationProvider';\nimport AdapterDayJS from '@mui/lab/AdapterDayjs';\nimport DatePicker from '@mui/lab/DatePicker';\nimport TextField from '@mui/material/TextField';\nimport Button from '@mui/material/Button';\nimport {\n selectDirectBillPlan,\n setDirectBillOeBegins,\n setDirectBillOeEnds,\n setDirectBillResponseDeadline,\n cancelModalOpened,\n selectDirectBillOeValidations,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport { saveDirectBillChecklist } from 're-enrollment-checklist/re-enrollment-checklist.thunks';\nimport { noop } from 'shared/utils';\nimport store from 'store';\n\nfunction DirectBillGeneral(): ReactElement {\n const dispatch = useDispatch<typeof store.dispatch>();\n const {\n directBillOeBegins,\n directBillOeEnds,\n directBillResponseDeadline,\n checklistComplete,\n } = useSelector(selectDirectBillPlan);\n const validations = useSelector(selectDirectBillOeValidations);\n\n function formatDate(event: any) {\n return dayjs(event, 'YYYY-MM-DD').format();\n }\n\n const setDate = (date: string) => {\n return date ? dayjs(date, 'YYYY-MM-DD').format('MM/DD/YYYY') : null;\n };\n\n const isContinueDisabled = anyPass([\n compose(isNil, pathOr(null, [ 'directBillOeBegins' ])),\n compose(isNil, pathOr(null, [ 'directBillOeEnds' ])),\n compose(isNil, pathOr(null, [ 'directBillResponseDeadline' ])),\n complement(compose(isNil, pathOr(null, [ 'validations', 'directBillOeBegins' ]))),\n complement(compose(isNil, pathOr(null, [ 'validations', 'directBillOeEnds' ]))),\n complement(compose(isNil, pathOr(null, [ 'validations', 'directBillResponseDeadline' ]))),\n ])({ directBillOeBegins, directBillOeEnds, directBillResponseDeadline, validations });\n\n const history = useHistory();\n const { planYearId = '0' } = useParams<{planYearId: string;}>();\n const changeRoute = compose(history.push, always(`/reenrollment-checklist/direct-bill/${planYearId}/plan-rates`));\n\n return (\n <>\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <form className=\"my-10\">\n <div className=\"w-2/5 my-5\">\n <DatePicker\n label=\"Direct Bill Open Enrollment Start Date\"\n value={setDate(directBillOeBegins)}\n onChange={compose(\n dispatch,\n setDirectBillOeBegins,\n formatDate,\n )}\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n {...params}\n fullWidth\n data-testid=\"directBillOeBegins\"\n variant=\"outlined\"\n error={!!validations.directBillOeBegins}\n helperText={validations.directBillOeBegins}\n />\n )}\n />\n </div>\n <div className=\"w-2/5 my-5\">\n <DatePicker\n label=\"Direct Bill Open Enrollment End Date\"\n value={setDate(directBillOeEnds)}\n onChange={compose(\n dispatch,\n setDirectBillOeEnds,\n formatDate,\n )}\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n {...params}\n fullWidth\n data-testid=\"directBillOeEnds\"\n variant=\"outlined\"\n error={!!validations.directBillOeEnds}\n helperText={validations.directBillOeEnds}\n />\n )}\n />\n </div>\n <div className=\"w-2/5 my-5\">\n <DatePicker\n label=\"What date must packets be returned by?\"\n value={setDate(directBillResponseDeadline)}\n onChange={compose(\n dispatch,\n setDirectBillResponseDeadline,\n formatDate,\n )}\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n {...params}\n fullWidth\n data-testid=\"directBillResponseDeadline\"\n variant=\"outlined\"\n error={!!validations.directBillResponseDeadline}\n helperText={validations.directBillResponseDeadline}\n />\n )}\n />\n </div>\n </form>\n </LocalizationProvider>\n <div className=\"flex flex-row-reverse\">\n <Button\n data-testid=\"cover-letter-continue\"\n variant=\"contained\"\n color=\"primary\"\n onClick={compose(\n ifElse(\n equals(false),\n compose(andThen(changeRoute), dispatch, compose(saveDirectBillChecklist)),\n changeRoute,\n ),\n always(checklistComplete),\n )}\n disabled={isContinueDisabled}\n >Continue\n </Button>\n <Button\n className=\"mr-4\"\n onClick={compose(dispatch, cancelModalOpened, noop)}\n >Cancel\n </Button>\n </div>\n </>\n );\n}\n\nexport default DirectBillGeneral;\n","import React, { ReactElement, useEffect } from 'react';\nimport { useHistory, useParams } from 'react-router-dom';\nimport Tabs from '@mui/material/Tabs';\nimport Tab from '@mui/material/Tab';\nimport { usePageTitle } from 'shared/custom-hooks/usePageTitle';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport DirectBillGeneral from './general/DirectBillGeneral';\nimport TabPanel from 'components/shared/TabPanel';\nimport CancelModal from 'components/shared/CancelModal';\nimport {\n selectCancelModalStatus,\n cancelModalClosed,\n ApiStatus,\n selectFetchPlansStatus,\n selectReEnrollmentPlansByPlanYearId,\n selectSaveDirectBillChecklistStatus,\n} from 're-enrollment-checklist/re-enrollment-checklist.slice';\nimport { all, always, any, compose, cond, equals, T } from 'ramda';\nimport { useDispatch, useSelector } from 'react-redux';\nimport store from 'store';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { fetchReEnrollmentChecklistPlan } from 're-enrollment-checklist/re-enrollment-checklist.thunks';\nimport Skeleton from '@mui/material/Skeleton';\nimport Loading from 'components/shared/Loading';\n\ntype DirectBillTab = 'general' | 'plan-rates' | 'summary';\n\nfunction DirectBillReEnrollmentChecklist() {\n usePageTitle('Direct Bill Enrollment');\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n const cancelModalStatus = useSelector(selectCancelModalStatus);\n const plansRequestStatus = useSelector(selectFetchPlansStatus);\n const saveDirectBillChecklistStatus = useSelector(selectSaveDirectBillChecklistStatus);\n\n const { compid: companyId } = useSelector(selectSelectedCompany) ?? { compid: 0 };\n const { planYearId = '0', tab = 'general' } = useParams<{planYearId: string; tab?: DirectBillTab;}>();\n const plan = useSelector(selectReEnrollmentPlansByPlanYearId(+planYearId));\n\n const fetchStatus = cond<string[], ApiStatus>([\n [ any(equals('pending')), always('pending') ],\n [ any(equals('rejected')), always('rejected') ],\n [ all(equals('fulfilled')), always('fulfilled') ],\n ])([ plansRequestStatus ]);\n\n useEffect(() => {\n if (!plan) {\n dispatch(fetchReEnrollmentChecklistPlan(companyId));\n }\n }, [ planYearId, dispatch, plan, companyId ]);\n\n function handleTabChange (_: React.ChangeEvent<{}>, newTab: DirectBillTab) {\n history.push(`/reenrollment-checklist/direct-bill/${planYearId}/${newTab}`);\n }\n\n return (\n <>\n <PageContentPaper className=\"mt-4 mb-8\" data-testid=\"cobra-plan-tabbed-form\">\n <div className=\"flex flex-col justify-around\">\n <Tabs\n indicatorColor=\"primary\"\n textColor=\"primary\"\n className=\"-ml-4 -mt-4 flex justify-around\"\n value={tab}\n centered\n onChange={handleTabChange}\n >\n <Tab\n data-testid=\"general-tab\"\n value=\"general\"\n label=\"General\"\n />\n <Tab\n data-testid=\"plan-rates-tab\"\n value=\"plan-rates\"\n label=\"Plan Rates\"\n />\n <Tab\n data-testid=\"summary-tab\"\n value=\"summary\"\n label=\"Summary\"\n />\n </Tabs>\n <hr />\n\n <TabPanel value={tab} index=\"general\">\n {\n cond<string, ReactElement>([\n [ equals('pending'), always(\n <>\n <Skeleton variant=\"rectangular\" height={60} className=\"w-2/5 my-5 mt-10\" />\n <Skeleton variant=\"rectangular\" height={60} className=\"w-2/5 my-5\" />\n <Skeleton variant=\"rectangular\" height={60} className=\"w-2/5 my-5\" />\n </>,\n ) ],\n [ T, always(<DirectBillGeneral />) ]],\n )(fetchStatus)\n }\n </TabPanel>\n <TabPanel value={tab} index=\"plan-rates\">\n <div>\n Plan Rates\n </div>\n </TabPanel>\n <TabPanel value={tab} index=\"summary\">\n <div>\n Summary\n </div>\n </TabPanel>\n </div>\n </PageContentPaper>\n {\n saveDirectBillChecklistStatus === 'pending'\n ? <Loading />\n : <></>\n }\n <CancelModal\n isOpen={cancelModalStatus === 'open'}\n onCancel={compose(history.push, always('/reenrollment-checklist'))}\n onClose={compose(dispatch, cancelModalClosed)}\n />\n </>\n );\n}\n\nexport default DirectBillReEnrollmentChecklist;\n","interface Props {\n text?: string;\n className?: string;\n}\n\nexport function SubmissionError({\n text = 'There was a problem with your submission',\n className = 'text-center',\n}: Readonly<Props>): React.ReactElement {\n return (\n <div className={className} data-testid=\"submission-error\">\n <p className=\"text-red-600\">{text}</p>\n </div>\n );\n}\n","import PersonOutlineIcon from '@mui/icons-material/PersonOutline';\nimport DescriptionIcon from '@mui/icons-material/Description';\nimport EventIcon from '@mui/icons-material/Event';\n\nimport { WizardStep } from 'components/shared/WizardStepper';\n\nexport type LeaveRequestStepSlug = 'personal-details' | 'employment-details' | 'event-info' | 'summary';\n\nconst wizardSteps: Map<LeaveRequestStepSlug, WizardStep> = new Map([\n [\n 'personal-details',\n {\n label: 'Personal Details',\n icon: PersonOutlineIcon,\n slug: 'personal-details',\n next: 'employment-details',\n },\n ],\n [\n 'employment-details',\n {\n label: 'Employment Details',\n icon: PersonOutlineIcon,\n slug: 'employment-details',\n next: 'event-info',\n prev: 'personal-details',\n },\n ],\n [\n 'event-info',\n {\n label: 'Event Info',\n icon: EventIcon,\n slug: 'event-info',\n next: 'summary',\n prev: 'employment-details',\n },\n ],\n [\n 'summary',\n {\n label: 'Summary',\n icon: DescriptionIcon,\n slug: 'summary',\n prev: 'event-info',\n },\n ],\n]);\n\nexport default wizardSteps;\n","import { SelectOption } from 'shared/types/form.types';\n\nexport const defaultPersonalDetailsFields = {\n eeId: '',\n nameFirst: '',\n nameLast: '',\n email: '',\n phone: '',\n addr1: '',\n addr2: '',\n city: '',\n stateProvCd: '',\n postalCd: '',\n};\n\nexport const defaultEmploymentDetailsFields = {\n type: '',\n location: '',\n supervisorName: '',\n supervisorEmail: '',\n hireDate: '',\n totalHoursWorked: '',\n};\n\nexport const defaultEventInfoFields = {\n dateStart: '',\n dateEnd: '',\n reason: '',\n kinRelation: '',\n duration: '',\n explanation: '',\n confirmationEmail: '',\n faxHealthProvider: false,\n providerName: '',\n providerFax: '',\n kinName: '',\n};\n\nexport const defaultLeaveRequestValues = {\n employee: defaultPersonalDetailsFields,\n employment: defaultEmploymentDetailsFields,\n event: defaultEventInfoFields,\n};\n\nexport const employmentTypeOptions: SelectOption[] = [\n { label: 'Full Time', value: 'Full Time' },\n { label: 'Part Time', value: 'Part Time' },\n { label: 'Other', value: 'Other' },\n];\n\nexport const absenceOrAccommodationRequestReasons: SelectOption[] = [\n {\n label: 'Leave of absence for my own health condition',\n value: 'Leave of absence for my own health condition',\n },\n {\n label: 'Leave of absence to care for a family member with a health condition',\n value: 'Leave of absence to care for a family member with a health condition',\n },\n {\n label: 'Maternity/bonding leave of absence as the birth parent',\n value: 'Maternity/bonding leave of absence as the birth parent',\n },\n {\n label: 'Bonding leave of absence as the non-birth parent',\n value: 'Bonding leave of absence as the non-birth parent',\n },\n {\n label: 'Bonding leave of absence related to adoption',\n value: 'Bonding leave of absence related to adoption',\n },\n {\n label: 'Bonding leave of absence related to a foster placement',\n value: 'Bonding leave of absence related to a foster placement',\n },\n {\n label: 'Working accommodation for a disability',\n value: 'Working accommodation for a disability',\n },\n {\n label: 'Military caregiver leave of absence',\n value: 'Military caregiver leave of absence',\n },\n {\n label: 'Military bonding leave of absence',\n value: 'Military bonding leave of absence',\n },\n {\n label: 'USERRA (Military leave)',\n value: 'USERRA (Military leave)',\n },\n {\n label: 'Non-medical personal leave of absence',\n value: 'Non-medical personal leave of absence',\n },\n {\n label: 'Other',\n value: 'Other',\n },\n];\n\nexport const leaveDurationOptions: SelectOption[] = [\n {\n label: 'Continuous (one block of time)',\n value: 'Continuous (one block of time)',\n },\n {\n label: 'Intermittent (as needed for flare ups and appointments)',\n value: 'Intermittent (as needed for flare ups and appointments)',\n },\n {\n label: 'Reduced Schedule',\n value: 'Reduced Schedule',\n },\n {\n label: 'Unknown',\n value: 'Unknown',\n },\n];\n","import * as yup from 'yup';\n\nimport {\n fname,\n lname,\n email,\n hstreet1,\n hstreet2,\n hcity,\n hstate,\n requiredText,\n errorMessages,\n regexPatterns,\n} from 'shared/common-validators';\nimport { LeaveRequestStepSlug } from 'enter-leave-request/enter-leave-request-steps';\n\nexport const personalDetailsSchema = yup.object().shape({\n employee: yup.object({\n eeId: yup\n .string()\n .required(requiredText),\n nameFirst: fname.fname,\n nameLast: lname.lname,\n phone: yup\n .string()\n .matches(regexPatterns.phone, errorMessages.phone.matches)\n .max(14, errorMessages.phone.max)\n .min(10, errorMessages.phone.min)\n .nullable(),\n ...email,\n addr1: hstreet1.hstreet1,\n addr2: hstreet2.hstreet2,\n city: hcity.hcity,\n stateProvCd: hstate.hstate,\n postalCd: yup\n .string()\n .trim()\n .matches(regexPatterns.postalCd, errorMessages.postalCd.matches)\n .min(5, errorMessages.postalCd.min)\n .max(10, errorMessages.postalCd.max)\n .required(requiredText),\n }),\n});\n\nconst employmentDetailsSchema = yup.object().shape({\n employment: yup.object({\n type: yup\n .string()\n .trim()\n .required(requiredText),\n location: yup\n .string()\n .trim()\n .max(30, 'Location must be 30 characters or less')\n .nullable(),\n supervisorEmail: yup\n .string()\n .trim()\n .email('Must be a valid email address')\n .max(50, 'Email must be 50 characters or less')\n .required(requiredText),\n hireDate: yup\n .date()\n .typeError('Invalid Date Format')\n .nullable()\n .required(requiredText),\n totalHoursWorked: yup\n .number()\n .positive('Must be a positive number')\n .typeError('Please enter a valid number')\n .required(requiredText),\n }),\n});\n\nconst eventDetailsSchema = yup.object().shape({\n event: yup.object({\n dateStart: yup\n .date()\n .typeError('Invalid Date Format')\n .nullable()\n .required(requiredText),\n dateEnd: yup\n .date()\n .typeError('Invalid Date Format')\n .nullable()\n .required(requiredText),\n reason: yup\n .string()\n .trim()\n .required(requiredText),\n kinRelation: yup\n .string()\n .trim(),\n duration: yup\n .string()\n .trim()\n .required(requiredText),\n explanation: yup\n .string()\n .trim()\n .required(requiredText),\n confirmationEmail: yup\n .string()\n .trim()\n .email('Must be a valid email address')\n .max(50, errorMessages.email.max)\n .required(requiredText),\n faxHealthProvider: yup\n .boolean()\n .required(requiredText),\n providerName: yup\n .string()\n .when('faxHealthProvider', {\n is: true,\n then: yup\n .string()\n .required(requiredText)\n .max(50, 'Provider Name must be 50 characters or less'),\n }),\n providerFax: yup\n .string()\n .when('faxHealthProvider', {\n is: true,\n then: yup\n .string()\n .required(requiredText)\n .matches(regexPatterns.phone, errorMessages.fax.matches)\n .max(14, errorMessages.fax.max)\n .min(10, errorMessages.fax.min),\n }),\n kinName: yup\n .string()\n .max(50)\n .nullable(),\n }),\n});\n\nexport const leaveRequestSchema = personalDetailsSchema.concat(employmentDetailsSchema).concat(eventDetailsSchema);\n\nexport const validation = new Map<LeaveRequestStepSlug, object>([\n [ 'personal-details', personalDetailsSchema ],\n [ 'employment-details', employmentDetailsSchema ],\n [ 'event-info', eventDetailsSchema ],\n [ 'summary', leaveRequestSchema ],\n]);\n","import { useEffect } from 'react';\nimport { useFormikContext } from 'formik';\nimport TextField from '@mui/material/TextField';\n\nimport StateSelect from 'components/shared/StateSelect';\nimport { handleCustomFieldChange, formikFieldErrorText, formikFieldHasError } from 'shared/form-helpers';\nimport { LeaveRequestFormFields } from 'enter-leave-request/enter-leave-request.types';\n\nexport function EnterLeaveRequestPersonalDetails(): React.ReactElement {\n const form = useFormikContext<LeaveRequestFormFields>();\n\n /* eslint-disable react-hooks/exhaustive-deps */\n useEffect(() => {\n form.validateForm();\n }, []);\n\n return (\n <>\n <div className=\"flex space-x-4 mb-4\" data-testid=\"enter-leave-request-personal-details\">\n <TextField\n className=\"basis-1/2\"\n variant=\"outlined\"\n label=\"EEID\"\n name=\"employee.eeId\"\n value={form.values.employee.eeId}\n error={formikFieldHasError('employee.eeId', form)}\n helperText={formikFieldErrorText('employee.eeId', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n data-testid=\"eeId\"\n />\n <div className=\"basis-1/2\" />\n </div>\n <div className=\"flex space-x-4 mb-4\">\n <TextField\n className=\"basis-1/2\"\n variant=\"outlined\"\n label=\"First Name\"\n name=\"employee.nameFirst\"\n value={form.values.employee.nameFirst}\n error={formikFieldHasError('employee.nameFirst', form)}\n helperText={formikFieldErrorText('employee.nameFirst', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n data-testid=\"nameFirst\"\n />\n <TextField\n className=\"basis-1/2\"\n variant=\"outlined\"\n label=\"Last Name\"\n name=\"employee.nameLast\"\n value={form.values.employee.nameLast}\n error={formikFieldHasError('employee.nameLast', form)}\n helperText={formikFieldErrorText('employee.nameLast', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n data-testid=\"nameLast\"\n />\n </div>\n <div className=\"flex space-x-4 mb-4\">\n <TextField\n className=\"basis-1/2\"\n variant=\"outlined\"\n label=\"Employee Email (Optional)\"\n name=\"employee.email\"\n value={form.values.employee.email}\n error={formikFieldHasError('employee.email', form)}\n helperText={formikFieldErrorText('employee.email', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n data-testid=\"email\"\n />\n <TextField\n className=\"basis-1/2\"\n variant=\"outlined\"\n label=\"Employee Phone (Optional)\"\n name=\"employee.phone\"\n value={form.values.employee.phone}\n error={formikFieldHasError('employee.phone', form)}\n helperText={formikFieldErrorText('employee.phone', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n data-testid=\"phone\"\n />\n </div>\n <div className=\"flex space-x-4 mb-4\">\n <TextField\n fullWidth\n variant=\"outlined\"\n label=\"Address Line 1\"\n name=\"employee.addr1\"\n value={form.values.employee.addr1}\n error={formikFieldHasError('employee.addr1', form)}\n helperText={formikFieldErrorText('employee.addr1', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n data-testid=\"addr1\"\n />\n </div>\n <div className=\"flex space-x-4 mb-4\">\n <TextField\n fullWidth\n variant=\"outlined\"\n label=\"Address Line 2 (Optional)\"\n name=\"employee.addr2\"\n value={form.values.employee.addr2}\n error={formikFieldHasError('employee.addr2', form)}\n helperText={formikFieldErrorText('employee.addr2', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n data-testid=\"addr2\"\n />\n </div>\n <div className=\"flex space-x-4 mb-4\">\n <TextField\n className=\"basis-1/2\"\n variant=\"outlined\"\n label=\"City\"\n name=\"employee.city\"\n value={form.values.employee.city}\n error={formikFieldHasError('employee.city', form)}\n helperText={formikFieldErrorText('employee.city', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n data-testid=\"city\"\n />\n <StateSelect\n className=\"basis-1/4\"\n label=\"State\"\n name=\"employee.stateProvCd\"\n value={form.values.employee.stateProvCd}\n onStateChanged={handleCustomFieldChange('employee.stateProvCd', form)}\n onStateBlur={form.handleBlur}\n error={formikFieldHasError('employee.stateProvCd', form)}\n data-testid=\"stateProvCd\"\n />\n <TextField\n className=\"basis-1/4\"\n variant=\"outlined\"\n label=\"Zip\"\n name=\"employee.postalCd\"\n value={form.values.employee.postalCd}\n error={formikFieldHasError('employee.postalCd', form)}\n helperText={formikFieldErrorText('employee.postalCd', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n data-testid=\"postalCd\"\n />\n </div>\n </>\n );\n}\n","import AdapterDayJS from '@mui/lab/AdapterDayjs';\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\nimport { DatePicker } from '@mui/x-date-pickers/DatePicker';\nimport TextField from '@mui/material/TextField';\nimport { ErrorMessage, FormikContextType } from 'formik';\n\nimport { handleDateChange } from 'shared/form-helpers';\n\ninterface Props {\n className?: string;\n label: string;\n path: string;\n value: string;\n minDate?: unknown;\n maxDate?: unknown;\n form: FormikContextType<any>;\n hasError: boolean;\n handleChange: (e: React.ChangeEvent<any>) => void;\n handleBlur: (e: React.FocusEvent<any, Element>) => void;\n}\n\nexport function FormikMuiDatePicker({\n className,\n label,\n path,\n value,\n minDate,\n maxDate,\n form,\n hasError,\n handleChange,\n handleBlur,\n}: Readonly<Props>): React.ReactElement {\n return (\n <div className={className}>\n <LocalizationProvider dateAdapter={AdapterDayJS}>\n <DatePicker\n label={label}\n value={value}\n minDate={minDate}\n maxDate={maxDate}\n onChange={handleDateChange(path, form)}\n InputProps={ { tabIndex: -1 } }\n InputAdornmentProps={ { classes: { positionEnd: 'ml-1' } } }\n // eslint-disable-next-line react/jsx-no-bind\n renderInput={(params) => (\n <TextField\n data-testid={path}\n fullWidth\n variant=\"outlined\"\n name={path}\n {...params}\n error={hasError}\n onChange={handleChange}\n onBlur={handleBlur}\n />\n )}\n />\n </LocalizationProvider>\n <ErrorMessage\n className=\"text-sm text-red-600 pl-4 pt-1\"\n component=\"div\"\n name={path}\n />\n </div>\n );\n}\n","import { useEffect } from 'react';\nimport { useFormikContext } from 'formik';\nimport dayjs from 'dayjs';\nimport TextField from '@mui/material/TextField';\n\nimport CommonSelect from 'components/shared/form/CommonSelect';\nimport {\n handleCustomFieldChange,\n formikFieldErrorText,\n formikFieldHasError,\n} from 'shared/form-helpers';\nimport { FormikMuiDatePicker } from 'components/shared/form/formik/FormikMuiDatePicker';\nimport { LeaveRequestFormFields } from 'enter-leave-request/enter-leave-request.types';\nimport { employmentTypeOptions } from 'enter-leave-request/enter-leave-request-fields';\n\nexport function EnterLeaveRequestEmploymentDetails(): React.ReactElement {\n const form = useFormikContext<LeaveRequestFormFields>();\n\n /* eslint-disable react-hooks/exhaustive-deps */\n useEffect(() => {\n form.validateForm();\n }, []);\n\n return (\n <>\n <div className=\"flex space-x-4 mb-4\" data-testid=\"enter-leave-request-employment-details\">\n <CommonSelect\n classes={ { control: 'basis-1/2 common-select' } }\n options={employmentTypeOptions}\n value={form.values.employment.type}\n name=\"employment.type\"\n label=\"Employment Type\"\n onSelectChange={handleCustomFieldChange('employment.type', form)}\n onSelectBlur={form.handleBlur}\n error={formikFieldHasError('employment.type', form)}\n />\n <TextField\n className=\"basis-1/2\"\n variant=\"outlined\"\n label=\"Location or division (Optional)\"\n name=\"employment.location\"\n value={form.values.employment.location}\n error={formikFieldHasError('employment.location', form)}\n helperText={formikFieldErrorText('employment.location', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n data-testid=\"location\"\n />\n </div>\n <div className=\"flex space-x-4 mb-4\">\n <TextField\n className=\"basis-1/2\"\n variant=\"outlined\"\n label=\"Supervisor Name (Optional)\"\n name=\"employment.supervisorName\"\n value={form.values.employment.supervisorName}\n error={formikFieldHasError('employment.supervisorName', form)}\n helperText={formikFieldErrorText('employment.supervisorName', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n data-testid=\"supervisorName\"\n />\n <TextField\n className=\"basis-1/2\"\n variant=\"outlined\"\n label=\"Supervisor Email\"\n name=\"employment.supervisorEmail\"\n value={form.values.employment.supervisorEmail}\n error={formikFieldHasError('employment.supervisorEmail', form)}\n helperText={formikFieldErrorText('employment.supervisorEmail', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n data-testid=\"supervisorEmail\"\n />\n </div>\n\n <div className=\"flex space-x-4 mb-4\">\n <FormikMuiDatePicker\n className=\"basis-1/2\"\n label=\"Hire Date\"\n path=\"employment.hireDate\"\n value={form.values.employment.hireDate}\n maxDate={dayjs()}\n hasError={formikFieldHasError('employment.hireDate', form)}\n form={form}\n handleChange={form.handleChange}\n handleBlur={form.handleBlur}\n />\n <TextField\n className=\"basis-1/2\"\n variant=\"outlined\"\n label=\"Total hours worked in the past 12 months\"\n name=\"employment.totalHoursWorked\"\n value={form.values.employment.totalHoursWorked}\n error={formikFieldHasError('employment.totalHoursWorked', form)}\n helperText={formikFieldErrorText('employment.totalHoursWorked', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n data-testid=\"totalHoursWorked\"\n />\n </div>\n </>\n );\n}\n","import { useFormikContext } from 'formik';\nimport { useEffect } from 'react';\nimport dayjs from 'dayjs';\nimport { always, ifElse, isEmpty } from 'ramda';\nimport TextField from '@mui/material/TextField';\nimport FormControl from '@mui/material/FormControl';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport Checkbox from '@mui/material/Checkbox';\n\nimport {\n formikFieldErrorText,\n formikFieldHasError,\n handleCustomFieldChange,\n} from 'shared/form-helpers';\nimport CommonSelect from 'components/shared/form/CommonSelect';\nimport { FormikMuiDatePicker } from 'components/shared/form/formik/FormikMuiDatePicker';\nimport { LeaveRequestFormFields } from 'enter-leave-request/enter-leave-request.types';\nimport {\n absenceOrAccommodationRequestReasons,\n leaveDurationOptions,\n} from 'enter-leave-request/enter-leave-request-fields';\n\nexport function EnterLeaveRequestEventInfo(): React.ReactElement {\n const form = useFormikContext<LeaveRequestFormFields>();\n\n const setMaxStartDate = ifElse(\n isEmpty,\n always(null),\n always(dayjs(form.values.event.dateEnd).subtract(1, 'day')),\n )(form.values.event.dateEnd);\n\n const setMinEndDate = ifElse(\n isEmpty,\n always(null),\n always(dayjs(form.values.event.dateStart).add(1, 'day')),\n )(form.values.event.dateStart);\n\n /* eslint-disable react-hooks/exhaustive-deps */\n useEffect(() => {\n form.validateForm();\n }, []);\n\n return (\n <>\n <div className=\"flex space-x-4 mb-4\" data-testid=\"enter-leave-request-event-info\">\n <FormikMuiDatePicker\n className=\"basis-1/2\"\n label=\"Leave of Absence or Accommodation Start Date\"\n path=\"event.dateStart\"\n value={form.values.event.dateStart}\n maxDate={setMaxStartDate}\n hasError={formikFieldHasError('event.dateStart', form)}\n form={form}\n handleChange={form.handleChange}\n handleBlur={form.handleBlur}\n />\n <FormikMuiDatePicker\n className=\"basis-1/2\"\n label=\"Leave of Absence or Accommodation End Date\"\n path=\"event.dateEnd\"\n value={form.values.event.dateEnd}\n minDate={setMinEndDate}\n hasError={formikFieldHasError('event.dateEnd', form)}\n form={form}\n handleChange={form.handleChange}\n handleBlur={form.handleBlur}\n />\n </div>\n <div className=\"flex space-x-4 mb-4\">\n <CommonSelect\n classes={ { control: 'common-select basis-full' } }\n options={absenceOrAccommodationRequestReasons}\n value={form.values.event.reason}\n name=\"event.reason\"\n label=\"Reason for Leave of Absence or Accommodation Request\"\n onSelectChange={handleCustomFieldChange('event.reason', form)}\n onSelectBlur={form.handleBlur}\n error={formikFieldHasError('event.reason', form)}\n />\n </div>\n <div className=\"flex space-x-4 mb-4\">\n <TextField\n className=\"basis-1/2\"\n variant=\"outlined\"\n label=\"Family member relationship (Optional)\"\n name=\"event.kinRelation\"\n value={form.values.event.kinRelation}\n error={formikFieldHasError('event.kinRelation', form)}\n helperText={formikFieldErrorText('event.kinRelation', form) ??\n // eslint-disable-next-line max-len\n 'If you are taking a leave of absence to care for a family member, please indicate their relationship to you.'}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n data-testid=\"event.kinRelation\"\n />\n <CommonSelect\n classes={ { control: 'common-select basis-1/2' } }\n options={leaveDurationOptions}\n value={form.values.event.duration}\n name=\"event.reason\"\n label=\"Duration of the leave of absence or accommodation\"\n onSelectChange={handleCustomFieldChange('event.duration', form)}\n onSelectBlur={form.handleBlur}\n error={formikFieldHasError('event.duration', form)}\n />\n </div>\n <div className=\"flex space-x-4 mb-4\">\n <TextField\n className=\"w-full\"\n multiline\n rows={3}\n variant=\"outlined\"\n label=\"Briefly describe the reason for your leave of absence or accommodation request\"\n name=\"event.explanation\"\n value={form.values.event.explanation}\n error={formikFieldHasError('event.explanation', form)}\n helperText={formikFieldErrorText('event.explanation', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n data-testid=\"event.explanation\"\n />\n </div>\n <div className=\"flex space-x-4 mb-4\">\n <TextField\n className=\"basis-1/2\"\n variant=\"outlined\"\n label=\"Email\"\n name=\"event.confirmationEmail\"\n value={form.values.event.confirmationEmail}\n error={formikFieldHasError('event.confirmationEmail', form)}\n helperText={formikFieldErrorText('event.confirmationEmail', form)\n ?? 'Enter your email address to receive a leave request confirmation email.'}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n data-testid=\"event.confirmationEmail\"\n />\n </div>\n\n <div className=\"flex space-x-4 mb-4\">\n <FormControl>\n <FormControlLabel\n control={\n <Checkbox\n name=\"event.faxHealthProvider\"\n color=\"primary\"\n value\n checked={form.values.event.faxHealthProvider}\n onChange={form.handleChange}\n data-testid=\"fax-health-provider\"\n />\n }\n classes={ { label: 'text-base' } }\n label=\"Fax a copy of the paperwork to my health care provider on my behalf.\"\n labelPlacement=\"end\"\n />\n </FormControl>\n </div>\n {\n form.values.event.faxHealthProvider &&\n (\n <div data-testid=\"fax-fields\">\n <div className=\"flex space-x-4 mb-4\">\n <TextField\n className=\"basis-1/2\"\n variant=\"outlined\"\n label=\"Provider Name\"\n name=\"event.providerName\"\n value={form.values.event.providerName}\n error={formikFieldHasError('event.providerName', form)}\n helperText={formikFieldErrorText('event.providerName', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n data-testid=\"provider-name\"\n />\n <TextField\n className=\"basis-1/2\"\n variant=\"outlined\"\n label=\"Fax Number\"\n name=\"event.providerFax\"\n value={form.values.event.providerFax}\n error={formikFieldHasError('event.providerFax', form)}\n helperText={formikFieldErrorText('event.providerFax', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n data-testid=\"provider-fax\"\n />\n </div>\n <div className=\"flex space-x-4 mb-4\">\n <TextField\n className=\"basis-1/2\"\n variant=\"outlined\"\n label=\"Family Member's Name (Optional)\"\n name=\"event.kinName\"\n value={form.values.event.kinName}\n error={formikFieldHasError('event.kinName', form)}\n helperText={formikFieldErrorText('event.kinName', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n data-testid=\"kin-name\"\n />\n <div className=\"basis-1/2\" />\n </div>\n </div>\n )\n }\n </>\n );\n}\n","export const DateFormat_M_D_YYYY = 'M/D/YYYY'; // 1/2/2020\n","import { useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { Link } from 'react-router-dom';\nimport { useFormikContext } from 'formik';\nimport dayjs from 'dayjs';\nimport { always, ifElse, isEmpty } from 'ramda';\n\nimport { DateFormat_M_D_YYYY } from 'shared/consts/date-time.consts';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { LeaveRequestFormFields } from 'enter-leave-request/enter-leave-request.types';\nimport classes from './EnterLeaveRequestSummary.module.css';\n\nexport function EnterLeaveRequestSummary(): React.ReactElement {\n const form = useFormikContext<LeaveRequestFormFields>();\n const company = useSelector(selectSelectedCompany);\n const hireDate = ifElse(\n isEmpty,\n always(''),\n always(dayjs(form.values.employment.hireDate).format(DateFormat_M_D_YYYY)),\n )(form.values.employment.hireDate);\n const dateStart = ifElse(\n isEmpty,\n always(''),\n always(dayjs(form.values.event.dateStart).format(DateFormat_M_D_YYYY)),\n )(form.values.event.dateStart);\n const dateEnd = ifElse(\n isEmpty,\n always(''),\n always(dayjs(form.values.event.dateEnd).format(DateFormat_M_D_YYYY)),\n )(form.values.event.dateEnd);\n\n /* eslint-disable react-hooks/exhaustive-deps */\n useEffect(() => {\n form.validateForm();\n }, []);\n\n return (\n <>\n <div className=\"flex space-x-8 mb-4\" data-testid=\"enter-leave-request-summary\">\n <div className=\"w-1/2\">\n <div className=\"flex justify-between items-center w-full pb-2 mb-2 border-b border-b-gray-200\">\n <p className={classes.sectionHeader}>Personal Details</p>\n <Link to=\"/enter-leave-request/personal-details\" className={`${classes.link} text-sm`}>Edit</Link>\n </div>\n {\n form.errors.employee && (\n <p className=\"text-sm text-red-600 mb-4\" data-testid=\"personal-details-error\">\n One or more validation errors occurred\n </p>\n )\n }\n <dl className=\"text-sm\">\n <dt className=\"font-bold\">{form.values.employee.nameFirst} {form.values.employee.nameLast}</dt>\n <div className=\"flex\">\n <dt className=\"pr-2\">EEID:</dt>\n <dd className=\"font-bold flex-grow\">{form.values.employee.eeId}</dd>\n </div>\n {\n form.values.employee.email &&\n (\n <div className=\"flex\" data-testid=\"email\">\n <dt className=\"pr-2\">Email:</dt>\n <dd className=\"font-bold flex-grow\">{form.values.employee.email}</dd>\n </div>\n )\n }\n {\n form.values.employee.phone &&\n (\n <div className=\"flex\" data-testid=\"phone\">\n <dt className=\"pr-2\">Phone:</dt>\n <dd className=\"font-bold flex-grow\">{form.values.employee.phone}</dd>\n </div>\n )\n }\n <div className=\"flex\">\n <dt className=\"pr-2\">Address:</dt>\n <dd className=\"font-bold basis-5 flex-grow\">\n {form.values.employee.addr1}\n {\n form.values.employee.addr2 !== '' &&\n (\n <>\n <br data-testid=\"addr2\" />{form.values.employee.addr2}\n </>\n )\n }\n <br />{form.values.employee.city}, {form.values.employee.stateProvCd} {form.values.employee.postalCd}\n </dd>\n </div>\n </dl>\n </div>\n <div className=\"w-1/2\">\n <div className=\"flex justify-between items-center w-full pb-2 mb-2 border-b border-b-gray-200\">\n <p className={classes.sectionHeader}>Employment Details</p>\n <Link to=\"/enter-leave-request/employment-details\" className={`${classes.link} text-sm`}>Edit</Link>\n </div>\n {\n form.errors.employment && (\n <p className=\"text-sm text-red-600 mb-4\" data-testid=\"employment-details-error\">\n One or more validation errors occurred\n </p>\n )\n }\n <dl className=\"text-sm\">\n <div className=\"flex\">\n <dt className=\"pr-2\">Employer's Name:</dt>\n <dd className=\"font-bold\">{company?.compname}</dd>\n </div>\n {\n form.values.employment.location &&\n (\n <div className=\"flex\" data-testid=\"location\">\n <dt className=\"pr-2\">Location or Division:</dt>\n <dd className=\"font-bold\">{form.values.employment.location}</dd>\n </div>\n )\n }\n <div className=\"flex\">\n <dt className=\"pr-2\">Employment Type:</dt>\n <dd className=\"font-bold\">{form.values.employment.type}</dd>\n </div>\n {\n form.values.employment.supervisorName &&\n (\n <div className=\"flex\" data-testid=\"supervisor-name\">\n <dt className=\"pr-2\">Supervisor Name:</dt>\n <dd className=\"font-bold\">{form.values.employment.supervisorName}</dd>\n </div>\n )\n }\n <div className=\"flex\">\n <dt className=\"pr-2\">Hire Date:</dt>\n <dd className=\"font-bold\">{hireDate}</dd>\n </div>\n <div className=\"flex\">\n <dt className=\"pr-2\">Supervisor Email:</dt>\n <dd className=\"font-bold\">{form.values.employment.supervisorEmail}</dd>\n </div>\n <div className=\"flex\">\n <dt className=\"pr-2\">Total hours worked in the past 12 months:</dt>\n <dd className=\"font-bold\">{form.values.employment.totalHoursWorked}</dd>\n </div>\n </dl>\n </div>\n </div>\n <div className=\"mb-4\">\n <div className=\"flex justify-between items-center w-full pb-2 mb-2 border-b border-b-gray-200\">\n <p className={classes.sectionHeader}>Event Info</p>\n <Link to=\"/enter-leave-request/event-info\" className={`${classes.link} text-sm`}>Edit</Link>\n </div>\n {\n form.errors.event && (\n <p className=\"text-sm text-red-600 mb-4\" data-testid=\"event-info-error\">\n One or more validation errors occurred\n </p>\n )\n }\n <dl className=\"text-sm\">\n <div className=\"flex\">\n <dt className=\"pr-2\">Leave of Absence or Accommodation Start Date:</dt>\n <dd className=\"font-bold\">{dateStart}</dd>\n </div>\n <div className=\"flex\">\n <dt className=\"pr-2\">Leave of Absence or Accommodation End Date:</dt>\n <dd className=\"font-bold\">{dateEnd}</dd>\n </div>\n {\n form.values.event.kinRelation &&\n (\n <div className=\"flex\" data-testid=\"kin-relation\">\n <dt className=\"pr-2\">Family Member Relationship:</dt>\n <dd className=\"font-bold\">{form.values.event.kinRelation}</dd>\n </div>\n )\n }\n <div className=\"flex\">\n <dt className=\"pr-2\">Briefly describe the reason for your leave of absence or accommodation request:</dt>\n <dd className=\"font-bold\">{form.values.event.explanation}</dd>\n </div>\n <div className=\"flex\">\n <dt className=\"pr-2\">Duration of the Leave of Absence or Accommodation:</dt>\n <dd className=\"font-bold\">{form.values.event.duration}</dd>\n </div>\n {\n form.values.event.faxHealthProvider &&\n (\n <>\n <dt className=\"font-bold mt-2\" data-testid=\"summary-fax-information\">Fax Information</dt>\n <div className=\"flex\">\n <dt className=\"pr-2\">Provider Name:</dt>\n <dd className=\"font-bold\">{form.values.event.providerName}</dd>\n </div>\n <div className=\"flex\">\n <dt className=\"pr-2\">Fax Number:</dt>\n <dd className=\"font-bold\">{form.values.event.providerFax}</dd>\n </div>\n {\n form.values.event.kinName &&\n (\n <div className=\"flex\" data-testid=\"summary-kin-name\">\n <dt className=\"pr-2\">Family Member's Name:</dt>\n <dd className=\"font-bold\">{form.values.event.kinName}</dd>\n </div>\n )\n }\n </>\n )\n }\n </dl>\n </div>\n </>\n );\n}\n","import Button from '@mui/material/Button';\nimport withModal from 'components/shared/HOC/WithModal';\nimport CheckCircleOutlineOutlined from '@mui/icons-material/CheckCircleOutlineOutlined';\n\ninterface EnterLeaveRequestConfirmationProps {\n onNewLeaveRequest: () => void;\n onGoToDash: () => void;\n}\n\nexport function EnterLeaveRequestConfirmation({\n onNewLeaveRequest,\n onGoToDash,\n}: Readonly<EnterLeaveRequestConfirmationProps>): React.ReactElement {\n return (\n <div className=\"p-4 text-center bg-surface\" data-testid=\"leave-request-confirmation-modal\">\n <div className=\"text-green-600\">\n <CheckCircleOutlineOutlined color=\"inherit\" fontSize=\"large\" />\n </div>\n <h5 className=\"mb-8\">Leave Request has been submitted</h5>\n <Button\n variant=\"contained\"\n className=\"mr-4\"\n onClick={onNewLeaveRequest}\n data-testid=\"btn-leave-request-add-new\"\n >\n Report an Absence\n </Button>\n <Button\n variant=\"contained\"\n onClick={onGoToDash}\n data-testid=\"btn-leave-request-dashboard\"\n >\n Go to Dashboard\n </Button>\n </div>\n );\n}\n\nexport default withModal(EnterLeaveRequestConfirmation);\n","import { useState } from 'react';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { useSelector } from 'react-redux';\nimport { FormikProvider, useFormik } from 'formik';\nimport { F, T, always, compose, cond, equals } from 'ramda';\nimport Button from '@mui/material/Button';\n\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport WizardStepper, { WizardStep } from 'components/shared/WizardStepper';\nimport CancelModal from 'components/shared/CancelModal';\nimport { SubmissionError } from 'components/shared/form/SubmissionError';\nimport { submitLeaveRequestForm } from 'shared/api/fmlaFormsApi';\nimport wizardSteps, { LeaveRequestStepSlug } from './enter-leave-request-steps';\nimport { ShowModal } from 'shared/types/modal.types';\nimport { LeaveRequestFormFields } from './enter-leave-request.types';\nimport { defaultLeaveRequestValues } from './enter-leave-request-fields';\nimport { validation } from './enter-leave-request.validators';\nimport { selectSelectedCompanyId } from 'companies/companies.slice';\nimport { EnterLeaveRequestPersonalDetails } from './personal-details/EnterLeaveRequestPersonalDetails';\nimport { EnterLeaveRequestEmploymentDetails } from './employment-details/EnterLeaveRequestEmploymentDetails';\nimport { EnterLeaveRequestEventInfo } from './event-info/EnterLeaveRequestEventInfo';\nimport { EnterLeaveRequestSummary } from './summary/EnterLeaveRequestSummary';\nimport EnterLeaveRequestConfirmation from './EnterLeaveRequestConfirmation';\n\nexport function EnterLeaveRequestPage(): React.ReactElement {\n const history = useHistory();\n const compid = useSelector(selectSelectedCompanyId);\n const { stepSlug: activeStepSlug = 'personal-details' } = useParams<{ stepSlug: LeaveRequestStepSlug; }>();\n const [ showModal, setShowModal ] = useState<ShowModal>('none');\n const [ isSubmitting, setIsSubmitting ] = useState(false);\n const [ hasSubmissionError, setHasSubmissionError ] = useState(false);\n\n const form = useFormik<LeaveRequestFormFields>({\n enableReinitialize: true,\n initialValues: defaultLeaveRequestValues,\n validateOnMount: true,\n validationSchema: validation.get(activeStepSlug),\n onSubmit: (data) => {\n setHasSubmissionError(false);\n setIsSubmitting(true);\n submitLeaveRequestForm(compid, data)\n .then(setModalState('success'))\n .catch(handleError)\n .finally(compose(setIsSubmitting, F));\n },\n });\n\n const headerText = activeStepSlug === 'summary'\n ? 'Are you sure you want to submit this leave of absence?'\n : 'Please use the form below to enter a new leave of absence or accommodation request.';\n\n const submitText = activeStepSlug === 'summary'\n ? 'Submit Leave Request'\n : 'Next Step';\n\n const handleError = compose(setHasSubmissionError, T);\n\n function onNext() {\n const step = wizardSteps.get(activeStepSlug);\n\n if (step?.slug === 'summary') {\n form.submitForm();\n } else {\n history.push(`/enter-leave-request/${step?.next}`);\n }\n }\n\n function handleStepClick(step: WizardStep) {\n history.push(`/enter-leave-request/${step.slug}`);\n }\n\n function goToDashboard() {\n setShowModal('none');\n history.push('/dashboard');\n }\n\n function enterNewLeaveRequest() {\n setShowModal('none');\n form.resetForm();\n history.push(`/report-an-absence/personal-details/?eeId=${form.values.employee.eeId}`);\n }\n\n const setModalState = (modal: ShowModal) => () => {\n setShowModal(modal);\n };\n\n return (\n <>\n <PageContentPaper className=\"mt-4 mb-8 px-8\" data-testid=\"enter-leave-request-page\">\n <div className=\"mb-8\">\n <WizardStepper\n steps={wizardSteps}\n allowClick\n onChange={handleStepClick}\n />\n </div>\n <p className=\"mb-12\" data-testid=\"header-text\">{headerText}</p>\n <FormikProvider value={form}>\n {\n cond<LeaveRequestStepSlug, JSX.Element>([\n [\n equals<LeaveRequestStepSlug>('personal-details'),\n always(\n <EnterLeaveRequestPersonalDetails />,\n ),\n ],\n [\n equals<LeaveRequestStepSlug>('employment-details'),\n always(\n <EnterLeaveRequestEmploymentDetails />,\n ),\n ],\n [\n equals<LeaveRequestStepSlug>('event-info'),\n always(\n <EnterLeaveRequestEventInfo />,\n ),\n ],\n [\n equals<LeaveRequestStepSlug>('summary'),\n always(<EnterLeaveRequestSummary />),\n ],\n ])(activeStepSlug)\n }\n {\n hasSubmissionError && <SubmissionError />\n }\n <div className=\"flex justify-end my-4\">\n <Button\n color=\"primary\"\n type=\"button\"\n data-testid=\"btn-cancel\"\n onClick={setModalState('cancel')}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n data-testid=\"btn-next-step\"\n className=\"ml-4\"\n type=\"button\"\n disabled={!form.isValid || isSubmitting}\n onClick={onNext}\n >\n {submitText}\n </Button>\n </div>\n </FormikProvider>\n </PageContentPaper>\n <CancelModal\n isOpen={showModal === 'cancel'}\n onCancel={goToDashboard}\n onClose={setModalState('none')}\n />\n <EnterLeaveRequestConfirmation\n isOpen={showModal === 'success'}\n onClose={goToDashboard}\n onGoToDash={goToDashboard}\n onNewLeaveRequest={enterNewLeaveRequest}\n />\n </>\n );\n}\n","import request from 'shared/api-request';\nimport { LeaveRequestFormFields } from 'enter-leave-request/enter-leave-request.types';\nimport { deepTrim } from 'shared/utils/deep-trim';\nimport { ReportAbsenceFormFields } from 'report-an-absence/report-an-absence.types';\n\nexport function submitLeaveRequestForm(companyId: number, data: LeaveRequestFormFields) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot submit form for invalid company'));\n }\n\n const uri = `api/companies/${companyId}/fmla/leave/request`;\n\n return request(uri, { method: 'POST', body: deepTrim(data) });\n}\n\nexport function submitReportAnAbsenceForm(companyId: number, data: ReportAbsenceFormFields) {\n if (companyId <= 0) {\n return Promise.reject(new Error('Cannot submit form for invalid company'));\n }\n\n const uri = `api/companies/${companyId}/fmla/absence/report`;\n\n return request(uri, { method: 'POST', body: deepTrim(data) });\n}\n","import { DateFormat_M_D_YYYY } from 'shared/consts/date-time.consts';\nimport { LeaveRecordCaseInfo } from '../leaveRecord.types';\nimport { dateOrPlaceholder, valueOrPlaceholder } from 'shared/utils';\n\ninterface Props {\n data?: LeaveRecordCaseInfo | null;\n}\n\nexport function LeaveRecordCaseInfoTab({ data }: Readonly<Props>) {\n const placeholder = '-';\n\n return (\n <div className=\"m-4\" data-testid=\"case-info-tab-panel\">\n <h6 className=\"mb-4\">Case Information</h6>\n <dl>\n <div className=\"flex mb-8\">\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Case ID</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.title, placeholder) }</dd>\n </div>\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Case Status</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.caseStatus, placeholder) }</dd>\n </div>\n </div>\n <div className=\"flex mb-8\">\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Approval Status</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.approvalStatus, placeholder) }</dd>\n </div>\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Work State</dt>\n <dd className=\"font-medium\"> { valueOrPlaceholder(data?.workState, placeholder) }</dd>\n </div>\n </div>\n <div className=\"flex mb-8\">\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Duration of Leave</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.durationOfLeave, placeholder) }</dd>\n </div>\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Regulation/Policy Type</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.regulationPolicyType, placeholder) }</dd>\n </div>\n </div>\n <div className=\"flex mb-8\">\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Start Date</dt>\n <dd className=\"font-medium\">{ dateOrPlaceholder(data?.startDate, DateFormat_M_D_YYYY, placeholder) }</dd>\n </div>\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">End Date</dt>\n <dd className=\"font-medium\">{ dateOrPlaceholder(data?.endDate, DateFormat_M_D_YYYY, placeholder) }</dd>\n </div>\n </div>\n <dt className=\"text-sm text-neutral-500\">Estimated Return to Work Date</dt>\n <dd className=\"mb-8 font-medium\">\n { dateOrPlaceholder(data?.returnToWorkDate, DateFormat_M_D_YYYY, placeholder) }\n </dd>\n <dt className=\"text-sm text-neutral-500\">Relationship</dt>\n <dd className=\"mb-8 font-medium\">{ valueOrPlaceholder(data?.relationship, placeholder) }</dd>\n <dt className=\"text-sm text-neutral-500\">Relationship Details</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.relationshipDetails, placeholder) }</dd>\n </dl>\n </div>\n );\n}\n","import { LeaveRecordCaseInfo } from '../leaveRecord.types';\nimport { dateOrPlaceholder, valueOrPlaceholder } from 'shared/utils';\nimport { DateFormat_M_D_YYYY } from 'shared/consts/date-time.consts';\n\ninterface Props {\n data?: LeaveRecordCaseInfo | null;\n}\n\nexport function LeaveRecordPaperworkDatesTab({ data }: Readonly<Props>) {\n const placeholder = '-';\n\n return (\n <div className=\"w-full m-4\" data-testid=\"paperwork-dates-tab-panel\">\n <h6 className=\"mb-4\">Paperwork Dates</h6>\n <dl>\n <div className=\"flex mb-8\">\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Initial Paperwork Sent Date</dt>\n <dd className=\"font-medium\">\n { dateOrPlaceholder(data?.paperworkSentDate, DateFormat_M_D_YYYY, placeholder) }\n </dd>\n </div>\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Initial Paperwork Sent Method</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.paperworkSentMethod, placeholder) }</dd>\n </div>\n </div>\n <div className=\"flex mb-8\">\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Initial Paperwork Due Date</dt>\n <dd className=\"font-medium\">\n { dateOrPlaceholder(data?.paperworkDueDate, DateFormat_M_D_YYYY, placeholder) }\n </dd>\n </div>\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Initial Paperwork Due Date Extension</dt>\n <dd className=\"font-medium\">\n {dateOrPlaceholder(data?.paperworkDueDateExtension, DateFormat_M_D_YYYY, placeholder) }\n </dd>\n </div>\n </div>\n <div className=\"flex mb-8\">\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Initial Paperwork Received Date</dt>\n <dd className=\"font-medium\">\n { dateOrPlaceholder(data?.paperworkReceivedDate, DateFormat_M_D_YYYY, placeholder) }\n </dd>\n </div>\n </div>\n <dt className=\"text-sm text-neutral-500\">Touchpoint Notes</dt>\n <dd className=\"mb-8 font-medium\">{ valueOrPlaceholder(data?.touchpointNotes, placeholder) }</dd>\n </dl>\n </div>\n );\n}\n","import { DateFormat_M_D_YYYY } from 'shared/consts/date-time.consts';\nimport { LeaveRecordsEmployeeInfo } from '../leaveRecord.types';\nimport { dateOrPlaceholder, valueOrPlaceholder } from 'shared/utils';\n\ninterface Props {\n data?: LeaveRecordsEmployeeInfo | null;\n}\n\nexport function LeaveRecordEmployeeInfoTab({ data }: Readonly<Props>) {\n const placeholder = '-';\n\n return (\n <div className=\"w-full m-4\" data-testid=\"employee-info-tab-panel\">\n <h6 className=\"mb-4\">Employee Information</h6>\n <dl>\n <div className=\"flex mb-8\">\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Employee ID Number</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.eeId, placeholder) }</dd>\n </div>\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Employee Type</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.employeeType, placeholder) }</dd>\n </div>\n </div>\n <div className=\"flex mb-8\">\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Job Title</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.jobTitle, placeholder) }</dd>\n </div>\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Hours Worked in the Past 12 Months</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.hoursWorked, placeholder) }</dd>\n </div>\n </div>\n <div className=\"flex mb-8\">\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Employee Phone 1</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.phone1, placeholder) }</dd>\n </div>\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Employee Phone 2</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.phone2, placeholder) }</dd>\n </div>\n </div>\n <div className=\"flex mb-8\">\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Employee Email 1</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.email1, placeholder) }</dd>\n </div>\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Employee Email 2</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.email2, placeholder) }</dd>\n </div>\n </div>\n <div className=\"flex mb-8\">\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Employee Address Line 1</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.address1, placeholder) }</dd>\n </div>\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Employee Address Line 2</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.address2, placeholder) }</dd>\n </div>\n </div>\n <div className=\"flex mb-8\">\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Original Hire Date</dt>\n <dd className=\"font-medium\">\n { dateOrPlaceholder(data?.originalHireDate, DateFormat_M_D_YYYY, placeholder) }\n </dd>\n </div>\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Recent Hire Date</dt>\n <dd className=\"font-medium\">\n { dateOrPlaceholder(data?.recentHireDate, DateFormat_M_D_YYYY, placeholder) }\n </dd>\n </div>\n </div>\n <div className=\"flex mb-8\">\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">HR Contact Names</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.hrContactNames, placeholder) }</dd>\n </div>\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">Supervisor Name</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.supervisorName, placeholder) }</dd>\n </div>\n </div>\n <div className=\"flex mb-8\">\n <div className=\"w-1/3\">\n <dt className=\"text-sm text-neutral-500\">STD Coverage</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.hasSTDCoverage, placeholder) }</dd>\n </div>\n </div>\n </dl>\n </div>\n );\n}\n","import { LeaveRecordCaseInfo } from '../leaveRecord.types';\nimport { valueOrPlaceholder } from 'shared/utils';\n\ninterface Props {\n data?: LeaveRecordCaseInfo | null;\n}\n\nexport function LeaveRecordCurrentApprovalsTab({ data }: Readonly<Props>) {\n const placeholder = '-';\n\n return (\n <div className=\"m-4\" data-testid=\"current-approvals-tab-panel\">\n <h6 className=\"mb-4\">Current Approvals</h6>\n <dl>\n <div className=\"flex mb-8\">\n <div className=\"basis-1/3\">\n <dt className=\"text-sm text-neutral-500\">Federal FMLA Start/End Dates</dt>\n <dd className=\"font-medium\">\n { valueOrPlaceholder(data?.federalStartEndDates, placeholder) }\n </dd>\n </div>\n </div>\n <div className=\"flex mb-8\">\n <div className=\"basis-1/3\">\n <dt className=\"text-sm text-neutral-500\">State Leave Regulation 1 Name</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.stateLeaveRegulation1Name, placeholder) }</dd>\n </div>\n <div className=\"basis-1/3\">\n <dt className=\"text-sm text-neutral-500\">State Leave Regulation 1 Start/End Dates</dt>\n <dd className=\"font-medium\">\n { valueOrPlaceholder(data?.stateLeaveRegulation1StartEndDates, placeholder) }\n </dd>\n </div>\n </div>\n <div className=\"flex mb-8\">\n <div className=\"basis-1/3\">\n <dt className=\"text-sm text-neutral-500\">State Leave Regulation 2 Name</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.stateLeaveRegulation2Name, placeholder) }</dd>\n </div>\n <div className=\"basis-1/3\">\n <dt className=\"text-sm text-neutral-500\">State Leave Regulation 2 Start/End Dates</dt>\n <dd className=\"font-medium\">\n { valueOrPlaceholder(data?.stateLeaveRegulation2StartEndDates, placeholder) }\n </dd>\n </div>\n </div>\n <div className=\"flex mb-4\">\n <div className=\"basis-1/3\">\n <dt className=\"text-sm text-neutral-500\">State Leave Regulation 3 Name</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.stateLeaveRegulation3Name, placeholder) }</dd>\n </div>\n <div className=\"basis-1/3\">\n <dt className=\"text-sm text-neutral-500\">State Leave Regulation 3 Start/End Dates</dt>\n <dd className=\"font-medium\">\n { valueOrPlaceholder(data?.stateLeaveRegulation3StartEndDates, placeholder) }\n </dd>\n </div>\n </div>\n <div className=\"flex mb-8 pt-8 border-t\">\n <div className=\"basis-1/3\">\n <dt className=\"text-sm text-neutral-500\">Reduced Schedule Start/End Date</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.reducedScheduledStartEndDates, placeholder) }</dd>\n </div>\n <div>\n <dt className=\"text-sm text-neutral-500\">Reduced Schedule Details</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.reducedScheduleDetails, placeholder) }</dd>\n </div>\n </div>\n <div className=\"flex mb-8 pt-8 border-t\">\n <div className=\"basis-1/3\">\n <dt className=\"text-sm text-neutral-500\">Intermittent Treatment Start/End Dates</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.intTreatmentStartEndDates, placeholder) }</dd>\n </div>\n <div>\n <dt className=\"text-sm text-neutral-500\">Intermittent Treatment Details</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.intTreatmentDetails, placeholder) }</dd>\n </div>\n </div>\n <div className=\"flex mb-4\">\n <div className=\"basis-1/3\">\n <dt className=\"text-sm text-neutral-500\">Intermittent Episode Start/End Dates</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.intEpisodeStartEndDates, placeholder) }</dd>\n </div>\n <div>\n <dt className=\"text-sm text-neutral-500\">Intermittent Episode Details</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.intEpisodeDetails, placeholder) }</dd>\n </div>\n </div>\n <div className=\"flex mb-8 pt-8 border-t\">\n <div className=\"basis-1/3\">\n <dt className=\"text-sm text-neutral-500\">Accommodation Start/End Dates</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.accommodationStartEndDates, placeholder) }</dd>\n </div>\n <div>\n <dt className=\"text-sm text-neutral-500\">Accommodation Details</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.accommodationDetails, placeholder) }</dd>\n </div>\n </div>\n <div className=\"flex mb-8 pt-8 border-t\">\n <div className=\"basis-1/3\">\n <dt className=\"text-sm text-neutral-500\">Denial Start/End Dates</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.denialStartEndDates, placeholder) }</dd>\n </div>\n <div>\n <dt className=\"text-sm text-neutral-500\">Denial Reason</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.denialReason, placeholder) }</dd>\n </div>\n </div>\n <div className=\"flex mb-4\">\n <div className=\"basis-1/3\">\n <dt className=\"text-sm text-neutral-500\">Personal Leave Start/End Dates</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.personalLoAStartEndDates, placeholder) }</dd>\n </div>\n <div>\n <dt className=\"text-sm text-neutral-500\">Other Medical Leave Start/End Dates</dt>\n <dd className=\"font-medium\">{ valueOrPlaceholder(data?.medicalLoAStartEndDates, placeholder) }</dd>\n </div>\n </div>\n </dl>\n </div>\n );\n}\n","import TabPanel from 'components/shared/TabPanel';\nimport {\n LeaveRecordCaseInfo,\n LeaveRecordsEmployeeInfo,\n LeaveRecordTab,\n} from '../leaveRecord.types';\nimport { LeaveRecordCaseInfoTab } from './LeaveRecordCaseInfoTab';\nimport { LeaveRecordPaperworkDatesTab } from './LeaveRecordPaperworkDatesTab';\nimport { LeaveRecordEmployeeInfoTab } from './LeaveRecordEmployeeInfoTab';\nimport { LeaveRecordCurrentApprovalsTab } from './LeaveRecordCurrentApprovalsTab';\n\ninterface Props {\n activeTab: LeaveRecordTab;\n caseDetails: LeaveRecordCaseInfo | null;\n employeeDetails: LeaveRecordsEmployeeInfo | null;\n}\n\nexport function LeaveRecordTabPanels({\n activeTab,\n caseDetails,\n employeeDetails,\n}: Readonly<Props>) {\n return (\n <div data-testid=\"leave-record-tab-panels\">\n <TabPanel value={activeTab} index=\"case-info\">\n <LeaveRecordCaseInfoTab data={caseDetails} />\n </TabPanel>\n <TabPanel value={activeTab} index=\"employee-info\">\n <LeaveRecordEmployeeInfoTab data={employeeDetails} />\n </TabPanel>\n <TabPanel value={activeTab} index=\"paperwork-dates\">\n <LeaveRecordPaperworkDatesTab data={caseDetails} />\n </TabPanel>\n <TabPanel value={activeTab} index=\"current-approvals\">\n <LeaveRecordCurrentApprovalsTab data={caseDetails} />\n </TabPanel>\n </div>\n );\n}\n","import Avatar from '@mui/material/Avatar';\nimport { colorFromLetters } from 'components/shared/avatar-color-palette';\nimport { EmployeeSearchResults } from 'leave-records/leaveRecord.types';\n\ninterface Props {\n employeeSummary: EmployeeSearchResults;\n}\n\nexport function LeaveRecordsEmployeeHeader({ employeeSummary }: Readonly<Props>) {\n return (\n <div className=\"flex flex-nowrap w-full space-x-4 mb-4 items-center\">\n <Avatar className={\n `p-2 text-sm ${colorFromLetters(employeeSummary.firstName + employeeSummary.lastName)}`\n }\n >{employeeSummary.firstName.charAt(0).toUpperCase()}{employeeSummary.lastName.charAt(0).toUpperCase()}\n </Avatar>\n <p className=\"text-neutral-500\">\n {`${employeeSummary.firstName} ${employeeSummary.lastName}`}\n </p>\n <p className=\"text-sm text-neutral-500 pl-4\">PID# {employeeSummary.eeId}</p>\n {\n employeeSummary.taxIdLast4 && (\n <p className=\"text-sm text-neutral-500 pl-4\" data-testid=\"employee-ssn\">SSN {employeeSummary.taxIdLast4}</p>\n )\n }\n </div>\n );\n}\n","import IconButton from '@mui/material/IconButton';\nimport ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos';\nimport { useHistory } from 'react-router-dom';\n\nexport type LeaveRecordsRoutes = 'leave-records' | 'all-cases' | 'case';\n\ninterface Props {\n currentRoute?: LeaveRecordsRoutes;\n eeId?: string;\n}\n\nexport function LeaveRecordsPageHeader({ currentRoute = 'leave-records', eeId = '' }: Readonly<Props>) {\n const previousRouteMap = new Map<LeaveRecordsRoutes, string>([\n [ 'all-cases', '/leave-records' ],\n [ 'case', `/leave-records/all-cases/${eeId}` ],\n ]);\n const previousRoute = previousRouteMap.get(currentRoute) ?? '/leave-records';\n const history = useHistory();\n\n function goBack() {\n history.push(previousRoute);\n }\n\n return (\n <div className=\"flex items-center mt-4 mb-8\">\n {\n currentRoute !== 'leave-records' && (\n <IconButton\n aria-label=\"Go Back\"\n data-testid=\"go-back-button\"\n onClick={goBack}\n size=\"large\"\n >\n <ArrowBackIosIcon />\n </IconButton>\n )\n }\n <h2 className=\"page-title my-0\">Participant Leave Records</h2>\n </div>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useHistory, useParams } from 'react-router-dom';\nimport Tab from '@mui/material/Tab';\nimport Tabs from '@mui/material/Tabs';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport Loading from 'components/shared/Loading';\nimport {\n selectCaseDetailsStatus,\n selectEmployeeDetails,\n selectCaseDetails,\n selectEmployeeAbsencesStatus,\n selectEmployeeDetailsStatus,\n} from 'leave-records/leave-records.slice';\nimport { fetchCaseDetails, fetchEmployeeDetails } from 'leave-records/leave-records.thunk';\nimport store from 'store';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { LeaveRecordTabPanels } from './LeaveRecordTabPanels';\nimport { EmployeeSearchResults, LeaveRecordTab } from '../leaveRecord.types';\nimport { equals, any } from 'ramda';\nimport { LeaveRecordsEmployeeHeader } from 'leave-records/components/LeaveRecordsEmployeeHeader';\nimport { LeaveRecordsPageHeader } from 'leave-records/components/LeaveRecordsPageHeader';\n\nexport function LeaveRecordDetails() {\n const history = useHistory();\n const dispatch = useDispatch<typeof store.dispatch>();\n const { eeId, caseId, tab = 'case-info' }\n = useParams<{ eeId: string; caseId: string; tab?: LeaveRecordTab;}>();\n const companyId = useSelector(selectSelectedCompany)?.compid ?? 0;\n const [ activeTab, setActiveTab ] = useState<LeaveRecordTab>(tab);\n\n const caseDetails = useSelector(selectCaseDetails);\n const employeeDetails = useSelector(selectEmployeeDetails);\n const employeeSummary: EmployeeSearchResults = {\n firstName: employeeDetails?.firstName ?? '',\n lastName: employeeDetails?.lastName ?? '',\n eeId: employeeDetails?.eeId ?? '',\n taxIdLast4: employeeDetails?.taxIdLast4 ?? null,\n };\n\n const employeeDetailsStatus = useSelector(selectEmployeeDetailsStatus);\n const caseDetailsStatus = useSelector(selectCaseDetailsStatus);\n const employeeAbsencesStatus = useSelector(selectEmployeeAbsencesStatus);\n const isLoading = any(equals('pending'))([ employeeDetailsStatus, caseDetailsStatus, employeeAbsencesStatus ]);\n\n function handleTabChange (_: React.ChangeEvent<{}>, newTab: LeaveRecordTab) {\n setActiveTab(newTab);\n history.push(`/leave-records/${eeId}/case/${caseId}/${newTab}`);\n }\n\n /* eslint-disable react-hooks/exhaustive-deps */\n useEffect(() => {\n if (employeeDetailsStatus === 'uninitialized') {\n dispatch(fetchEmployeeDetails({ companyId, eeId }));\n }\n\n dispatch(fetchCaseDetails({ companyId, caseId }));\n }, []);\n\n return (\n <div className=\"w-full mx-8 my-4\" data-testid=\"leave-record-details-page\">\n <LeaveRecordsPageHeader currentRoute=\"case\" eeId={employeeSummary.eeId} />\n <LeaveRecordsEmployeeHeader employeeSummary={employeeSummary} />\n <div className=\"w-full flex space-x-8\">\n <PageContentPaper>\n <Tabs\n indicatorColor=\"primary\"\n textColor=\"primary\"\n className=\"-ml-4 -mt-4 flex justify-around\"\n value={tab}\n centered\n onChange={handleTabChange}\n >\n <Tab\n data-testid=\"case-info-tab\"\n value=\"case-info\"\n label=\"Case Information\"\n />\n <Tab\n data-testid=\"employee-info-tab\"\n value=\"employee-info\"\n label=\"Employee Information\"\n />\n <Tab\n data-testid=\"paperwork-dates-tab\"\n value=\"paperwork-dates\"\n label=\"Paperwork Dates\"\n />\n <Tab\n data-testid=\"current-approvals-tab\"\n value=\"current-approvals\"\n label=\"Current Approvals\"\n />\n </Tabs>\n <LeaveRecordTabPanels\n activeTab={activeTab}\n caseDetails={caseDetails}\n employeeDetails={employeeDetails}\n />\n {\n isLoading && (\n <Loading />\n )\n }\n </PageContentPaper>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { useHistory } from 'react-router-dom';\nimport MenuItem from '@mui/material/MenuItem';\nimport Avatar from '@mui/material/Avatar';\nimport { EmployeeSearchResults } from 'leave-records/leaveRecord.types';\nimport { avatarColor, getInitials } from 'components/shared/avatar-color-palette';\n\ninterface Props {\n employeeSearchResult: EmployeeSearchResults;\n onClose: () => void;\n}\n\nexport function LeaveRecordsSearchResultRow({ employeeSearchResult: result, onClose }: Readonly<Props>) {\n const history = useHistory();\n\n function onSelect() {\n history.push(`/leave-records/all-cases/${result.eeId}`);\n onClose();\n }\n\n return (\n <div data-testid=\"leave-result-item\">\n <MenuItem\n onClick={onSelect}\n className=\"flex justify-between w-full flex-nowrap space-x-3\"\n key={result.eeId}\n >\n <Avatar\n className={`p-2 w-10 text-sm ${avatarColor(result.firstName, result.lastName)}`}\n >\n {getInitials(result.firstName, result.lastName)}\n </Avatar>\n <p className=\"whitespace-nowrap flex-grow\">\n {result.firstName} {result.lastName}\n </p>\n <p className=\"whitespace-nowrap\">\n {result.eeId}\n </p>\n {!!result.taxIdLast4 && (\n <p className=\"whitespace-nowrap\">\n ***-**-{result.taxIdLast4}\n </p>\n )}\n </MenuItem>\n </div>\n );\n}\n","import React, { forwardRef, MouseEvent, ReactElement, RefObject } from 'react';\nimport { useSelector } from 'react-redux';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport Popper from '@mui/material/Popper';\nimport Grow from '@mui/material/Grow';\nimport Paper from '@mui/material/Paper';\nimport MenuItem from '@mui/material/MenuItem';\nimport { always, both, compose, cond, equals, gt, length, T, __ } from 'ramda';\nimport { popperLoadingIndicator } from 'participant-search/ParticipantSearchResults';\nimport { LeaveRecordsSearchResultRow } from 'leave-records/components/LeaveRecordsSearchResultRow';\nimport { selectEmployeeSearchResults, selectEmployeeSearchResultsStatus } from 'leave-records/leave-records.slice';\n\ninterface Props {\n anchorRef: RefObject<HTMLElement>;\n isOpen: boolean;\n onClose: () => void;\n}\n\nfunction LeaveRecordsSearchResultsContainer({ anchorRef, isOpen, onClose }: Readonly<Props>) {\n const searchResults = useSelector(selectEmployeeSearchResults);\n const searchStatus = useSelector(selectEmployeeSearchResultsStatus);\n const width = anchorRef.current?.offsetWidth ?? 0;\n\n function handleClose(event: MouseEvent<EventTarget>) {\n if (anchorRef.current?.contains(event.target as HTMLElement)) {\n return;\n }\n\n onClose();\n }\n\n return (\n <div className=\"w-full\" data-testid=\"popper-menu\">\n <Popper\n style={ { width, zIndex: 1 } }\n open={isOpen}\n anchorEl={anchorRef.current}\n role={undefined}\n transition\n disablePortal\n placement=\"bottom-start\"\n >\n {({ TransitionProps, placement }) => (\n <Grow\n {...TransitionProps}\n style={ { transformOrigin: placement.includes('bottom') ? 'left top' : 'left bottom' } }\n >\n <Paper>\n <ClickAwayListener onClickAway={handleClose as any}>\n <div>\n { cond<string, ReactElement>([\n [ equals('pending'), always(\n popperLoadingIndicator(width),\n ) ],\n [ both(\n compose(gt(__, 0), length, always(searchResults)),\n compose(equals('fulfilled')),\n ),\n always(\n <>\n {searchResults.map(result => (\n <LeaveRecordsSearchResultRow\n onClose={onClose}\n employeeSearchResult={result}\n key={result.eeId}\n />\n ))}\n </>,\n ) ],\n [ both(\n compose(equals(0), length, always(searchResults)),\n compose(equals('fulfilled')),\n ), always(<MenuItem>No Results Found</MenuItem>) ],\n [ T, always(<div />) ],\n ])(searchStatus)}\n </div>\n </ClickAwayListener>\n </Paper>\n </Grow>\n )}\n </Popper>\n </div>\n );\n}\n\nexport default forwardRef(LeaveRecordsSearchResultsContainer);\n","import React, { useRef, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { compose, F, T } from 'ramda';\nimport store from 'store';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport LeaveRecordsSearchResultsContainer from 'leave-records/components/LeaveRecordsSearchResultsContainer';\nimport withDebounce from 'components/shared/HOC/WithDebounce';\nimport SearchInput from 'components/shared/SearchInput';\nimport { fetchEmployeeSearchResultsByCriteria } from 'leave-records/leave-records.thunk';\n\nconst DebouncedSearch = withDebounce(SearchInput, 500);\n\nexport function LeaveRecordsSearchInput() {\n const dispatch = useDispatch<typeof store.dispatch>();\n const [ isOpen, setIsOpen ] = useState(false);\n\n const anchorRef = useRef<HTMLDivElement>(null);\n const companyId = useSelector(selectSelectedCompany)?.compid ?? 0;\n const searchPromise = useRef() as any;\n\n function onDebounceChange(criteria: string) {\n if (criteria.length) {\n searchPromise.current?.abort('cancelled');\n searchPromise.current = dispatch(fetchEmployeeSearchResultsByCriteria({ criteria, companyId }));\n }\n }\n\n return (\n <>\n <h3 className=\"text-base font-medium uppercase\">Search Leave Cases</h3>\n <div ref={anchorRef} data-testid=\"search-bar\">\n <DebouncedSearch\n placeholder=\"Search by Name/Employee ID\"\n size=\"small\"\n label=\"\"\n className=\"rounded-full text-sm\"\n onDebouncedChange={onDebounceChange}\n onFocus={compose(setIsOpen, T)}\n onBlur={compose(setIsOpen, T)}\n aria-controls={isOpen ? 'menu-list-grow' : undefined}\n aria-haspopup=\"true\"\n />\n </div>\n <LeaveRecordsSearchResultsContainer\n anchorRef={anchorRef}\n isOpen={isOpen}\n onClose={compose(setIsOpen, F)}\n />\n </>\n );\n}\n","import Avatar from '@mui/material/Avatar';\nimport Button from '@mui/material/Button';\nimport EditIcon from '@mui/icons-material/Edit';\nimport TableCell from '@mui/material/TableCell';\nimport TableRow from '@mui/material/TableRow';\n\nimport { LeaveRecordCaseSummaryAndName } from 'leave-records/leaveRecord.types';\nimport { valueOrPlaceholder, dateOrPlaceholder } from 'shared/utils';\nimport { avatarColor, getInitials } from 'components/shared/avatar-color-palette';\nimport { DateFormat_M_D_YYYY } from 'shared/consts/date-time.consts';\n\ninterface Props {\n caseSummary: LeaveRecordCaseSummaryAndName;\n onViewEdit: () => void;\n showFullName?: boolean;\n}\n\nexport function LeaveRecordsTableRow({ caseSummary, onViewEdit, showFullName = false }: Readonly<Props>) {\n const placeholder = '-';\n\n return (\n <TableRow\n className=\"group hover:bg-zinc-100 hover:cursor-pointer\"\n key={`case-${caseSummary.caseListId}`}\n data-testid={`case-${caseSummary.caseListId}`}\n onClick={onViewEdit}\n >\n {showFullName && (\n <TableCell className=\"text-sm\">\n <div className=\"flex flex-row\">\n <Avatar\n className={`p-2 w-10 text-sm ${avatarColor(caseSummary.firstName ?? '', caseSummary.lastName ?? '')}`}\n >\n {getInitials(caseSummary.firstName ?? '', caseSummary.lastName ?? '')}\n </Avatar>\n <p className=\"whitespace-nowrap ml-5 self-center\">\n {caseSummary.firstName ?? ''} {caseSummary.lastName ?? ''}\n </p>\n </div>\n </TableCell>\n )}\n <TableCell className=\"text-sm\">{valueOrPlaceholder(caseSummary.title, placeholder)}</TableCell>\n <TableCell className=\"text-sm\">\n {dateOrPlaceholder(caseSummary.startDate, DateFormat_M_D_YYYY, placeholder)}\n </TableCell>\n <TableCell className=\"text-sm\">\n {dateOrPlaceholder(caseSummary.endDate, DateFormat_M_D_YYYY, placeholder)}\n </TableCell>\n <TableCell className=\"text-sm\">{valueOrPlaceholder(caseSummary.reasonForLeaveNrR, placeholder)}</TableCell>\n <TableCell className=\"text-sm\">\n <Button\n variant=\"text\"\n className=\"text-sm text-black invisible group-hover:visible\"\n data-testid={`case-${caseSummary.caseListId}-view-button`}\n startIcon={<EditIcon />}\n >\n View/Edit\n </Button>\n </TableCell>\n </TableRow>\n );\n}\n","import React, { useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport TableCell from '@mui/material/TableCell';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableContainer from '@mui/material/TableContainer';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport { LeaveRecordsSearchInput } from 'leave-records/components/LeaveRecordsSearchInput';\nimport { LeaveRecordsPageHeader } from 'leave-records/components/LeaveRecordsPageHeader';\nimport store from 'store';\nimport {\n getRecentlyViewedFromLocalStorage,\n resetLeaveRecordsApiStatus,\n selectRecentlyViewedEmployeeAbsences,\n updateRecentlyViewed,\n} from 'leave-records/leave-records.slice';\nimport { LeaveRecordsTableRow } from 'leave-records/components/LeaveRecordsTableRow';\nimport { LeaveRecordCaseSummaryAndName } from 'leave-records/leaveRecord.types';\n\nexport function ParticipantLeaveRecords() {\n const dispatch = useDispatch<typeof store.dispatch>();\n const recentlyViewed = useSelector(selectRecentlyViewedEmployeeAbsences);\n const history = useHistory();\n\n /* eslint-disable react-hooks/exhaustive-deps */\n useEffect(() => {\n dispatch(resetLeaveRecordsApiStatus());\n dispatch(getRecentlyViewedFromLocalStorage());\n }, []);\n\n const handleViewEdit = (result: LeaveRecordCaseSummaryAndName) => () => {\n dispatch(updateRecentlyViewed(result));\n history.push(`/leave-records/${result.eeId}/case/${result.caseListId}/case-info`);\n };\n\n return (\n <div data-testid=\"leave-records-page\" className=\"w-full mt-4 mb-8 px-8\">\n <LeaveRecordsPageHeader />\n <PageContentPaper>\n <LeaveRecordsSearchInput />\n </PageContentPaper>\n {!!recentlyViewed.length && (\n <div className=\"mt-5\">\n <PageContentPaper>\n <h2 className=\"page-title my-0\">Recently Viewed</h2>\n <TableContainer data-testid=\"recently-viewed\">\n <Table>\n <TableHead>\n <TableRow>\n <TableCell className=\"text-sm font-normal whitespace-nowrap pl-20\">Full Name</TableCell>\n <TableCell className=\"text-sm font-normal whitespace-nowrap\">Employee ID</TableCell>\n <TableCell className=\"text-sm font-normal whitespace-nowrap\">Leave Start</TableCell>\n <TableCell className=\"text-sm font-normal whitespace-nowrap\">Leave End</TableCell>\n <TableCell className=\"text-sm font-normal whitespace-nowrap\">Reason for Leave</TableCell>\n <TableCell />\n </TableRow>\n </TableHead>\n <TableBody>\n {recentlyViewed.map(c => (\n <LeaveRecordsTableRow\n onViewEdit={handleViewEdit(c)}\n showFullName\n caseSummary={c}\n key={`leave-case-row-${c.caseListId}}`}\n />\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n </PageContentPaper>\n </div>\n )}\n </div>\n );\n}\n","import { useHistory, useParams } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport TableContainer from '@mui/material/TableContainer';\nimport Table from '@mui/material/Table';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport TableBody from '@mui/material/TableBody';\nimport { LeaveRecordsTableRow } from './LeaveRecordsTableRow';\nimport {\n LeaveRecordCaseSummary,\n} from 'leave-records/leaveRecord.types';\nimport store from 'store';\nimport { selectEmployeeDetails, updateRecentlyViewed } from 'leave-records/leave-records.slice';\n\ninterface Props {\n cases: LeaveRecordCaseSummary[];\n}\n\nexport function LeaveRecordsTable({ cases }: Readonly<Props>) {\n const dispatch = useDispatch<typeof store.dispatch>();\n const history = useHistory();\n const { eeId } = useParams<{ eeId: string; }>();\n const employeeDetails = useSelector(selectEmployeeDetails);\n\n const handleViewEdit = (result: LeaveRecordCaseSummary) => () => {\n dispatch(updateRecentlyViewed({\n ...result,\n eeId: employeeDetails?.eeId,\n firstName: employeeDetails?.firstName,\n lastName: employeeDetails?.lastName,\n }));\n history.push(`/leave-records/${eeId}/case/${result.caseListId}/case-info`);\n };\n\n return (\n <TableContainer data-testid=\"leave-records-table\">\n <Table>\n <TableHead>\n <TableRow>\n <TableCell className=\"text-sm font-normal whitespace-nowrap\">Case ID</TableCell>\n <TableCell className=\"text-sm font-normal whitespace-nowrap\">Leave Start</TableCell>\n <TableCell className=\"text-sm font-normal whitespace-nowrap\">Leave End</TableCell>\n <TableCell className=\"text-sm font-normal whitespace-nowrap\">Reason for Leave</TableCell>\n <TableCell />\n </TableRow>\n </TableHead>\n <TableBody>\n {\n cases.length === 0 && (\n <TableRow data-testid=\"no-records-row\">\n <TableCell colSpan={5} className=\"text-center\">Employee has no leave case records.</TableCell>\n </TableRow>\n )\n }\n {\n cases.length > 0 &&\n cases.map((c) => (\n <LeaveRecordsTableRow\n caseSummary={c}\n onViewEdit={handleViewEdit(c)}\n key={`leave-case-row-${c.caseListId}}`}\n />\n ))\n }\n </TableBody>\n </Table>\n </TableContainer>\n );\n}\n","import { useEffect } from 'react';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { any, equals } from 'ramda';\nimport { Button } from '@mui/material';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport AddIcon from '@mui/icons-material/Add';\n\nimport store from 'store';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport {\n selectCasesSummary,\n selectCasesSummaryStatus,\n selectEmployeeDetails,\n selectEmployeeDetailsStatus,\n} from 'leave-records/leave-records.slice';\nimport { fetchCasesSummary, fetchEmployeeDetails } from 'leave-records/leave-records.thunk';\nimport { EmployeeSearchResults } from 'leave-records/leaveRecord.types';\nimport { LeaveRecordsTable } from 'leave-records/components/LeaveRecordsTable';\nimport { LeaveRecordsSearchInput } from 'leave-records/components/LeaveRecordsSearchInput';\nimport { LeaveRecordsEmployeeHeader } from 'leave-records/components/LeaveRecordsEmployeeHeader';\nimport { LeaveRecordsPageHeader } from 'leave-records/components/LeaveRecordsPageHeader';\nimport Loading from 'components/shared/Loading';\n\nexport function LeaveRecordsByEmployee() {\n const dispatch = useDispatch<typeof store.dispatch>();\n const history = useHistory();\n const companyId = useSelector(selectSelectedCompany)?.compid ?? 0;\n const { eeId } = useParams<{ eeId: string; }>();\n const allLeaveCases = useSelector(selectCasesSummary);\n const employeeDetails = useSelector(selectEmployeeDetails);\n const employeeSummary: EmployeeSearchResults = {\n firstName: employeeDetails?.firstName ?? '',\n lastName: employeeDetails?.lastName ?? '',\n eeId: employeeDetails?.eeId ?? '',\n taxIdLast4: employeeDetails?.taxIdLast4 ?? null,\n };\n const employeeDetailsStatus = useSelector(selectEmployeeDetailsStatus);\n const casesSummaryStatus = useSelector(selectCasesSummaryStatus);\n const isLoading = any(equals('pending'))([ employeeDetailsStatus, casesSummaryStatus ]);\n\n function onViewReportAbsence() {\n history.push(`/leave-records/${eeId}/absence-report`);\n }\n\n function onEnterLeaveRequest() {\n history.push(`/enter-leave-request/personal-details`);\n }\n\n useEffect(() => {\n dispatch(fetchEmployeeDetails({ companyId, eeId }));\n\n dispatch(fetchCasesSummary({ companyId, eeId }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ eeId ]);\n\n return (\n <div className=\"w-full mt-4 mb-8 px-8\" data-testid=\"leave-records-by-employee-page\">\n <LeaveRecordsPageHeader currentRoute=\"all-cases\" eeId={eeId} />\n <PageContentPaper className=\"mb-4\">\n <LeaveRecordsSearchInput />\n </PageContentPaper>\n <div className=\"flex justify-between items-center\">\n <LeaveRecordsEmployeeHeader employeeSummary={employeeSummary} />\n <div className=\"flex mb-4\">\n <Button\n data-testid=\"view-report-absence-btn\"\n className=\"mr-4 whitespace-nowrap\"\n size=\"small\"\n variant=\"outlined\"\n onClick={onViewReportAbsence}\n >\n View/Report Absence\n </Button>\n <Button\n data-testid=\"enter-leave-request-btn\"\n className=\"whitespace-nowrap\"\n size=\"small\"\n variant=\"contained\"\n onClick={onEnterLeaveRequest}\n startIcon={<AddIcon />}\n >\n Enter Leave Request\n </Button>\n </div>\n </div>\n <PageContentPaper className=\"p-0\">\n <LeaveRecordsTable cases={allLeaveCases} />\n </PageContentPaper>\n {\n isLoading && (\n <Loading />\n )\n }\n </div>\n );\n}\n","export const defaultPersonalDetailsFields = {\n eeId: '',\n nameFirst: '',\n nameLast: '',\n dob: '',\n phone: '',\n addr1: '',\n addr2: '',\n city: '',\n stateProvCd: '',\n postalCd: '',\n};\n\nexport const defaultEventInfoFields = {\n absenceDate: '',\n hours: '',\n minutes: '',\n title: '',\n};\n\nexport const headerTextEnum = {\n personalDetails: 'Please use the form below to report intermittent absences to Flores Leave Solutions.',\n eventInfo: 'Enter the absence details below.',\n summary: 'Are you sure you want to submit this Absence?',\n};\n\nexport const submitTextEnum = {\n next: 'Next Step',\n submit: 'Submit Absence',\n};\n","import PersonOutlineIcon from '@mui/icons-material/PersonOutline';\nimport DescriptionIcon from '@mui/icons-material/Description';\nimport EventIcon from '@mui/icons-material/Event';\nimport { WizardStep } from 'components/shared/WizardStepper';\n\nexport type ReportAbsenceStepSlug = 'personal-details' | 'event-info' | 'summary';\n\nconst wizardSteps: Map<ReportAbsenceStepSlug, WizardStep> = new Map([\n [\n 'personal-details',\n {\n label: 'Personal Details',\n icon: PersonOutlineIcon,\n slug: 'personal-details',\n next: 'event-info',\n },\n ],\n [\n 'event-info',\n {\n label: 'Event Info',\n icon: EventIcon,\n slug: 'event-info',\n next: 'summary',\n prev: 'personal-details',\n },\n ],\n [\n 'summary',\n {\n label: 'Summary',\n icon: DescriptionIcon,\n slug: 'summary',\n prev: 'event-info',\n },\n ],\n]);\n\nexport default wizardSteps;\n","import * as yup from 'yup';\nimport {\n fname,\n lname,\n hstreet1,\n hstreet2,\n hcity,\n hstate,\n requiredText,\n errorMessages,\n regexPatterns,\n} from 'shared/common-validators';\nimport { ReportAbsenceStepSlug } from './report-an-absence-steps';\n\nexport const personalDetailsSchema = yup.object().shape({\n employee: yup.object({\n eeId: yup\n .string()\n .required(requiredText),\n nameFirst: fname.fname,\n nameLast: lname.lname,\n dob: yup\n .date()\n .typeError('Invalid Date Format')\n .nullable(),\n phone: yup\n .string()\n .matches(regexPatterns.phone, errorMessages.phone.matches)\n .max(14, errorMessages.phone.max)\n .min(10, errorMessages.phone.min)\n .nullable(),\n addr1: hstreet1.hstreet1,\n addr2: hstreet2.hstreet2,\n city: hcity.hcity,\n stateProvCd: hstate.hstate,\n postalCd: yup\n .string()\n .trim()\n .matches(regexPatterns.postalCd, errorMessages.postalCd.matches)\n .min(5, errorMessages.postalCd.min)\n .max(10, errorMessages.postalCd.max)\n .required(requiredText),\n }),\n});\n\nexport const eventInfoSchema = yup.object().shape({\n event: yup.object({\n absenceDate: yup\n .date()\n .typeError('Invalid Date Format')\n .required(requiredText),\n hours: yup\n .number()\n .min(0, 'Value must be between 0 and 24')\n .max(24, 'Value must be between 0 and 24')\n .required(requiredText),\n minutes: yup\n .number()\n .min(0, 'Value must be between 0 and 59')\n .max(59, 'Value must be between 0 and 59')\n .required(requiredText),\n title: yup\n .string()\n .max(50, 'Must be 50 characters or less')\n .nullable(),\n }),\n});\n\nexport const reportAbsenceSchema = personalDetailsSchema.concat(eventInfoSchema);\n\nexport const validation = new Map<ReportAbsenceStepSlug, object>([\n [ 'personal-details', personalDetailsSchema ],\n [ 'event-info', eventInfoSchema ],\n [ 'summary', reportAbsenceSchema ],\n]);\n","import { useEffect } from 'react';\nimport { useFormikContext } from 'formik';\nimport TextField from '@mui/material/TextField';\n\nimport {\n handleCustomFieldChange,\n formikFieldErrorText,\n formikFieldHasError,\n} from 'shared/form-helpers';\nimport { FormikMuiDatePicker } from 'components/shared/form/formik/FormikMuiDatePicker';\nimport StateSelect from 'components/shared/StateSelect';\nimport { ReportAbsenceFormFields } from 'report-an-absence/report-an-absence.types';\n\nexport function ReportAnAbsencePersonalDetails(): React.ReactElement {\n const form = useFormikContext<ReportAbsenceFormFields>();\n\n /* eslint-disable react-hooks/exhaustive-deps */\n useEffect(() => {\n form.validateForm();\n }, []);\n\n return (\n <>\n <div className=\"flex space-x-4 mb-4\" data-testid=\"report-an-absence-personal-details\">\n <TextField\n data-testid=\"eeId\"\n className=\"w-1/2\"\n variant=\"outlined\"\n label=\"EEID\"\n name=\"employee.eeId\"\n value={form.values.employee.eeId}\n error={formikFieldHasError('employee.eeId', form)}\n helperText={formikFieldErrorText('employee.eeId', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n />\n <div className=\"basis-1/2\" />\n </div>\n <div className=\"flex space-x-4 mb-4\">\n <TextField\n data-testid=\"first-name\"\n className=\"basis-1/2\"\n variant=\"outlined\"\n label=\"First Name\"\n name=\"employee.nameFirst\"\n value={form.values.employee.nameFirst}\n error={formikFieldHasError('employee.nameFirst', form)}\n helperText={formikFieldErrorText('employee.nameFirst', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n />\n <TextField\n data-testid=\"last-name\"\n className=\"basis-1/2\"\n variant=\"outlined\"\n label=\"Last Name\"\n name=\"employee.nameLast\"\n value={form.values.employee.nameLast}\n error={formikFieldHasError('employee.nameLast', form)}\n helperText={formikFieldErrorText('employee.nameLast', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n />\n </div>\n <div className=\"flex space-x-4 mb-4\">\n <FormikMuiDatePicker\n className=\"basis-1/2\"\n label=\"Date of Birth (Optional)\"\n path=\"employee.dob\"\n form={form}\n hasError={formikFieldHasError('employee.dob', form)}\n value={form.values.employee.dob}\n handleChange={form.handleChange}\n handleBlur={form.handleBlur}\n />\n <TextField\n data-testid=\"phone\"\n className=\"basis-1/2\"\n variant=\"outlined\"\n label=\"Phone (Optional)\"\n name=\"employee.phone\"\n value={form.values.employee.phone}\n error={formikFieldHasError('employee.phone', form)}\n helperText={formikFieldErrorText('employee.phone', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n />\n </div>\n <div className=\"flex space-x-4 mb-4\">\n <TextField\n data-testid=\"addr1\"\n fullWidth\n variant=\"outlined\"\n label=\"Address Line 1\"\n name=\"employee.addr1\"\n value={form.values.employee.addr1}\n error={formikFieldHasError('employee.addr1', form)}\n helperText={formikFieldErrorText('employee.addr1', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n />\n </div>\n <div className=\"flex space-x-4 mb-4\">\n <TextField\n data-testid=\"addr2\"\n fullWidth\n variant=\"outlined\"\n label=\"Address Line 2 (Optional)\"\n name=\"employee.addr2\"\n value={form.values.employee.addr2}\n error={formikFieldHasError('employee.addr2', form)}\n helperText={formikFieldErrorText('employee.addr2', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n />\n </div>\n <div className=\"flex space-x-4 mb-4\">\n <TextField\n data-testid=\"city\"\n className=\"basis-1/2\"\n variant=\"outlined\"\n label=\"City\"\n name=\"employee.city\"\n value={form.values.employee.city}\n error={formikFieldHasError('employee.city', form)}\n helperText={formikFieldErrorText('employee.city', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n />\n <StateSelect\n data-testid=\"state\"\n className=\"basis-1/4\"\n label=\"State\"\n name=\"employee.stateProvCd\"\n value={form.values.employee.stateProvCd}\n onStateChanged={handleCustomFieldChange('employee.stateProvCd', form)}\n onStateBlur={form.handleBlur}\n error={formikFieldHasError('employee.stateProvCd', form)}\n />\n <TextField\n data-testid=\"zip\"\n className=\"basis-1/4\"\n variant=\"outlined\"\n label=\"Zip\"\n name=\"employee.postalCd\"\n value={form.values.employee.postalCd}\n error={formikFieldHasError('employee.postalCd', form)}\n helperText={formikFieldErrorText('employee.postalCd', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n />\n </div>\n </>\n );\n}\n","import { useEffect } from 'react';\nimport { useFormikContext } from 'formik';\nimport TextField from '@mui/material/TextField';\n\nimport {\n formikFieldErrorText,\n formikFieldHasError,\n} from 'shared/form-helpers';\nimport { FormikMuiDatePicker } from 'components/shared/form/formik/FormikMuiDatePicker';\nimport { ReportAbsenceFormFields } from 'report-an-absence/report-an-absence.types';\n\nexport function ReportAnAbsenceEventInfo(): React.ReactElement {\n const form = useFormikContext<ReportAbsenceFormFields>();\n\n /* eslint-disable react-hooks/exhaustive-deps */\n useEffect(() => {\n form.validateForm();\n }, []);\n\n return (\n <>\n <div className=\"flex space-x-4 mb-4\" data-testid=\"report-an-absence-event-info\">\n <FormikMuiDatePicker\n className=\"basis-1/2\"\n label=\"Date of Absence\"\n path=\"event.absenceDate\"\n form={form}\n hasError={formikFieldHasError('event.absenceDate', form)}\n value={form.values.event.absenceDate}\n handleChange={form.handleChange}\n handleBlur={form.handleBlur}\n />\n <TextField\n data-testid=\"hours\"\n className=\"w-1/2\"\n type=\"number\"\n variant=\"outlined\"\n label=\"Hours\"\n name=\"event.hours\"\n inputProps={ { min: 0, max: 24 } }\n value={form.values.event.hours}\n error={formikFieldHasError('event.hours', form)}\n helperText={formikFieldErrorText('event.hours', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n />\n </div>\n <div className=\"flex space-x-4 mb-4\">\n <TextField\n data-testid=\"minutes\"\n className=\"w-1/2\"\n type=\"number\"\n variant=\"outlined\"\n label=\"Minutes\"\n name=\"event.minutes\"\n inputProps={ { min: 0, max: 59 } }\n value={form.values.event.minutes}\n error={formikFieldHasError('event.minutes', form)}\n helperText={formikFieldErrorText('event.minutes', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n />\n <TextField\n data-testid=\"title\"\n className=\"w-1/2\"\n variant=\"outlined\"\n label=\"Case Number\"\n name=\"event.title\"\n value={form.values.event.title}\n error={formikFieldHasError('event.title', form)}\n helperText={formikFieldErrorText('event.title', form)}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n />\n </div>\n </>\n );\n}\n","import { useEffect } from 'react';\nimport { Link } from 'react-router-dom';\nimport { useFormikContext } from 'formik';\nimport dayjs from 'dayjs';\n\nimport classes from './ReportAnAbsenceSummary.module.css';\nimport { ReportAbsenceFormFields } from 'report-an-absence/report-an-absence.types';\nimport { DateFormat_M_D_YYYY } from 'shared/consts/date-time.consts';\nimport { always, any, ifElse, isEmpty } from 'ramda';\n\nexport function ReportAnAbsenceSummary(): React.ReactElement {\n const form = useFormikContext<ReportAbsenceFormFields>();\n const { values, errors } = form;\n const hasPersonalDetailsErrors = errors.employee;\n const hasEventDetailsErrors = errors.event;\n const absenceDate = ifElse(\n isEmpty,\n always(''),\n always(dayjs(values.event.absenceDate).format(DateFormat_M_D_YYYY)),\n )(values.event.absenceDate);\n const dob = ifElse(\n isEmpty,\n always(''),\n always(dayjs(values.employee.dob).format(DateFormat_M_D_YYYY)),\n )(values.employee.dob);\n const absenceTime = ifElse(\n any(isEmpty),\n always(''),\n always(`${dayjs().hour((parseInt(values.event.hours))).format('hh')}\n : ${dayjs().minute(parseInt(values.event.minutes)).format('mm')}`),\n )([ values.event.hours, values.event.minutes ]);\n\n /* eslint-disable react-hooks/exhaustive-deps */\n useEffect(() => {\n form.validateForm();\n }, []);\n\n return (\n <div className=\"flex space-x-8 mb-12\" data-testid=\"report-an-absence-summary\">\n <div className=\"w-1/2\">\n <div className=\"flex justify-between items-center w-full pb-2 mb-2 border-b border-b-gray-200\">\n <p className={classes.sectionHeader}>Personal Details</p>\n <Link to=\"/report-an-absence/personal-details\" className={`${classes.link} text-sm`}>Edit</Link>\n </div>\n {\n hasPersonalDetailsErrors && (\n <p className=\"text-sm text-red-600 mb-4\" data-testid=\"personal-details-error\">\n One or more validation errors occurred\n </p>\n )\n }\n <dl className=\"text-sm\">\n <dt className=\"font-bold\">{values.employee.nameFirst} {values.employee.nameLast}</dt>\n {\n values.employee.dob &&\n (\n <div className=\"flex\" data-testid=\"dob\">\n <dt className=\"pr-2\">Date of Birth:</dt>\n <dd className=\"font-bold flex-grow\">{dob}</dd>\n </div>\n )\n }\n {\n values.employee.phone &&\n (\n <div className=\"flex\" data-testid=\"phone\">\n <dt className=\"pr-2\">Phone:</dt>\n <dd className=\"font-bold flex-grow\">{values.employee.phone}</dd>\n </div>\n )\n }\n <div className=\"flex\">\n <dt className=\"pr-2\">Address:</dt>\n <dd className=\"font-bold basis-5 flex-grow\">\n {values.employee.addr1}\n {\n values.employee.addr2 &&\n (\n <span data-testid=\"addr2\">\n <br />{values.employee.addr2}\n </span>\n )\n }\n <br />{values.employee.city}, {values.employee.stateProvCd} {values.employee.postalCd}\n </dd>\n </div>\n </dl>\n </div>\n <div className=\"w-1/2\">\n <div className=\"flex justify-between items-center w-full pb-2 mb-2 border-b border-b-gray-200\">\n <p className={classes.sectionHeader}>Event Info</p>\n <Link to=\"/report-an-absence/event-info\" className={`${classes.link} text-sm`}>Edit</Link>\n </div>\n {\n hasEventDetailsErrors && (\n <p className=\"text-sm text-red-600 mb-4\" data-testid=\"event-info-error\">\n One or more validation errors occurred\n </p>\n )\n }\n <dl className=\"text-sm\">\n <div className=\"flex\">\n <dt className=\"pr-2\">Date of Absence:</dt>\n <dd className=\"font-bold\">{absenceDate}</dd>\n </div>\n <div className=\"flex\">\n <dt className=\"pr-2\">Hours & Minutes:</dt>\n <dd className=\"font-bold\">{absenceTime}</dd>\n </div>\n {\n values.event.title &&\n (\n <div className=\"flex\" data-testid=\"title\">\n <dt className=\"pr-2\">Case Number:</dt>\n <dd className=\"font-bold\">{values.event.title}</dd>\n </div>\n )\n }\n </dl>\n </div>\n </div>\n );\n}\n","import Button from '@mui/material/Button';\nimport withModal from 'components/shared/HOC/WithModal';\nimport CheckCircleOutlineOutlined from '@mui/icons-material/CheckCircleOutlineOutlined';\n\ninterface Props {\n onNewAbsence: () => void;\n onGoToDash: () => void;\n}\n\nexport function ReportAnAbsenceConfirmation({\n onNewAbsence,\n onGoToDash,\n}: Readonly<Props>): React.ReactElement {\n return (\n <div className=\"p-4 text-center bg-surface\" data-testid=\"report-absence-confirmation-modal\">\n <div className=\"text-green-600\">\n <CheckCircleOutlineOutlined color=\"inherit\" fontSize=\"large\" />\n </div>\n <h5 className=\"mb-8\">Absence has been submitted</h5>\n <Button\n variant=\"contained\"\n className=\"mr-4\"\n onClick={onNewAbsence}\n data-testid=\"btn-report-absence-add-new\"\n >\n Report Another Absence\n </Button>\n <Button\n variant=\"contained\"\n onClick={onGoToDash}\n data-testid=\"btn-report-absence-dashboard\"\n >\n Go to Dashboard\n </Button>\n </div>\n );\n}\n\nexport default withModal(ReportAnAbsenceConfirmation);\n","import { useEffect, useState } from 'react';\nimport { useHistory, useParams, useLocation } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { F, T, always, compose, cond, equals } from 'ramda';\nimport { FormikProvider, useFormik } from 'formik';\nimport Button from '@mui/material/Button';\n\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport CancelModal from 'components/shared/CancelModal';\nimport Loading from 'components/shared/Loading';\nimport { ReportAbsenceFormFields } from './report-an-absence.types';\nimport {\n defaultEventInfoFields,\n defaultPersonalDetailsFields,\n headerTextEnum,\n submitTextEnum,\n} from './report-an-absence-fields';\nimport wizardSteps, { ReportAbsenceStepSlug } from './report-an-absence-steps';\nimport WizardStepper, { WizardStep } from 'components/shared/WizardStepper';\nimport { ShowModal } from 'shared/types/modal.types';\nimport { SubmissionError } from 'components/shared/form/SubmissionError';\nimport { validation } from './report-an-absence.validation';\nimport store from 'store';\nimport { selectEmployeeDetails, selectEmployeeDetailsStatus } from 'leave-records/leave-records.slice';\nimport { selectSelectedCompanyId } from 'companies/companies.slice';\nimport { fetchEmployeeDetails } from 'leave-records/leave-records.thunk';\nimport { submitReportAnAbsenceForm } from 'shared/api/fmlaFormsApi';\nimport { ReportAnAbsencePersonalDetails } from './personal-details/ReportAnAbsencePersonalDetails';\nimport { ReportAnAbsenceEventInfo } from './event-info/ReportAnAbsenceEventInfo';\nimport { ReportAnAbsenceSummary } from './summary/ReportAnAbsenceSummary';\nimport ReportAnAbsenceConfirmation from './ReportAnAbsenceConfirmation';\n\nexport function ReportAnAbsence(): React.ReactElement {\n const dispatch = useDispatch<typeof store.dispatch>();\n const history = useHistory();\n const { stepSlug: activeStepSlug = 'personal-details' } = useParams<{ stepSlug: ReportAbsenceStepSlug; }>();\n\n const { search } = useLocation();\n const params = new URLSearchParams(search);\n const eeId = params.get('eeId') ?? '';\n const caseId = params.get('caseId') ?? '';\n\n const companyId = useSelector(selectSelectedCompanyId);\n const isLoading = useSelector(selectEmployeeDetailsStatus) === 'pending';\n const employeeDetails = useSelector(selectEmployeeDetails);\n\n const [ showModal, setShowModal ] = useState<ShowModal>('none');\n const [ isSubmitting, setIsSubmitting ] = useState(false);\n const [ hasSubmissionError, setHasSubmissionError ] = useState(false);\n const form = useFormik<ReportAbsenceFormFields>({\n enableReinitialize: true,\n initialValues: {\n employee: {\n ...defaultPersonalDetailsFields,\n eeId: employeeDetails?.eeId ?? defaultPersonalDetailsFields.eeId,\n nameFirst: employeeDetails?.firstName ?? defaultPersonalDetailsFields.nameFirst,\n nameLast: employeeDetails?.lastName ?? defaultPersonalDetailsFields.nameLast,\n phone: employeeDetails?.phone1 ?? defaultPersonalDetailsFields.phone,\n addr1: employeeDetails?.address1 ?? defaultPersonalDetailsFields.addr1,\n dob: employeeDetails?.dob ?? defaultPersonalDetailsFields.dob,\n },\n event: {\n ...defaultEventInfoFields,\n title: caseId || defaultEventInfoFields.title,\n },\n },\n validateOnMount: true,\n validationSchema: validation.get(activeStepSlug),\n onSubmit: (data) => {\n setHasSubmissionError(false);\n setIsSubmitting(true);\n submitReportAnAbsenceForm(companyId, data)\n .then(setModalState('success'))\n .catch(compose(setHasSubmissionError, T))\n .finally(compose(setIsSubmitting, F));\n },\n });\n\n const headerText = cond<ReportAbsenceStepSlug, string>([\n [\n equals<ReportAbsenceStepSlug>('personal-details'),\n always(headerTextEnum.personalDetails),\n ],\n [\n equals<ReportAbsenceStepSlug>('event-info'),\n always(headerTextEnum.eventInfo),\n ],\n [\n equals<ReportAbsenceStepSlug>('summary'),\n always(headerTextEnum.summary),\n ],\n ])(activeStepSlug);\n\n const submitText = activeStepSlug === 'summary'\n ? submitTextEnum.submit\n : submitTextEnum.next;\n\n function onNext() {\n const step = wizardSteps.get(activeStepSlug);\n\n if (step?.slug === 'summary') {\n form.submitForm();\n } else {\n history.push(`/report-an-absence/${step?.next}${search}`);\n }\n }\n\n function handleStepClick(step: WizardStep) {\n history.push(`/report-an-absence/${step.slug}${search}`);\n }\n\n function goToDashboard() {\n setShowModal('none');\n history.push('/dashboard');\n }\n\n function reportAnotherAbsence() {\n setShowModal('none');\n form.resetForm();\n history.push('/report-an-absence/personal-details');\n }\n\n const setModalState = (modal: ShowModal) => () => {\n setShowModal(modal);\n };\n\n /* eslint-disable react-hooks/exhaustive-deps */\n useEffect(() => {\n if (eeId !== '') {\n dispatch(fetchEmployeeDetails({ companyId, eeId }));\n }\n }, []);\n\n return (\n <div data-testid=\"report-an-absence-page\">\n <PageContentPaper className=\"mt-4 p-8\">\n <div className=\"mb-8\">\n <WizardStepper\n steps={wizardSteps}\n allowClick\n onChange={handleStepClick}\n />\n </div>\n <p className=\"mb-12\" data-testid=\"header-text\">{headerText}</p>\n <FormikProvider value={form}>\n {\n cond<ReportAbsenceStepSlug, JSX.Element>([\n [\n equals<ReportAbsenceStepSlug>('personal-details'),\n always(<ReportAnAbsencePersonalDetails />),\n ],\n [\n equals<ReportAbsenceStepSlug>('event-info'),\n always(<ReportAnAbsenceEventInfo />),\n ],\n [\n equals<ReportAbsenceStepSlug>('summary'),\n always(<ReportAnAbsenceSummary />),\n ],\n ])(activeStepSlug)\n }\n {\n hasSubmissionError && <SubmissionError />\n }\n <div className=\"flex justify-end\">\n <Button\n data-testid=\"btn-cancel\"\n type=\"button\"\n variant=\"text\"\n className=\"mr-4\"\n onClick={setModalState('cancel')}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n <Button\n data-testid=\"btn-next-step\"\n type=\"submit\"\n variant=\"contained\"\n className=\"whitespace-nowrap\"\n onClick={onNext}\n disabled={!form.isValid || isSubmitting}\n >\n {submitText}\n </Button>\n </div>\n </FormikProvider>\n </PageContentPaper>\n <CancelModal\n isOpen={showModal === 'cancel'}\n onCancel={goToDashboard}\n onClose={setModalState('none')}\n />\n <ReportAnAbsenceConfirmation\n isOpen={showModal === 'success'}\n onClose={goToDashboard}\n onGoToDash={goToDashboard}\n onNewAbsence={reportAnotherAbsence}\n />\n {\n isLoading && (\n <Loading />\n )\n }\n </div>\n );\n}\n","import { useEffect } from 'react';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport Button from '@mui/material/Button';\nimport EditIcon from '@mui/icons-material/Edit';\nimport PageContentPaper from 'components/layout/PageContentPaper';\nimport IconButton from '@mui/material/IconButton';\nimport TableContainer from '@mui/material/TableContainer';\nimport ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos';\nimport Table from '@mui/material/Table';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport TableBody from '@mui/material/TableBody';\nimport TableCell from '@mui/material/TableCell';\n\nimport { dateOrPlaceholder, valueOrPlaceholder } from 'shared/utils';\nimport { DateFormat_M_D_YYYY } from 'shared/consts/date-time.consts';\nimport store from 'store';\nimport { fetchEmployeeAbsences, fetchEmployeeDetails } from 'leave-records/leave-records.thunk';\nimport {\n selectEmployeeAbsences,\n selectEmployeeAbsencesStatus,\n selectEmployeeDetails,\n selectEmployeeDetailsStatus,\n} from 'leave-records/leave-records.slice';\nimport { selectSelectedCompany } from 'companies/companies.slice';\nimport { EmployeeSearchResults } from 'leave-records/leaveRecord.types';\nimport { LeaveRecordsEmployeeHeader } from 'leave-records/components/LeaveRecordsEmployeeHeader';\nimport Loading from 'components/shared/Loading';\nimport { any, equals } from 'ramda';\n\nexport function AbsenceReport() {\n const dispatch = useDispatch<typeof store.dispatch>();\n const history = useHistory();\n const { eeId } = useParams<{ eeId: string; }>();\n const companyId = useSelector(selectSelectedCompany)?.compid ?? 0;\n const employeeDetailsStatus = useSelector(selectEmployeeDetailsStatus);\n const absencesStatus = useSelector(selectEmployeeAbsencesStatus);\n const isLoading = any(equals('pending'))([ employeeDetailsStatus, absencesStatus ]);\n const employeeDetails = useSelector(selectEmployeeDetails);\n const employeeSummary: EmployeeSearchResults = {\n firstName: employeeDetails?.firstName ?? '',\n lastName: employeeDetails?.lastName ?? '',\n eeId: employeeDetails?.eeId ?? '',\n taxIdLast4: employeeDetails?.taxIdLast4 ?? null,\n };\n const absences = useSelector(selectEmployeeAbsences);\n const placeholder = '-';\n\n function onReportAbsence() {\n history.push(`/report-an-absence/personal-details/?eeId=${eeId}`);\n }\n\n /* eslint-disable react-hooks/exhaustive-deps */\n useEffect(() => {\n if (employeeDetailsStatus !== 'fulfilled') {\n dispatch(fetchEmployeeDetails({ companyId, eeId }));\n }\n\n dispatch(fetchEmployeeAbsences({ companyId, eeId }));\n }, []);\n\n return (\n <div className=\"w-full mx-8 my-4\" data-testid=\"absence-report-page\">\n <div className=\"flex items-center mb-4\">\n <IconButton\n aria-label=\"Go Back\"\n data-testid=\"go-back-button\"\n onClick={history.goBack}\n size=\"large\"\n >\n <ArrowBackIosIcon />\n </IconButton>\n <h2 className=\"page-title my-0\">Absence Report</h2>\n </div>\n <div className=\"flex items-center justify-between\">\n <LeaveRecordsEmployeeHeader employeeSummary={employeeSummary} />\n <Button\n data-testid=\"report-absence-btn\"\n className=\"whitespace-nowrap px-8 mb-4\"\n variant=\"contained\"\n size=\"small\"\n startIcon={<EditIcon />}\n onClick={onReportAbsence}\n >\n Report Absence\n </Button>\n </div>\n <PageContentPaper>\n <TableContainer sx={ { maxHeight: 500, overflowY: 'scroll', msOverflowY: 'scroll' } }>\n <Table stickyHeader>\n <TableHead>\n <TableRow>\n <TableCell>Date of Absence</TableCell>\n <TableCell>Hours</TableCell>\n <TableCell>Minutes</TableCell>\n <TableCell>Regulation Type</TableCell>\n <TableCell>Duration</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {\n absences.length === 0 && (\n <TableRow data-testid=\"no-absences-row\">\n <TableCell colSpan={5} className=\"text-center\">Employee has no absences</TableCell>\n </TableRow>\n )\n }\n {\n absences.length > 0 && absences.map((abs) => (\n <TableRow key={`absence-${abs.absenceId}`} data-testid={`absence-row-${abs.absenceId}`}>\n <TableCell>{dateOrPlaceholder(abs.absenceDate, DateFormat_M_D_YYYY, placeholder)}</TableCell>\n <TableCell>{valueOrPlaceholder(abs.hours, placeholder)}</TableCell>\n <TableCell>{valueOrPlaceholder(abs.minutes, placeholder)}</TableCell>\n <TableCell>{valueOrPlaceholder(abs.absenceType, placeholder)}</TableCell>\n <TableCell>{valueOrPlaceholder(abs.absenceDuration, placeholder)}</TableCell>\n </TableRow>\n ))\n }\n </TableBody>\n </Table>\n </TableContainer>\n </PageContentPaper>\n {\n isLoading && (\n <Loading />\n )\n }\n </div>\n );\n}\n","import { Switch as _Switch } from 'react-router-dom';\n\nimport AppRoute from 'routing/AppRoute';\nimport CompanySelect from './pages/CompanySelect';\nimport Dashboard from './pages/Dashboard';\nimport EnterCobraQePage from 'enter-cobra-qe/EnterCobraQePage';\nimport enterQeSteps from 'enter-cobra-qe/enter-cobra-qe-steps';\nimport Scratchpad from './pages/Scratchpad';\nimport FileUpload from 'fileupload/FileUpload';\nimport ReportHistory from 'report-history/ReportHistory';\nimport FileHistory from 'file-history/FileHistory';\nimport ParticipantOverview from 'participant-overview/ParticipantOverview';\nimport PlanEnrollmentWizard from 'plan-enrollment/PlanEnrollmentWizard';\nimport planEnrollmentSteps from 'plan-enrollment/plan-enrollment-steps';\nimport CobraPendingQENotices from 'cobra-pending-qe/CobraPendingQENotices';\nimport CobraPendingInitialNotices from 'cobra-pending-initial/CobraPendingInitialNotices';\nimport ManageSettings from 'manage-settings/ManageSettings';\nimport NotFoundPage from './pages/NotFound';\nimport UpdatePlanEnrollmentWizard from 'plan-enrollment-update/UpdatePlanEnrollmentWizard';\nimport updateEnrollmentSteps from 'plan-enrollment-update/update-plan-enrollment-steps';\nimport AddParticipant from 'add-participant/AddParticipant';\nimport EnterCobraInitialNotice from 'enter-cobra-initial-notice/EnterCobraInitialNotice';\nimport TerminateParticipant from 'terminate-participant/TerminateParticipant';\nimport UpdateCobraQe from 'update-cobra-qe/UpdateCobraQe';\nimport Reports from 'reports/Reports';\nimport OpenEnrollment from 'components/pages/OpenEnrollment';\nimport DirectBillingWizard from 'direct-billing/DirectBillingWizard';\nimport UpdateDirectBilling from 'update-direct-bill-event/UpdateDirectBilling';\nimport OpenEnrollmentResources from 'open-enrollment-resources/OpenEnrollmentResources';\nimport AdministrativeBilling from 'administrative-billing/AdministrativeBilling';\nimport MultiFactorAuth from 'multi-factor-authentication/MultiFactorAuth';\nimport DocumentLibrary from 'document-library/DocumentLibrary';\nimport DirectDebit from 'direct-debit/DirectDebit';\nimport AddUser from '../manage-settings/add-user/AddUser';\nimport ReEnrollmentChecklist from 're-enrollment-checklist/ReEnrollmentChecklist';\nimport CobraReEnrollmentChecklist from 're-enrollment-checklist/cobra/CobraReEnrollmentChecklist';\nimport CobraPlanReEnrollmentChecklist\n from 're-enrollment-checklist/cobra-reenrollment-checklist/CobraPlanReEnrollmentChecklist';\nimport LegacyChecklists from 're-enrollment-checklist/LegacyChecklists';\nimport RatesHistory from 'rates-history/RatesHistory';\nimport ContributionsNotForwarded from 'action-items/pages/contributions-not-forwarded/ContributionsNotForwarded';\nimport DirectBillReEnrollmentChecklist\n from 're-enrollment-checklist/direct-bill-reenrollment-checklist/DirectBillReEnrollmentChecklist';\nimport { useEffect } from 'react';\nimport { getUser } from 'authentication/authentication';\nimport { getCompaniesForUser, selectLoadingCompanies } from 'companies/companies.slice';\nimport { useDispatch, useSelector } from 'react-redux';\nimport store from 'store';\nimport { EnterLeaveRequestPage } from 'enter-leave-request/EnterLeaveRequestPage';\nimport { LeaveRecordDetails } from 'leave-records/leave-record-details/LeaveRecordDetails';\nimport { ParticipantLeaveRecords } from 'leave-records/participant-leave-records/ParticipantLeaveRecords';\nimport { LeaveRecordsByEmployee } from 'leave-records/leave-records-by-employee/LeaveRecordsByEmployee';\nimport { ReportAnAbsence } from 'report-an-absence/ReportAnAbsence';\nimport { AbsenceReport } from 'absence-report/AbsenceReport';\n\nconst Switch = _Switch as any;\n\nfunction App() {\n const dispatch = useDispatch<typeof store.dispatch>();\n const companyLoadingStatus = useSelector(selectLoadingCompanies);\n\n useEffect(() => {\n const user = getUser();\n\n if (!!user && !window.localStorage.getItem('isPartialLogin') && companyLoadingStatus === 'uninitialized') {\n dispatch(getCompaniesForUser(user));\n }\n }, [ dispatch, companyLoadingStatus ]);\n\n return (\n <Switch>\n <AppRoute\n title=\"Home\"\n path=\"/\"\n exact\n layout=\"wizard\"\n >\n <CompanySelect />\n </AppRoute>\n <AppRoute\n path=\"/verify-token\"\n title=\"2-Step Verification\"\n layout=\"wizard\"\n authRequired={false}\n >\n <MultiFactorAuth />\n </AppRoute>\n <AppRoute\n title=\"Select a Company\"\n path=\"/company-select\"\n layout=\"wizard\"\n >\n <CompanySelect />\n </AppRoute>\n <AppRoute\n title=\"Dashboard\"\n path=\"/dashboard\"\n layout=\"default\"\n >\n <Dashboard />\n </AppRoute>\n <AppRoute\n title=\"Scratchpad\"\n path=\"/scratchpad\"\n layout=\"default\"\n >\n <Scratchpad />\n </AppRoute>\n <AppRoute\n title=\"Enter COBRA QE\"\n path=\"/enter-cobra-qe/:stepSlug\"\n layout=\"wizard\"\n steps={enterQeSteps}\n >\n <EnterCobraQePage />\n </AppRoute>\n <AppRoute\n title=\"Enter Leave Request\"\n path=\"/enter-leave-request/:stepSlug\"\n layout=\"wizard\"\n >\n <EnterLeaveRequestPage />\n </AppRoute>\n <AppRoute\n title=\"Update COBRA QE\"\n path=\"/update-cobra-qe/:cQualId\"\n layout=\"wizard\"\n >\n <UpdateCobraQe />\n </AppRoute>\n <AppRoute\n title=\"Update Retiree/LOA Billing\"\n path=\"/update-direct-billing-event/:rQualId\"\n layout=\"wizard\"\n >\n <UpdateDirectBilling />\n </AppRoute>\n <AppRoute\n title=\"Enter COBRA Initial Notice\"\n path=\"/enter-cobra-initial-notice\"\n layout=\"default\"\n >\n <EnterCobraInitialNotice />\n </AppRoute>\n <AppRoute\n title=\"File Upload\"\n path=\"/file-upload\"\n layout=\"default\"\n >\n <FileUpload />\n </AppRoute>\n <AppRoute\n title=\"Document Library\"\n path=\"/document-library/:tab?\"\n layout=\"default\"\n >\n <DocumentLibrary />\n </AppRoute>\n <AppRoute\n title=\"Administrative Billing\"\n path=\"/administrative-billing\"\n layout=\"default\"\n >\n <AdministrativeBilling />\n </AppRoute>\n <AppRoute\n title=\"Report History\"\n path=\"/report-history\"\n layout=\"default\"\n >\n <ReportHistory />\n </AppRoute>\n <AppRoute\n title=\"File History\"\n path=\"/file-history\"\n layout=\"default\"\n >\n <FileHistory />\n </AppRoute>\n <AppRoute\n title=\"Perform Direct Debit\"\n path=\"/perform-direct-debit\"\n layout=\"default\"\n >\n <DirectDebit />\n </AppRoute>\n <AppRoute\n title=\"Participant Overview\"\n path=\"/participant-overview/:employeeNumber/:tab\"\n layout=\"default\"\n >\n <ParticipantOverview />\n </AppRoute>\n <AppRoute\n title=\"Plan Enrollment Wizard\"\n path=\"/plan-enrollment/:employeeNumber/:stepSlug\"\n layout=\"wizard\"\n steps={planEnrollmentSteps}\n >\n <PlanEnrollmentWizard />\n </AppRoute>\n <AppRoute\n title=\"Update Plan Enrollment Wizard\"\n path=\"/update-plan-enrollment/:employeeNumber/:planYearId/:planCode/:stepSlug\"\n layout=\"wizard\"\n exact\n steps={updateEnrollmentSteps}\n >\n <UpdatePlanEnrollmentWizard />\n </AppRoute>\n <AppRoute\n title=\"Update Plan Enrollment Wizard\"\n path=\"/update-plan-enrollment/:employeeNumber/:planYearId/:planCode/:customPlanId/:stepSlug\"\n layout=\"wizard\"\n exact\n steps={updateEnrollmentSteps}\n >\n <UpdatePlanEnrollmentWizard />\n </AppRoute>\n <AppRoute\n title=\"Pending COBRA Qualifying Event Notices\"\n path=\"/pending-qe-notices\"\n layout=\"default\"\n >\n <CobraPendingQENotices />\n </AppRoute>\n <AppRoute\n title=\"Pending COBRA Initial Notices\"\n path=\"/pending-initial-notices\"\n layout=\"default\"\n >\n <CobraPendingInitialNotices />\n </AppRoute>\n <AppRoute\n title=\"ManageSettings\"\n path=\"/manage-settings\"\n layout=\"default\"\n >\n <ManageSettings />\n </AppRoute>\n <AppRoute\n title=\"Add User\"\n path=\"/add-user/:stepSlug\"\n layout=\"wizard\"\n >\n <AddUser />\n </AppRoute>\n <AppRoute\n title=\"Edit User\"\n path=\"/edit-user/:stepSlug\"\n layout=\"wizard\"\n >\n <AddUser />\n </AppRoute>\n <AppRoute\n title=\"Add New Participant\"\n path=\"/add-participant\"\n layout=\"wizard\"\n >\n <AddParticipant />\n </AppRoute>\n <AppRoute\n title=\"Terminate Participant\"\n path=\"/terminate-participant\"\n layout=\"default\"\n >\n <TerminateParticipant />\n </AppRoute>\n <AppRoute\n title=\"Reports\"\n path=\"/reports/:tab?\"\n layout=\"default\"\n >\n <Reports />\n </AppRoute>\n <AppRoute\n title=\"Open Enrollment\"\n path=\"/open-enrollment\"\n layout=\"default\"\n >\n <OpenEnrollment />\n </AppRoute>\n <AppRoute\n title=\"Start Retiree/LOA Billing\"\n path=\"/direct-bill-event/:stepSlug\"\n layout=\"wizard\"\n >\n <DirectBillingWizard />\n </AppRoute>\n <AppRoute\n title=\"Open Enrollment Resources\"\n path=\"/open-enrollment-resources\"\n layout=\"default\"\n >\n <OpenEnrollmentResources />\n </AppRoute>\n <AppRoute\n layout=\"default\"\n title=\"Re-Enrollment Checklist\"\n path=\"/reenrollment-checklist\"\n exact\n >\n <ReEnrollmentChecklist />\n </AppRoute>\n <AppRoute\n title=\"Cobra Open Enrollment Packets\"\n path=\"/reenrollment-checklist/cobra/:planYearId/:tab\"\n layout=\"wizard\"\n >\n <CobraReEnrollmentChecklist />\n </AppRoute>\n <AppRoute\n title=\"Cobra Enrollment\"\n path=\"/reenrollment-checklist/cobra-plan/:planYearId/:tab\"\n layout=\"wizard\"\n >\n <CobraPlanReEnrollmentChecklist />\n </AppRoute>\n <AppRoute\n title=\"Direct Billing Enrollment\"\n path=\"/reenrollment-checklist/direct-bill/:planYearId/:tab\"\n layout=\"wizard\"\n >\n <DirectBillReEnrollmentChecklist />\n </AppRoute>\n <AppRoute\n title=\"HSA Checklist\"\n path=\"/reenrollment-checklist/:planType/:planYearId\"\n layout=\"wizard\"\n >\n <LegacyChecklists />\n </AppRoute>\n <AppRoute\n title=\"Rates History\"\n path=\"/rates-history\"\n layout=\"default\"\n >\n <RatesHistory />\n </AppRoute>\n <AppRoute\n title=\"HSA Contributions Not Forwarded\"\n path=\"/action-items/hsa-not-forwarded\"\n layout=\"default\"\n >\n <ContributionsNotForwarded />\n </AppRoute>\n <AppRoute\n title=\"Leave Records\"\n path=\"/leave-records\"\n layout=\"default\"\n exact\n >\n <ParticipantLeaveRecords />\n </AppRoute>\n <AppRoute\n title=\"\"\n path=\"/leave-records/all-cases/:eeId\"\n layout=\"default\"\n >\n <LeaveRecordsByEmployee />\n </AppRoute>\n <AppRoute\n title=\"\"\n path=\"/leave-records/:eeId/case/:caseId/:tab\"\n layout=\"default\"\n >\n <LeaveRecordDetails />\n </AppRoute>\n <AppRoute\n title=\"Report an Absence\"\n path=\"/report-an-absence/:stepSlug\"\n layout=\"wizard\"\n >\n <ReportAnAbsence />\n </AppRoute>\n <AppRoute\n title=\"Absence Report\"\n path=\"/leave-records/:eeId/absence-report\"\n layout=\"default\"\n >\n <AbsenceReport />\n </AppRoute>\n <AppRoute\n path=\"*\"\n title=\"Not Found\"\n layout=\"default\"\n >\n <NotFoundPage />\n </AppRoute>\n </Switch>\n );\n}\n\nexport default App;\n","import React, { ReactNode } from 'react';\nimport {\n createTheme,\n responsiveFontSizes,\n ThemeProvider,\n StyledEngineProvider,\n} from '@mui/material/styles';\n\ninterface MuiThemeProps {\n children?: ReactNode;\n}\n\nfunction MuiTheme({ children }: MuiThemeProps): React.ReactElement {\n const theme = responsiveFontSizes(createTheme({\n palette: {\n primary: {\n light: '#5AAAF7',\n main: '#007BC4',\n dark: '#005093',\n },\n secondary: {\n light: '#FFD149',\n main: '#FFA000',\n dark: '#FFA000',\n },\n text: {\n primary: 'rgba(0,0,0, 0.87)',\n secondary: 'rgba(0,0,0, 0.6)',\n disabled: 'rgba(0,0,0, 0.38)',\n },\n },\n typography: {\n fontSize: 16,\n },\n breakpoints: {\n keys: [ 'xs', 'sm', 'md', 'lg', 'xl' ],\n values: {\n xs: 0,\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n },\n },\n components: {\n MuiButton: {\n styleOverrides: {\n root: {\n borderColor: '#212121',\n color: '#666',\n },\n containedPrimary: {\n color: '#f3f3f3',\n },\n containedSecondary: { // pretty much only going to be used for the marketing slides\n backgroundColor: '#f3f3f3',\n color: '#3f3f3f',\n },\n },\n },\n },\n }));\n\n return (\n <StyledEngineProvider injectFirst>\n <ThemeProvider theme={theme}>{children}</ThemeProvider>\n </StyledEngineProvider>\n );\n}\n\nexport default MuiTheme;\n","import { Response } from 'miragejs';\n\nfunction routing(server) {\n server.get('/companies', (schema) => {\n const { models } = schema.companies.all();\n const data = models.map((m) => m.attrs);\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:id', (schema, request) => {\n const { attrs: data } = schema.companies.findBy({ compid: parseInt(request.params.id) });\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:id/non-plan-year-services', (schema, request) => {\n const { attrs: data } = schema.nonPlanYearServices.findBy({ compid: parseInt(request.params.id) });\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:id/locations', (schema, request) => {\n const { models: data } = schema.locations.where({ compid: parseInt(request.params.id) });\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:id/payfreqs', (schema) => {\n const { models: data } = schema.payfreqs.all();\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:companyId/deduction-dates', (schema) => {\n const { models: data } = schema.deductionDates.all();\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.post('/companies/:companyId/client-log', (schema) => {\n return new Response(204, { 'content-length': 0 });\n });\n}\n\nexport default routing;\n","import { Response } from 'miragejs';\n\nexport function noContentResponse() {\n return new Response(204, { 'content-length': 0 });\n}\n\nexport function createdResponse() {\n return new Response(201, { 'content-length': 0 }, {});\n}\n\nexport function okResponse(data) {\n return () => {\n return new Response(200, { 'content-length': JSON.stringify(data).length }, { data })\n };\n}\n","import { okResponse } from './utils';\nimport { Response } from 'miragejs';\n\nfunction routing(server) {\n server.get('/companies/:companyId/users', (schema) => {\n const { models } = schema.summaryUsers.all();\n const data = models.map((m) => m.attrs);\n return okResponse(data)();\n });\n \n server.get('/companies/:companyId/users/get-user-permissions', (schema) => {\n return okResponse(localStorage.get('FloresAdminJWT'))();\n });\n \n server.get('/companies/:companyId/users/:conid', (schema) => {\n const { models } = schema.contactUsers.all();\n const data = models[0];\n return okResponse(data)();\n });\n\n server.get('/users/:conuserid/companies', (schema, request) => {\n const { models: data } = schema.companies.where({ conuserid: request.params.conuserid }) ?? [];\n return okResponse(data)();\n });\n\n server.get('/companies/:compid/users/:conuserid/get-contact-info', (schema) => {\n const { attrs: data } = schema.contactInfos.first() ?? [];\n return okResponse(data)();\n });\n\n server.put(`/companies/:id}/set-contact-info`, (schema) => {\n const { models: data } = schema.contactInfos.first() ?? [];\n return okResponse(data)();\n });\n\n server.post('/companies/:companyId/users', () => {\n return new Response(201, { 'content-length': 0 }, {});\n });\n\n server.get('/companies/:companyId/users/get-user-permissions', () => {\n const data = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJDb251c2VySUQiOiIzNzA5IiwiQXV0aGVudGljYXRpb25TdGF0ZSI6IkZ1bGwiLCJVc2VyUGVybWlzc2lvbnMiOiJbe1wicHJtaWRcIjoxMTAsXCJsZXZlbFwiOjIsXCJkZXNjcmlwdGlvblwiOlwiVXNlcnNcIn0se1wicHJtaWRcIjoxMjAsXCJsZXZlbFwiOjIsXCJkZXNjcmlwdGlvblwiOlwiRGlyZWN0IERlYml0c1wifV0iLCJleHAiOjE2MzM0OTc0MjMsImlzcyI6IkFkbWluQXBpLVFBIiwiYXVkIjoiQWRtaW5TaXRlLVFBIn0.OYAlE1eVSfB3snLhDjVgmvEEnoAf4L5amKvb8NHFab8';\n return new Response(201, { 'content-length': data.length }, { data });\n });\n}\n\nexport default routing;\n","import { Response } from 'miragejs';\n\nfunction routing(server) {\n server.get('/companies/:companyId/plan-years', (schema) => {\n const { models } = schema.planYears.all();\n const data = models.map((m) => m.attrs);\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:companyId/plan-years/:planYearId', (schema, request) => {\n const { models: data } = schema.planYears.where({ pyrid: parseInt(request.params.planYearId) }) ?? [];\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:companyId/plan-years/:planYearId/services', (schema, request) => {\n const { models: data } = schema.services.where({ pyrid: parseInt(request.params.planYearId) }) ?? [];\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n}\n\nexport default routing;\n","import { Response } from 'miragejs';\nimport balanceReportCounts from '../fixtures/balance-report-counts.json';\nimport { noContentResponse, okResponse } from './utils.js';\n\nfunction getBalanceCounts(schema) {\n const data = schema.balanceReportCounts.new(balanceReportCounts).attrs;\n return new Response(200, { 'content-length': 1 }, data);\n}\n\nfunction routing(server) {\n const summary = {\n activeParticipants: 4,\n noticesMailed: 12,\n paymentsProcessed: 50,\n };\n\n server.get('/companies/:companyId/reports/cobra-summary', okResponse(summary));\n\n server.get('/companies/:companyId/reports/retiree-summary', okResponse(summary));\n\n server.get('/companies/:companyId/reports/loa-summary', okResponse(summary));\n\n server.get('/companies/:companyId/reports/pending-notices/count/qe', okResponse(6));\n\n server.get('/companies/:companyId/reports/pending-notices/count/initial', okResponse(1));\n\n server.get('/companies/:companyId/reports/plan-years/:planYearId/service-summaries', (schema, request) => {\n const { models: data } = schema.planYearServiceSummaries\n .where({ pyrid: parseInt(request.params.planYearId) }) ?? [];\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:companyId/reports/plan-years/:planYearId/enrollments/:planCodeId/:isCustom', (schema, request) => {\n const enrollment = parseInt(request.queryParams.startDate.replace(/-/g, '')) % 150;\n return new Response(200, { 'content-length': 1 }, { data: enrollment });\n });\n\n server.get('/companies/:companyId/reports/plan-years/:planYearId/enrollments/:planCodeId/:isCustom/export', noContentResponse);\n\n server.get('/companies/:companyId/reports/report-types', (schema, request) => {\n const { models } = schema.reportTypes.all();\n const data = models.map((d) => d.attrs.type);\n if (request.params.companyId !== '4075') {\n data.splice(3);\n }\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get(\n '/companies/:companyId/reports/plan-years/:planYearId/reduction-list-total/:planCodeId',\n okResponse(1755.97),\n );\n\n server.get(\n '/companies/:companyId/reports/plan-years/:planYearId/reduction-list/:planCodeId/export',\n noContentResponse,\n );\n\n server.get(\n '/companies/:companyId/reports/balance-account-counts/:planYearId/:plcid',\n getBalanceCounts,\n );\n\n server.get(\n '/companies/:companyId/reports/balance-account-custom-counts/:planYearId/:plcid/:subPlanId',\n getBalanceCounts,\n );\n\n server.get('/companies/:companyId/reports/contributions-not-forwarded', okResponse(36));\n\n server.get('/companies/:companyId/reports/contributions-not-forwarded/export', noContentResponse);\n\n server.get('/companies/:companyId/reports/debit-card-warnings/:planYearId', okResponse(342));\n\n server.get('/companies/:companyId/reports/debit-card-warnings/:planYearId/export', noContentResponse);\n\n server.get('/companies/:companyId/reports/unsubstantiated-debit-card/:planYearId', okResponse(245));\n\n server.get('/companies/:companyId/reports/unsubstantiated-debit-card/:planYearId/export', noContentResponse);\n\n server.get('/companies/:companyId/reports/active-participants/cobra', okResponse(10));\n\n server.get('/companies/:companyId/reports/active-participants/cobra/export', noContentResponse);\n\n server.get('/companies/:companyId/reports/pending-notices/count/:type', okResponse(35));\n\n server.get('/companies/:companyId/reports/pending-notices/export/:type', noContentResponse);\n\n server.get('/companies/:companyId/reports/current-active/:type/export', noContentResponse);\n}\n\nexport default routing;\n","import { Response } from 'miragejs';\n\nfunction routing(server) {\n server.get('/companies/:companyId/reports/pending-notices/qe', (schema) => {\n const { models } = schema.qeNotices.all();\n const data = models.map((m) => m.attrs);\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.delete('/companies/:companyId/cobra-qe/:employeeNumber/:cQualId', (schema, request) => {\n const { attrs: data } = schema.qeNotices.findBy({ qualid: request.params.cQualId });\n if (data) {\n return new Response(204, { 'content-length': 0 });\n }\n\n return new Response(404, { 'content-length': 0 });\n });\n}\n\nexport default routing;\n","import { Response } from 'miragejs';\n\nfunction routing(server) {\n server.get('/companies/:companyId/reports/pending-notices/initial', (schema) => {\n const { models } = schema.initNotices.all();\n const data = models.map((m) => m.attrs);\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.delete('/companies/:companyId/initial-notices/:employeeNumber/:cInitId', (schema, request) => {\n const { attrs: data } = schema.initNotices.findBy({ c_initid: request.params.cInitId });\n if (data) {\n return new Response(204, { 'content-length': 0 });\n }\n\n return new Response(404, { 'content-length': 0 });\n });\n\n server.post('/companies/:companyId/initial-notices', () => {\n return new Response(204, { 'content-length': 0 });\n });\n}\n\nexport default routing;\n","import { Response } from 'miragejs';\n\nfunction routing(server) {\n server.get('/companies/:companyId/filehistory', (schema) => {\n const { models: data } = schema.fhMonthYears.all();\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:companyId/filehistory/:year/:month', (schema, request) => {\n const { models: data } = schema.fhWebFiles.where({\n year: parseInt(request.params.year),\n month: parseInt(request.params.month) }) ?? [];\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n \n server.get('/companies/:companyId/filehistory/download/:fileid/:filename', (schema, request) => {\n const { models: data } = schema.fhWebFiles.where({\n fileid: request.params.fileid,\n filename: request.params.filename }) ?? [];\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n}\n\nexport default routing;","import { Response } from 'miragejs';\n\nfunction routing(server) {\n server.get('/companies/:companyId/reporthistory/get-available-dates', (schema) => {\n const { models: data } = schema.reportHistoryMonthYears.all();\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:companyId/reporthistory/:year/:month/get-report-history-by-month-year', (schema, request) => {\n const { models: data } = schema.reportHistoryClientFiles.where({\n year: parseInt(request.params.year),\n month: parseInt(request.params.month) }) ?? [];\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n \n server.get('/companies/:companyId/reporthistory/download/:fileid/:filename', (schema, request) => {\n const { models: data } = schema.reportHistoryClientFiles.where({\n fileid: request.params.fileid,\n filename: request.params.filename }) ?? [];\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n}\n\nexport default routing;","import { Response } from 'miragejs';\n\nfunction routing(server) {\n server.get('/marketing-slides', (schema) => {\n const { models } = schema.marketingSlides.all();\n const data = models.map((m) => m.attrs);\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n}\n\nexport default routing;","import { Response } from 'miragejs';\n\nfunction routing(server) {\n server.get('/file-upload/file-types', (schema) => {\n const { models } = schema.fileTypes.all();\n const data = models.map((m) => m.attrs);\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.post('/file-upload/upload-files/:fileSection/:medplancd', () => {\n return new Response(200, { 'content-length': 1 }, { data: true, message: \"File uploaded successfully\" });\n });\n}\n\nexport default routing;\n","import { Response } from 'miragejs';\n\nfunction routing(server) {\n server.get('/companies/:companyId/participants', (schema, request) => {\n const search = request.queryParams.searchText.toLowerCase() ?? '';\n const { models } = schema.participants.where((p) => {\n return (p.lname.toLowerCase().includes(search) || p.fname.toLowerCase().includes(search) ||\n p.payrollid.includes(search) || p.empno.includes(search));\n });\n\n const data = models\n .map((m) => m.attrs)\n .slice(0, 10);\n data.sort((a, b) => {\n if (a.lname !== b.lname) {\n return a.lname.localeCompare(b.lname);\n }\n return a.fname.localeCompare(b.fname);\n });\n\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:companyId/participant/:payrollId', (schema, request) => {\n const result = schema.participants.findBy({ payrollid: request.params.payrollId });\n if (result) {\n const { attrs: spouse } = schema.dependents.findBy({relation: \"S\"}) ?? { attrs: undefined };\n const { attrs: data } = result;\n data.dependents = [spouse];\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n } else {\n return new Response(404, { 'content-length': 0 });\n }\n });\n\n server.get('/companies/:companyId/participant/:empno/dependents', (schema, request) => {\n const { models: data } = schema.dependents.where({ empno: request.params.empno }) ?? [];\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.post('/companies/:companyId/participant/', (schema, request) => {\n if (!request.requestBody) {\n return new Response(400, {'content-length': 0 });\n }\n\n const attrs = JSON.parse(request.requestBody);\n const participant = schema.participants.new(attrs);\n participant.empno = participant.payrollid;\n participant.save();\n const data = participant.attrs;\n const length = JSON.stringify(data).length;\n\n return new Response(201, { 'content-length': length }, { data });\n });\n\n server.put('/companies/:companyId/participant/:empno', (schema, request) => {\n if (!request.requestBody) {\n return new Response(400, {'content-length': 0 });\n }\n\n const result = schema.participants.findBy({ empno: request.params.empno });\n if (result) {\n const attrs = JSON.parse(request.requestBody);\n result.update(attrs);\n return new Response(204, { 'content-length': 0 });\n } else {\n return new Response(404, { 'content-length': 0 });\n }\n });\n\n server.post('/companies/:companyId/participant/:empno/dependents', () => {\n return new Response(201, { 'content-length': 0 }, {});\n });\n\n server.delete('/companies/:companyId/participants', () => {\n return new Response(201, { 'content-length': 0 }, {});\n });\n}\n\nexport default routing;\n","import { Response } from 'miragejs';\n\nfunction routing(server) {\n server.get('/companies/:companyId/cobra-qe/cobra-event-types', (schema) => {\n const { models } = schema.cobraQeTypes.all();\n const data = models.map((m) => m.attrs);\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:companyId/cobra-qe/cobra-plans', (schema) => {\n const { models } = schema.cobraPlans.all();\n const data = models.map((m) => Object.values(m.attrs));\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:companyId/qualifying-events/:type/print/:unqid', () => {\n return new Response(201, { 'content-length': 0 }, {});\n });\n\n server.post('/companies/:companyId/cobra-qe', () => {\n return new Response(201, { 'content-length': 0 }, {});\n })\n\n server.get('/companies/:companyId/cobra-qe/:employeeNumber/:unqid', (schema, request) => {\n function mapToArray(planObject) {\n return Object.keys(planObject.attrs).map((key) => planObject.attrs[key]);\n }\n\n const { models: dependents } = schema.dependents.where({ empno: request.params.employeeNumber });\n const { models: plans } = schema.cobraPlans.all();\n const plan = plans[0].attrs[3];\n const { attrs: participant } = schema.participants.findBy({ empno: request.params.employeeNumber });\n participant.dependents = dependents;\n\n const data = {\n c_qualid: 1,\n participant,\n eventDate: '2020-04-01',\n eventType: 1,\n coverageBegins: '2020-04-01',\n benefits: [{\n ...plan,\n coveredDependents: [ dependents[0] ],\n }],\n details: {\n statusCode: 2,\n statusMessage: 'Accepted Coverage',\n letterSent: '',\n postmark: '',\n coverageTermSent: '2014-01-07',\n letterDoc: 27148381,\n responseDoc: 27148381,\n coverageEnds: '2020-12-31',\n },\n availablePlans: plans.map(mapToArray)\n };\n const length = JSON.stringify(data).length;\n\n return new Response(200, { 'content-length': length }, { data });\n })\n}\n\nexport default routing;\n","import { Response } from 'miragejs';\nimport { pipe, path, map, objOf } from 'ramda';\nimport { noContentResponse, createdResponse, okResponse } from './utils.js';\n\nfunction getNonPlanYearEnrollments(schema) {\n const { models: data } = schema.cobraEnrollments.all() ?? [];\n return okResponse(data)();\n}\n\nfunction getCobraEnrollments(schema) {\n const { models } = schema.cobraEnrollments.all() ?? [];\n const data = models.map((d, i) => ({ ...d.attrs, cQualId: i + 1 }));\n return okResponse(data)();\n}\n\nfunction routing(server) {\n server.get('/companies/:companyId/open-plans', (schema, request) => {\n const pyrid = parseInt(request.queryParams.pyrid ?? '0');\n const { models } = schema.openPlans.all();\n const data = models\n .map((m) => m.attrs)\n .filter((model) => pyrid === 0 ? true : model.pyrid === pyrid);\n return okResponse(data)();\n });\n\n server.get('/companies/:companyId/open-plans/custom', (schema, request) => {\n const pyrid = parseInt(request.queryParams.pyrid ?? '0');\n const { models } = schema.openPlans.all();\n const data = models\n .map((m) => m.attrs)\n .slice(-2)\n .filter((model) => pyrid === 0 ? true : model.pyrid === pyrid);\n return okResponse(data)();\n });\n\n server.get('/companies/:companyId/pay-dates/:payFreqId', (schema) => {\n const { models } = schema.payDates.all();\n const data = models.map((m) => m.attrs.payDate);\n return okResponse(data)();\n });\n\n server.post('/companies/:companyId/plan-enrollment', createdResponse);\n\n server.put('/companies/:companyId/plan-enrollment', () => {\n return new Response(200, { 'content-length': 0 }, {});\n });\n\n server.post('/companies/:companyId/plan-enrollment/custom-enrollment', createdResponse);\n\n server.get('/companies/:companyId/plan-enrollment/get-cobra-enrollments/:empno', getCobraEnrollments);\n\n server.get('/companies/:companyId/plan-enrollment/get-retiree-enrollments/:empno', getNonPlanYearEnrollments);\n\n server.get('/companies/:companyId/plan-enrollment/get-loa-enrollments/:empno', getNonPlanYearEnrollments);\n\n server.get('/companies/:companyId/plan-enrollment/enrollments/:empno', (schema, request) => {\n const dependents = pipe(\n objOf('empno'),\n schema.dependents.where,\n path(['models']),\n map((d) => d.attrs),\n )(request.params.empno);\n\n const data = pipe(\n path(['models']),\n map((m) => {\n if (m.attrs.planCode === '0') {\n return { ...m.attrs, dependents };\n }\n return m.attrs;\n })\n )(schema.enrolledPlans.all());\n\n const length = JSON.stringify(data).length;\n\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:companyId/plan-enrollment/:pyrid/transactions/:empno/plan/:plccode', (schema) => {\n const { models: data } = schema.enrollmentTransactions.all() ?? [];\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get(\n '/companies/:compid/plan-enrollment/transactions/custom/:empno/plan/:customPlanId/type/pending',\n (schema) => {\n const { models: data } = schema.customPendingTransactions.all() ?? [];\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get(\n '/companies/:compid/plan-enrollment/transactions/custom/:empno/plan/:customPlanId/type/paid',\n (schema) => {\n const { models: data } = schema.customPaidTransactions.all() ?? [];\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:companyId/plan-enrollment/regular/:employeeNumber/:planYearId/:planCode', (schema) => {\n const { models: plans } = schema.openPlans.all();\n const planDetails = {\n lfsa: false,\n type: 'MRA',\n partStart: '2020-03-15', // begin date\n partEnd: '2020-12-31', // end date\n partAnn: 5000, // annual allocation\n firstPayDateOfChange: '2021-03-31',\n payPeriodDeduction: 500,\n };\n return new Response(200, { 'content-length': 1 }, { data: { plan: plans[0], planDetails } });\n });\n\n server.get('/companies/:companyId/plan-enrollment/custom/:employeeNumber/:planYearId/:customPlanId', (schema) => {\n const { models: plans } = schema.openPlans.all();\n const planDetails = {\n lfsa: false,\n isBalance: true,\n type: 'CUSTOM',\n partStart: '2020-03-15', // begin date\n partEnd: '2020-12-31', // end date\n currentContributions: 5000, // annual allocation\n coveredDependents: [],\n };\n return new Response(200, { 'content-length': 1 }, { data: { plan: plans[6], planDetails } });\n });\n\n server.delete(\n '/companies/:companyId/plan-enrollment/:planYearId/:planCode/participant/:employeeNumber',\n noContentResponse,\n );\n\n}\n\nexport default routing;\n","import { Response } from 'miragejs';\n\nfunction routing(server) {\n server.get('/companies/:companyId/qualifying-events/:type/print/:unqid', () => {\n return new Response(201, { 'content-length': 0 }, {});\n });\n\n server.get('/companies/:companyId/qualifying-events/:type/invoices/:employeeNumber', (schema) => {\n const { models } = schema.invoices.all();\n const data = models.map((m) => m.attrs);\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:companyId/qualifying-events/:type/checks/:employeeNumber', (schema) => {\n const { models } = schema.checks.all();\n const data = models.map((m) => m.attrs);\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:companyId/qualifying-events/:type/documents/:employeeNumber', (schema) => {\n const { models } = schema.documents.all();\n const data = models.map((m) => m.attrs);\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:companyId/qualifying-events/:type/document/:documentNumber', () => {\n return new Response(200, { 'content-length': 0 }, {});\n });\n}\n\nexport default routing;\n","import { Response } from 'miragejs';\n\nfunction routing(server) {\n server.get('/companies/:companyId/reports/pending-responses/:type', (schema, request) => {\n return new Response(200, { 'content-length': 1 }, { data: 20 });\n });\n\n server.get('/companies/:companyId/reports/pending-responses/:type/export', (schema, request) => {\n return new Response(204, { 'content-length': 0 });\n });\n}\n\nexport default routing;\n","import { Response } from 'miragejs';\n\nimport cobraDateRangeCounts from '../fixtures/cobra-date-range-counts.json';\n\nfunction routing(server) {\n server.get('/companies/:companyId/reports/date-range/cobra', (schema) => {\n const data = cobraDateRangeCounts;\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n}\n\nexport default routing;\n","import { okResponse } from './utils.js';\nimport participants from '../fixtures/participants.json';\nimport eventTypes from '../fixtures/direct-bill-event-types.json';\nimport benefits from '../fixtures/direct-bill-plans.json';\nimport dependents from '../fixtures/dependents.json';\n\nfunction routing(server) {\n server.get('/companies/:companyId/direct-bill/event-types', (schema) => {\n const { models } = schema.directBillEventTypes.all();\n const data = models.map((m) => m.attrs);\n return okResponse(data)();\n });\n\n server.get('/companies/:companyId/direct-bill/plans', (schema) => {\n const { models } = schema.directBillPlans.all();\n const data = models.map((m) => m.attrs);\n return okResponse(data)();\n });\n\n server.get('/companies/:companyId/direct-billing-events/:rQualId/employees/:employeeNumber', () => {\n const data = {\n r_qualid: 1,\n participant: participants[1],\n eventInfo: {\n eventDate: '2021-01-01',\n eventType: eventTypes[0].r_qualevid,\n coverageBegins: '2021-01-02',\n paidThrough: '2022-01-02',\n },\n dependents: {\n initial: [dependents[0]],\n added: [],\n },\n benefits: benefits.map((b) => ({ ...b, selectedPlan: b.plans[0], coveredDependents: [dependents[0]] })),\n details: {\n statusCode: 2,\n statusMessage: 'Accepted Coverage',\n letterSent: '',\n postmark: '',\n coverageTermSent: '2014-01-07',\n letterDoc: 27148381,\n responseDoc: 27148381,\n coverageEnds: '2020-12-31',\n },\n };\n\n return okResponse(data)();\n });\n}\n\nexport default routing;\n","import { Response } from 'miragejs';\n\nfunction routing(server) {\n server.get('/companies/:companyId/administrative-billing', (schema) => {\n const { models } = schema.adminInvoices.all();\n const data = models.map((m) => m.attrs);\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:companyId/administrative-billing', (schema) => {\n const { models } = schema.adminInvoices.all();\n const data = models.map((m) => m.attrs);\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:companyId/direct-debit-accounts', (schema) => {\n const { models } = schema.directDebitAccounts.all();\n const data = models.map((m) => m.attrs);\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:companyId/direct-debit-accounts', (schema) => {\n const { models } = schema.directDebitAccounts.all();\n const data = models.map((m) => m.attrs);\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.post('/companies/:companyId/administrative-billing/pay-admin-invoice', () => {\n return new Response(201, { 'content-length': 0 }, {});\n })\n}\n\nexport default routing;\n","import { Response } from 'miragejs';\n\nfunction routing(server) {\n server.post('/two-factor-authentication', () => {\n return new Response(200, { 'content-length': 12 }, 'token_string');\n });\n\n server.get('/users/multi-factor-setting', () => {\n return new Response(200, { 'content-length': 15 }, { requiremfa: 'Y' });\n })\n\n server.post('/two-factor-authentication/resend-passcode', () => {\n return new Response(200, { 'content-length': 0 }, null);\n });\n}\n\n\nexport default routing;\n","import { Response } from 'miragejs';\n\nimport forms from '../fixtures/document-library-forms.json';\nimport eduDocs from '../fixtures/education-documents.json';\nimport legal from '../fixtures/document-library-legal.json';\n\nfunction routing(server) {\n server.get('/companies/:companyId/document-library/forms', (schema) => {\n const data = forms;\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:companyId/document-library/education', (schema) => {\n const data = eduDocs;\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.get('/companies/:companyId/document-library/legal-docs', (schema) => {\n const data = legal;\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n}\n\nexport default routing;\n","import { Response } from 'miragejs';\n\nfunction routing(server) {\n server.get('/companies/:companyId/direct-debit', (schema) => {\n const { models } = schema.debits.all();\n const data = models.map((m) => m.attrs);\n const length = JSON.stringify(data).length;\n return new Response(200, { 'content-length': length }, { data });\n });\n\n server.post('/companies/:companyId/direct-debit', () => {\n return new Response(204, { 'content-length': 0 }, {});\n })\n}\n\nexport default routing;\n","import {okResponse} from \"./utils\";\n\nfunction routing(server) {\n server.get('/responsibilities', (schema) => {\n const { models } = schema.responsibilities.all();\n const data = models.map((m) => m.attrs);\n return okResponse(data)();\n });\n}\n\nexport default routing;\n","import { okResponse } from \"./utils\";\n\nfunction routing(server) {\n server.get('/permissions', (schema) => {\n const { models } = schema.permissions.all();\n const data = models.map((m) => m.attrs);\n return okResponse(data)();\n });\n}\n\nexport default routing;\n","import { okResponse } from \"./utils\";\n\nfunction routing(server) {\n server.get('/companies/:companyId/enrollment-resources/fsa/template-exists', okResponse(true));\n\n server.get('/companies/:companyId/enrollment-resources/fsa/download-template', okResponse(true));\n\n server.get(\n '/companies/:companyId/enrollment-resources/custom/:planYearId/:planId/:subPlanId/download-checklist',\n okResponse(true),\n );\n\n server.get('/companies/:companyId/enrollment-resources/plans', (schema) => {\n const { models: data } = schema.enrollmentResourcePlans.all();\n return okResponse(data)();\n });\n}\n\nexport default routing;\n","import { okResponse } from \"./utils\";\n\nfunction routing(server) {\n server.get('/api/companies/:companyId/reenrollment-checklist/plan-years', (schema) => {\n const { models: data } = schema.reEnrollmentPlans.all();\n return okResponse(data)();\n });\n}\n\nexport default routing;\n","import { Server, Model, hasMany } from 'miragejs';\n\n// import seed data (fixtures) and routes here\nimport companies from './fixtures/companies';\nimport users from './fixtures/users';\nimport planYears from './fixtures/plan-years';\nimport services from './fixtures/services';\nimport qeNotices from './fixtures/qe-notices';\nimport initNotices from './fixtures/init-notices';\nimport planYearServiceSummaries from './fixtures/plan-year-service-summaries.json';\nimport marketingSlides from './fixtures/marketing-slides';\nimport contactInfos from './fixtures/contact-info';\nimport fileTypes from './fixtures/filetypes.json';\nimport nonPlanYearServices from './fixtures/non-plan-year-services';\nimport participants from './fixtures/participants.json';\nimport fhMonthYears from './fixtures/file-history-month-year';\nimport fhWebFiles from './fixtures/file-history-webfiles';\nimport reportHistoryClientFiles from './fixtures/report-history-clientfiles';\nimport reportHistoryMonthYears from './fixtures/report-history-month-year';\nimport locations from './fixtures/locations';\nimport dependents from './fixtures/dependents';\nimport cobraQeTypes from './fixtures/cobra-qe-types.json';\nimport cobraPlans from './fixtures/cobra-qe-plans.json';\nimport payfreqs from './fixtures/payfreqs.json';\nimport openPlans from './fixtures/open-plans.json';\nimport payDates from './fixtures/pay-dates.json';\nimport cobraEnrollments from './fixtures/cobra-enrollment.json';\nimport enrolledPlans from './fixtures/enrolled-plans.json';\nimport enrollmentTransactions from './fixtures/enrollment-transactions.json';\nimport customPendingTransactions from './fixtures/custom-transactions-pending.json';\nimport customPaidTransactions from './fixtures/custom-transactions-paid.json';\nimport invoices from './fixtures/invoices.json';\nimport documents from './fixtures/documents.json';\nimport checks from './fixtures/checks.json';\nimport reportTypes from './fixtures/report-types.json';\nimport balanceReportCounts from './fixtures/balance-report-counts.json';\nimport deductionDates from './fixtures/deduction-dates.json';\nimport cobraDateRangeCounts from './fixtures/cobra-date-range-counts.json';\nimport directBillEventTypes from './fixtures/direct-bill-event-types.json';\nimport directBillPlans from './fixtures/direct-bill-plans.json';\nimport adminInvoices from './fixtures/admin-invoices.json';\nimport directDebitAccounts from './fixtures/direct-debit-accounts.json';\nimport debits from './fixtures/direct-debits.json';\nimport documentLibraryForms from './fixtures/document-library-forms.json';\nimport educationDocuments from './fixtures/education-documents.json';\nimport responsibilities from './fixtures/responsibilities.json';\nimport permissions from './fixtures/permissions.json';\nimport summaryUsers from './fixtures/summary-users.json';\nimport contactUsers from './fixtures/contact-users.json';\nimport enrollmentResourcePlans from './fixtures/enrollment-resource-plans.json';\nimport reEnrollmentPlans from './fixtures/re-enrollment-plans.json';\n\nimport companyRoutes from './routes/companies';\nimport userRoutes from './routes/users';\nimport planYearRoutes from './routes/plan-years';\nimport reportRoutes from './routes/reports';\nimport qeNoticeRoutes from './routes/qe-notices';\nimport initNoticeRoutes from './routes/init-notices';\nimport fileHistoryRoutes from './routes/file-history';\nimport reportHistoryRoutes from './routes/report-history';\nimport marketingSlideRoutes from './routes/marketing-slides';\nimport fileUploadRoutes from './routes/fileupload';\nimport participantRoutes from './routes/participants';\nimport cobraQeRoutes from './routes/cobra-qe';\nimport planEnrollmentRoutes from './routes/plan-enrollment';\nimport qualifyingEventRoutes from './routes/qualifying-events';\nimport pendingResponsesRoutes from './routes/pending-responses';\nimport cobraDateRangeRoutes from './routes/cobra-date-range';\nimport directBillRoutes from './routes/direct-bill';\nimport adminBillingRoutes from './routes/administrative-billing';\nimport multiFactorAuthenticationRoutes from './routes/multi-factor-authentication';\nimport documentLibraryRoutes from './routes/document-library';\nimport directDebitRoutes from './routes/direct-debit';\nimport responsibilitiesRoutes from './routes/responsibilities';\nimport permissionsRoutes from './routes/permissions';\nimport enrollmentResourcesRoutes from './routes/enrollment-resources';\nimport reEnrollmentPlansRoutes from './routes/re-enrollment';\n\nfunction makeServer({ environment = 'test' } = {}) {\n return new Server({\n environment,\n urlPrefix: `http://${process.env.REACT_APP_API_HOST}`,\n namespace: 'api',\n\n // define available models and relationships here\n models: {\n company: Model,\n user: Model.extend({\n companies: hasMany(),\n }),\n planYear: Model,\n service: Model,\n report: Model,\n qeNotice: Model,\n initNotice: Model,\n planYearServiceSummary: Model,\n fhMonthYear: Model,\n fhWebFile: Model,\n marketingSlide: Model,\n contactInfo: Model,\n fileType: Model,\n nonPlanYearService: Model,\n participant: Model,\n reportHistoryClientFile: Model,\n reportHistoryMonthYear: Model,\n Location: Model,\n dependent: Model,\n cobraQeType: Model,\n cobraPlan: Model,\n payfreqs: Model,\n openPlan: Model,\n payDate: Model,\n cobraEnrollment: Model,\n enrolledPlan: Model,\n enrollmentTransactions: Model,\n customPaidTransactions: Model,\n customPendingTransactions: Model,\n invoice: Model,\n document: Model,\n check: Model,\n reportTypes: Model,\n balanceReportCounts: Model,\n deductionDates: Model,\n cobraDateRangeCounts: Model,\n directBillEventTypes: Model,\n directBillPlans: Model,\n adminInvoices: Model,\n directDebitAccounts: Model,\n debits: Model,\n documentLibraryForms: Model,\n educationDocuments: Model,\n summaryUsers: Model,\n contactUsers: Model,\n responsibilities: Model,\n permissions: Model,\n enrollmentResourcePlans: Model,\n reEnrollmentPlans: Model,\n },\n\n // declare seeds here\n fixtures: {\n companies,\n users,\n planYears,\n services,\n qeNotices,\n initNotices,\n planYearServiceSummaries,\n fhMonthYears,\n fhWebFiles,\n marketingSlides,\n contactInfos,\n fileTypes,\n nonPlanYearServices,\n participants,\n reportHistoryMonthYears,\n reportHistoryClientFiles,\n locations,\n dependents,\n cobraQeTypes,\n cobraPlans,\n payfreqs,\n openPlans,\n payDates,\n cobraEnrollments,\n enrolledPlans,\n enrollmentTransactions,\n customPaidTransactions,\n customPendingTransactions,\n invoices,\n documents,\n checks,\n reportTypes,\n balanceReportCounts,\n deductionDates,\n cobraDateRangeCounts,\n directBillEventTypes,\n directBillPlans,\n adminInvoices,\n directDebitAccounts,\n debits,\n documentLibraryForms,\n educationDocuments,\n summaryUsers,\n contactUsers,\n permissions,\n responsibilities,\n enrollmentResourcePlans,\n reEnrollmentPlans,\n },\n\n seeds(server) {\n // loads seed data\n server.loadFixtures();\n },\n\n routes() {\n this.passthrough(); // allow any unrecognized routes to go to the real server\n // this.timing = 3000; // uncomment this line to simulate a 3sec network delay\n // wire up routes here\n companyRoutes(this);\n userRoutes(this);\n planYearRoutes(this);\n reportRoutes(this);\n qeNoticeRoutes(this);\n initNoticeRoutes(this);\n fileHistoryRoutes(this);\n marketingSlideRoutes(this);\n fileUploadRoutes(this);\n participantRoutes(this);\n reportHistoryRoutes(this);\n cobraQeRoutes(this);\n planEnrollmentRoutes(this);\n qualifyingEventRoutes(this);\n pendingResponsesRoutes(this);\n cobraDateRangeRoutes(this);\n directBillRoutes(this);\n adminBillingRoutes(this);\n multiFactorAuthenticationRoutes(this);\n documentLibraryRoutes(this);\n directDebitRoutes(this);\n responsibilitiesRoutes(this);\n permissionsRoutes(this);\n enrollmentResourcesRoutes(this);\n reEnrollmentPlansRoutes(this);\n },\n });\n}\n\nexport default makeServer;\n","import React, { SyntheticEvent } from 'react';\nimport Snackbar, { SnackbarCloseReason } from '@mui/material/Snackbar';\nimport Alert from '@mui/material/Alert';\nimport Slide from '@mui/material/Slide';\n\nimport { useSelector, useDispatch } from 'react-redux';\nimport { selectSnacks, removeNotification } from './notifications.slice';\nimport { NOTIFICATION_TIMEOUT, Note } from './notification.types';\nimport store from 'store';\n\nfunction TransitionRight(props: any) {\n return <Slide {...props} direction=\"right\" />;\n}\n\nfunction SnackPanel(): React.ReactElement {\n const snacks = useSelector(selectSnacks);\n const dispatch = useDispatch<typeof store.dispatch>();\n\n function handleClose(snack: Note, reason?: SnackbarCloseReason) {\n if (reason === 'clickaway') {\n return;\n }\n\n dispatch(removeNotification(snack.key));\n }\n\n function inner(snack: Note): React.ReactElement {\n function closer(evt: SyntheticEvent, reason?: SnackbarCloseReason) {\n handleClose(snack, reason);\n }\n\n return (\n <Alert elevation={6} variant=\"filled\" severity={snack.type} onClose={closer}>\n {snack.message}\n </Alert>\n );\n }\n\n function snackDisplay(): React.ReactElement[] | React.ReactElement {\n if (!snacks.length) {\n return <></>;\n }\n\n /*\n NOTE: Snackbar will only show one at a time. I think that's probably ok.\n If it becomes an issue, we should take a look at [notistack](https://github.com/iamhosseindhv/notistack)\n */\n return snacks.map((snack) => {\n function closer(evt: SyntheticEvent, reason?: SnackbarCloseReason) {\n handleClose(snack, reason);\n }\n\n return (\n <Snackbar\n data-testid={`snackbar${snack.key}`}\n key={snack.key}\n anchorOrigin={ {\n vertical: 'bottom',\n horizontal: 'left',\n } }\n open\n autoHideDuration={NOTIFICATION_TIMEOUT}\n onClose={closer as any}\n TransitionComponent={TransitionRight}\n >\n {inner(snack)}\n </Snackbar>\n );\n });\n }\n\n return <>{snackDisplay()}</>;\n}\n\nexport default SnackPanel;\n","import { ApplicationInsights } from '@microsoft/applicationinsights-web';\nimport { ReactPlugin } from '@microsoft/applicationinsights-react-js';\nimport { createBrowserHistory } from 'history';\n\nconst browserHistory = createBrowserHistory({ basename: '' });\nconst reactPlugin = new ReactPlugin();\nconst appInsights = new ApplicationInsights({\n config: {\n instrumentationKey: process.env.REACT_APP_APPINSIGHTS_KEY,\n extensions: [ reactPlugin ],\n extensionConfig: {\n [reactPlugin.identifier]: { history: browserHistory },\n },\n enableAutoRouteTracking: true,\n disableTelemetry: process.env.REACT_APP_APPINSIGHTS_KEY === undefined,\n },\n});\n\nif (process.env.REACT_APP_APPINSIGHTS_KEY) {\n appInsights.loadAppInsights();\n}\n\nexport { reactPlugin, appInsights };\n","import 'react-app-polyfill/ie11';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport { BrowserRouter as _BrowserRouter } from 'react-router-dom';\nimport { Provider as _Provider } from 'react-redux';\nimport * as serviceWorker from './serviceWorker';\nimport { AppInsightsContext } from '@microsoft/applicationinsights-react-js';\n\nimport './styles/tailwind.css';\nimport './styles/index.css';\nimport store from './store';\nimport App from './components/App';\nimport MuiTheme from './components/shared/MuiTheme';\nimport makeServer from 'server';\nimport { loginInit } from 'authentication/authentication';\nimport SnackPanel from 'notifications/SnackPanel';\nimport { reactPlugin } from 'shared/telemetry/appInsights';\n\n// handle logging in or redirecting to login before the app starts\nloginInit(); // todo: refactor this to return user?\n\nif (process.env.REACT_APP_USE_MIRAGE === 'true') {\n const server = makeServer({ environment: 'development' });\n server.logging = process.env.REACT_APP_LOG_LEVEL === 'debug';\n}\n\nconst Provider = _Provider as any;\nconst BrowserRouter = _BrowserRouter as any;\n\n// NOTE: do not put any layout here. This file is for main app configuration.\n// Main layout and routing configuration is in App.tsx\nconst container = document.getElementById('root');\nReactDOM.render(\n <React.StrictMode>\n <Provider store={store}>\n <MuiTheme>\n <AppInsightsContext.Provider value={reactPlugin}>\n <BrowserRouter >\n <App />\n </BrowserRouter>\n </AppInsightsContext.Provider>\n <SnackPanel />\n </MuiTheme>\n </Provider>\n </React.StrictMode>,\n container,\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"summaryContainer\":\"NonPlanYearServiceSummary_summaryContainer__aLa6u\",\"dataSection\":\"NonPlanYearServiceSummary_dataSection__2FJ96\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"sectionHeader\":\"CobraQeSummary_sectionHeader__2A2cW\",\"link\":\"CobraQeSummary_link__3tuTV\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"sectionHeader\":\"DirectBillingSummary_sectionHeader__1YMHG\",\"link\":\"DirectBillingSummary_link__18ftE\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"sectionHeader\":\"EnterLeaveRequestSummary_sectionHeader__mgeNt\",\"link\":\"EnterLeaveRequestSummary_link__1IUcy\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"eventInfoFormField\":\"DirectBillingEventInfoForm_eventInfoFormField__8FbtM\",\"twoCol\":\"DirectBillingEventInfoForm_twoCol__qsnFf\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"mainContainer\":\"DefaultLayout_mainContainer__1cSFi\",\"header\":\"DefaultLayout_header__ZHTk3\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"summaryContainer\":\"Benefits_summaryContainer__2sySL\",\"dataSection\":\"Benefits_dataSection__3PSyk\",\"color\":\"Benefits_color__3-08t\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"tile\":\"CompanyTile_tile__28a45\",\"media\":\"CompanyTile_media__cCSxB\",\"content\":\"CompanyTile_content__byZmQ\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"sectionHeader\":\"ReportAnAbsenceSummary_sectionHeader__3Y24j\",\"link\":\"ReportAnAbsenceSummary_link__1vOb7\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"backdrop\":\"Loading_backdrop__3WjhW\",\"imageContainer\":\"Loading_imageContainer__2plPC\",\"logoImage\":\"Loading_logoImage__ZbSw8\",\"pulseAnimation\":\"Loading_pulseAnimation__3vfeE\",\"waitText\":\"Loading_waitText__3_297\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"accountManagerTile\":\"AccountManagerTile_accountManagerTile__2jEvD\",\"gradient\":\"AccountManagerTile_gradient__3sgxR\",\"tileFooter\":\"AccountManagerTile_tileFooter__LB3zp\"};","// @see https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#assertion-functions\n\n/**\n * A general assertion of a conditional.\n * ```typescript\n function yell(str) {\n assert(typeof str === \"string\");\n\n return str.toUppercase();\n // ~~~~~~~~~~~\n // error: Property 'toUppercase' does not exist on type 'string'.\n // Did you mean 'toUpperCase'?\n }\n * ```\n * @param {any} condition could be any conditional that evaluates to a boolean\n * @param {string} [msg] an optional message to\n * @throws on a false conditional\n */\nexport function assert(condition: any, msg?: string): asserts condition {\n if (!condition) {\n throw new Error(msg);\n }\n}\n\n/**\n * Assertion to check that a given value is not `null` nor `undefined`\n *\n * @param {T} val\n * @throws if val is `null` or `undefined`\n */\nexport function assertIsDefined<T>(val: T): asserts val is NonNullable<T> {\n if (val === undefined || val === null) {\n throw new Error(`Expected value to be defined, but received ${val}`);\n }\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"logoContainer\":\"FloresHeaderLogo_logoContainer__8w2Lr\",\"logo\":\"FloresHeaderLogo_logo__1QHFV\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"navItem\":\"NavItem_navItem__1_MtV\",\"active\":\"NavItem_active__2xhYM\"};","import { LoginInfo, User } from './user.types';\nimport { assertIsDefined } from 'shared/asserts';\nimport { parseQueryString } from 'shared/utils';\n\n/**\n * Handle the initial landing on the app with potentially a token in the url.\n *\n * @throws if any required environment variables is undefined.\n * @throws if JSON.parse throws\n */\nexport function loginInit() {\n // if we hit this route with a t=<string> in the query string, we are logging in.\n const queryMap = parseQueryString(window.location.search);\n\n if (queryMap.has('t')) {\n // login\n const token = queryMap.get('t');\n assertIsDefined(token);\n const info = parseLoginToken(token);\n setLogin(info);\n\n if (info.user.requiremfa === 'Y') {\n window.localStorage.setItem('isPartialLogin', 'Y');\n }\n } else if (!isLoggedIn()) {\n // not logged in, redirect to login\n window.location.replace(process.env.REACT_APP_LOGIN_URL ?? 'https://flores247.com/');\n }\n}\n\n/**\n * Determine if there is a login in the localstorage. This merely checks for user and jwt, and does not validate either.\n *\n * @returns true if there is a login, false if not.\n * @throws if environment variables are not defined\n */\nexport function isLoggedIn(): boolean {\n const user = getUser();\n const jwt = getJWT();\n\n return user !== null && jwt.length > 0;\n}\n\n/**\n * Parse a login token we get from the API.\n *\n * @param token a base64url encoded string of a user and jwt response\n * @returns an object containing a user object and a jwt token\n * @throws if JSON.parse() throws\n */\nexport function parseLoginToken(token: string): LoginInfo {\n const unescaped = (token + '==='.slice((token.length + 3) % 4))\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n const decoded = Buffer.from(unescaped, 'base64').toString('utf8');\n\n return JSON.parse(decoded) as LoginInfo;\n}\n\n/**\n * Store login information for a user. Does not actually authenticate or validate the info.\n *\n * @param info the user and jwt data to set\n * @throws if environment variables are not defined\n * @throws if JSON.stringify() throws\n */\nexport function setLogin(info: LoginInfo) {\n const { user, token } = info;\n setUser(user);\n setJWT(token);\n}\n\n/**\n * Store JWT information for a user. Does not actually authenticate or validate the info.\n *\n * @param token the jwt data to set\n * @throws if environment variables are not defined\n */\nexport function setJWT(token: string) {\n assertIsDefined(process.env.REACT_APP_JWT_STORAGE_KEY);\n window.localStorage.setItem(process.env.REACT_APP_JWT_STORAGE_KEY, token);\n}\n\n/**\n * Clears the login info from localstorage, effectively logging out the user since any subsequent API calls will fail.\n *\n * @throws if environment variables are not defined\n */\nexport function logout() {\n assertIsDefined(process.env.REACT_APP_USER_STORAGE_KEY);\n assertIsDefined(process.env.REACT_APP_JWT_STORAGE_KEY);\n\n window.localStorage.removeItem(process.env.REACT_APP_USER_STORAGE_KEY);\n window.localStorage.removeItem(process.env.REACT_APP_JWT_STORAGE_KEY);\n}\n\n/**\n * Get the JWT from localstorage\n * @returns the jwt or empty string if it is not set\n * @throws if the REACT_APP_JWT_STORAGE_KEY environment variable is null or undefined\n */\nexport function getJWT(): string {\n assertIsDefined(process.env.REACT_APP_JWT_STORAGE_KEY);\n const jwt = window.localStorage.getItem(process.env.REACT_APP_JWT_STORAGE_KEY);\n\n return jwt ?? '';\n}\n\n/**\n * Get the logged in user from localstorage\n * @returns the logged in user or null if it's not in storage\n * @throws if the REACT_APP_USER_STORAGE_KEY environment variable is null or undefined\n * @throws if JSON.parse throws\n */\nexport function getUser(): User | null {\n assertIsDefined(process.env.REACT_APP_USER_STORAGE_KEY);\n const user = window.localStorage.getItem(process.env.REACT_APP_USER_STORAGE_KEY);\n\n return user ? JSON.parse(user) : null;\n}\n\n/**\n * Set the user in localstorage\n * @param {User} user details to set\n * @throws if the REACT_APP_USER_STORAGE_KEY environment variable is null or undefined\n */\nexport function setUser(user: User) {\n assertIsDefined(process.env.REACT_APP_USER_STORAGE_KEY);\n\n window.localStorage.setItem(process.env.REACT_APP_USER_STORAGE_KEY, JSON.stringify(user));\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"toolbar\":\"AppToolbar_toolbar__A5us1\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"img\":\"CompanyAvatar_img__2H0NL\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"agentAvatar\":\"AgentAvatar_agentAvatar__13jKM\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"eventInfoFormField\":\"EventInfoForm_eventInfoFormField__k7OIz\",\"twoCol\":\"EventInfoForm_twoCol__BbeDP\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"modal\":\"CancelModel_modal__1IoXx\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"modal\":\"Dependents_modal__1OFGG\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"oops\":\"NotFound_oops__3eFq6\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"tabsBottomBoder\":\"ReportsTabs_tabsBottomBoder__3HIpC\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"tabsBottomBoder\":\"DocumentLibraryTabs_tabsBottomBoder__4tyJu\"};"],"sourceRoot":""}