@gusto/embedded-react-sdk 0.55.0 → 0.55.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -0
- package/dist/components/Common/TaxInputs/TaxInputs.js +65 -64
- package/dist/components/Common/TaxInputs/TaxInputs.js.map +1 -1
- package/dist/components/Common/UI/Select/Select.module.scss.js +5 -5
- package/dist/components/Contractor/Payments/CreateHistoricalPayment/CreateHistoricalPayment.d.ts +4 -2
- package/dist/components/Contractor/Payments/CreateHistoricalPayment/CreateHistoricalPayment.js +148 -117
- package/dist/components/Contractor/Payments/CreateHistoricalPayment/CreateHistoricalPayment.js.map +1 -1
- package/dist/components/Contractor/Payments/CreatePayment/PreviewPresentation.js +56 -55
- package/dist/components/Contractor/Payments/CreatePayment/PreviewPresentation.js.map +1 -1
- package/dist/components/Contractor/Payments/CreatePaymentFlow/CreatePaymentFlow.d.ts +1 -1
- package/dist/components/Contractor/Payments/CreatePaymentFlow/CreatePaymentFlow.js +15 -12
- package/dist/components/Contractor/Payments/CreatePaymentFlow/CreatePaymentFlow.js.map +1 -1
- package/dist/components/Contractor/Payments/HistoricalPaymentFlow/HistoricalPaymentFlow.d.ts +69 -0
- package/dist/components/Contractor/Payments/HistoricalPaymentFlow/HistoricalPaymentFlow.js +48 -0
- package/dist/components/Contractor/Payments/HistoricalPaymentFlow/HistoricalPaymentFlow.js.map +1 -0
- package/dist/components/Contractor/Payments/HistoricalPaymentFlow/HistoricalPaymentFlowComponents.d.ts +20 -0
- package/dist/components/Contractor/Payments/HistoricalPaymentFlow/HistoricalPaymentFlowComponents.js +25 -0
- package/dist/components/Contractor/Payments/HistoricalPaymentFlow/HistoricalPaymentFlowComponents.js.map +1 -0
- package/dist/components/Contractor/Payments/HistoricalPaymentFlow/historicalPaymentMachine.d.ts +20 -0
- package/dist/components/Contractor/Payments/HistoricalPaymentFlow/historicalPaymentMachine.js +24 -0
- package/dist/components/Contractor/Payments/HistoricalPaymentFlow/historicalPaymentMachine.js.map +1 -0
- package/dist/components/Contractor/Payments/HistoricalPaymentFlow/index.d.ts +2 -0
- package/dist/components/Contractor/Payments/HistoricalPaymentSummary/HistoricalPaymentSummary.js +16 -15
- package/dist/components/Contractor/Payments/HistoricalPaymentSummary/HistoricalPaymentSummary.js.map +1 -1
- package/dist/components/Contractor/Payments/PaymentFlow/PaymentFlowComponents.d.ts +2 -0
- package/dist/components/Contractor/Payments/PaymentFlow/PaymentFlowComponents.js +36 -23
- package/dist/components/Contractor/Payments/PaymentFlow/PaymentFlowComponents.js.map +1 -1
- package/dist/components/Contractor/Payments/PaymentFlow/paymentStateMachine.d.ts +10 -8
- package/dist/components/Contractor/Payments/PaymentFlow/paymentStateMachine.js +46 -25
- package/dist/components/Contractor/Payments/PaymentFlow/paymentStateMachine.js.map +1 -1
- package/dist/components/Contractor/Payments/PaymentHistory/PaymentHistoryPresentation.js +53 -52
- package/dist/components/Contractor/Payments/PaymentHistory/PaymentHistoryPresentation.js.map +1 -1
- package/dist/components/Contractor/Payments/PaymentStatement/PaymentStatementPresentation.js +37 -47
- package/dist/components/Contractor/Payments/PaymentStatement/PaymentStatementPresentation.js.map +1 -1
- package/dist/components/Contractor/Payments/PaymentsList/PaymentsList.js +47 -44
- package/dist/components/Contractor/Payments/PaymentsList/PaymentsList.js.map +1 -1
- package/dist/components/Contractor/Payments/PaymentsList/PaymentsListPresentation.d.ts +2 -1
- package/dist/components/Contractor/Payments/PaymentsList/PaymentsListPresentation.js +65 -53
- package/dist/components/Contractor/Payments/PaymentsList/PaymentsListPresentation.js.map +1 -1
- package/dist/components/Contractor/Payments/PaymentsList/PaymentsListPresentation.module.scss.js +6 -4
- package/dist/components/Contractor/Payments/PaymentsList/PaymentsListPresentation.module.scss.js.map +1 -1
- package/dist/components/Contractor/Payments/ViewPaymentFlow/ViewPaymentFlow.d.ts +1 -1
- package/dist/components/Contractor/Payments/ViewPaymentFlow/ViewPaymentFlow.js +22 -19
- package/dist/components/Contractor/Payments/ViewPaymentFlow/ViewPaymentFlow.js.map +1 -1
- package/dist/components/Contractor/Payments/shared/PaymentSummaryBlock/PaymentSummaryBlock.d.ts +2 -8
- package/dist/components/Contractor/Payments/shared/PaymentSummaryBlock/PaymentSummaryBlock.js +43 -42
- package/dist/components/Contractor/Payments/shared/PaymentSummaryBlock/PaymentSummaryBlock.js.map +1 -1
- package/dist/components/Contractor/Payments/shared/paymentAmounts.d.ts +32 -0
- package/dist/components/Contractor/Payments/shared/paymentAmounts.js +11 -0
- package/dist/components/Contractor/Payments/shared/paymentAmounts.js.map +1 -0
- package/dist/components/Contractor/Payments/shared/paymentAmounts.test.d.ts +1 -0
- package/dist/components/Contractor/Payments/shared/usePaymentAmountsEditor.d.ts +13 -4
- package/dist/components/Contractor/Payments/shared/usePaymentAmountsEditor.js +43 -38
- package/dist/components/Contractor/Payments/shared/usePaymentAmountsEditor.js.map +1 -1
- package/dist/components/Contractor/exports/contractorManagement.d.ts +1 -0
- package/dist/components/Contractor/exports/contractorManagement.js +34 -32
- package/dist/components/Contractor/exports/contractorManagement.js.map +1 -1
- package/dist/components/Contractor/shared/SelectContractors/SelectContractors.d.ts +6 -1
- package/dist/components/Contractor/shared/SelectContractors/SelectContractors.js +13 -12
- package/dist/components/Contractor/shared/SelectContractors/SelectContractors.js.map +1 -1
- package/dist/components/Contractor/shared/SelectContractors/useSelectContractors.d.ts +5 -1
- package/dist/components/Contractor/shared/SelectContractors/useSelectContractors.js +34 -32
- package/dist/components/Contractor/shared/SelectContractors/useSelectContractors.js.map +1 -1
- package/dist/components/Payroll/PayrollConfiguration/PayrollConfiguration.d.ts +7 -0
- package/dist/components/Payroll/PayrollConfiguration/PayrollConfiguration.js +191 -153
- package/dist/components/Payroll/PayrollConfiguration/PayrollConfiguration.js.map +1 -1
- package/dist/components/Payroll/PayrollConfiguration/usePayrollConfigurationData.d.ts +1 -0
- package/dist/components/Payroll/PayrollConfiguration/usePayrollConfigurationData.js +87 -81
- package/dist/components/Payroll/PayrollConfiguration/usePayrollConfigurationData.js.map +1 -1
- package/dist/components/Payroll/PayrollExecutionFlow/PayrollExecutionFlow.d.ts +1 -0
- package/dist/components/Payroll/PayrollExecutionFlow/PayrollExecutionFlow.js.map +1 -1
- package/dist/components/Payroll/PayrollExecutionFlow/payrollExecutionMachine.js +73 -48
- package/dist/components/Payroll/PayrollExecutionFlow/payrollExecutionMachine.js.map +1 -1
- package/dist/components/Payroll/PayrollFlow/PayrollFlow.d.ts +1 -1
- package/dist/components/Payroll/PayrollFlow/PayrollFlow.js +22 -20
- package/dist/components/Payroll/PayrollFlow/PayrollFlow.js.map +1 -1
- package/dist/components/Payroll/PayrollFlow/PayrollFlowComponents.d.ts +3 -0
- package/dist/components/Payroll/PayrollFlow/PayrollFlowComponents.js +22 -20
- package/dist/components/Payroll/PayrollFlow/PayrollFlowComponents.js.map +1 -1
- package/dist/components/Payroll/PayrollLanding/PayrollLanding.d.ts +2 -0
- package/dist/components/Payroll/PayrollLanding/PayrollLanding.js +34 -26
- package/dist/components/Payroll/PayrollLanding/PayrollLanding.js.map +1 -1
- package/dist/components/Payroll/PayrollLanding/PayrollLandingFlowComponents.d.ts +4 -0
- package/dist/components/Payroll/PayrollLanding/PayrollLandingFlowComponents.js +51 -43
- package/dist/components/Payroll/PayrollLanding/PayrollLandingFlowComponents.js.map +1 -1
- package/dist/components/Payroll/PayrollList/PayrollList.d.ts +2 -0
- package/dist/components/Payroll/PayrollList/PayrollList.js +48 -47
- package/dist/components/Payroll/PayrollList/PayrollList.js.map +1 -1
- package/dist/components/Payroll/PayrollList/PayrollListPresentation.d.ts +2 -1
- package/dist/components/Payroll/PayrollList/PayrollListPresentation.js +44 -43
- package/dist/components/Payroll/PayrollList/PayrollListPresentation.js.map +1 -1
- package/dist/components/Payroll/PayrollOverview/PayrollOverview.d.ts +7 -0
- package/dist/components/Payroll/PayrollOverview/PayrollOverview.js +115 -112
- package/dist/components/Payroll/PayrollOverview/PayrollOverview.js.map +1 -1
- package/dist/components/Payroll/PayrollOverview/PayrollOverviewPresentation.d.ts +2 -1
- package/dist/components/Payroll/PayrollOverview/PayrollOverviewPresentation.js +94 -103
- package/dist/components/Payroll/PayrollOverview/PayrollOverviewPresentation.js.map +1 -1
- package/dist/components/Payroll/PayrollReceipts/PayrollReceipts.js +22 -16
- package/dist/components/Payroll/PayrollReceipts/PayrollReceipts.js.map +1 -1
- package/dist/components/Payroll/PayrollReceipts/PayrollReceiptsPresentation.js +58 -49
- package/dist/components/Payroll/PayrollReceipts/PayrollReceiptsPresentation.js.map +1 -1
- package/dist/components/Payroll/PrintChecks/PrintChecks.d.ts +21 -0
- package/dist/components/Payroll/PrintChecks/PrintChecks.js +68 -0
- package/dist/components/Payroll/PrintChecks/PrintChecks.js.map +1 -0
- package/dist/components/Payroll/PrintChecks/PrintChecksBanner/PrintChecksBanner.d.ts +9 -0
- package/dist/components/Payroll/PrintChecks/PrintChecksBanner/PrintChecksBanner.js +34 -0
- package/dist/components/Payroll/PrintChecks/PrintChecksBanner/PrintChecksBanner.js.map +1 -0
- package/dist/components/Payroll/PrintChecks/PrintChecksBanner/index.d.ts +1 -0
- package/dist/components/Payroll/PrintChecks/PrintChecksComponents.d.ts +48 -0
- package/dist/components/Payroll/PrintChecks/PrintChecksComponents.js +26 -0
- package/dist/components/Payroll/PrintChecks/PrintChecksComponents.js.map +1 -0
- package/dist/components/Payroll/PrintChecks/PrintChecksFailure/PrintChecksFailure.d.ts +14 -0
- package/dist/components/Payroll/PrintChecks/PrintChecksFailure/PrintChecksFailure.js +47 -0
- package/dist/components/Payroll/PrintChecks/PrintChecksFailure/PrintChecksFailure.js.map +1 -0
- package/dist/components/Payroll/PrintChecks/PrintChecksFailure/index.d.ts +1 -0
- package/dist/components/Payroll/PrintChecks/PrintChecksForm/PrintChecksForm.d.ts +16 -0
- package/dist/components/Payroll/PrintChecks/PrintChecksForm/PrintChecksForm.js +144 -0
- package/dist/components/Payroll/PrintChecks/PrintChecksForm/PrintChecksForm.js.map +1 -0
- package/dist/components/Payroll/PrintChecks/PrintChecksForm/index.d.ts +1 -0
- package/dist/components/Payroll/PrintChecks/PrintChecksSummary/PrintChecksSummary.d.ts +14 -0
- package/dist/components/Payroll/PrintChecks/PrintChecksSummary/PrintChecksSummary.js +39 -0
- package/dist/components/Payroll/PrintChecks/PrintChecksSummary/PrintChecksSummary.js.map +1 -0
- package/dist/components/Payroll/PrintChecks/PrintChecksSummary/index.d.ts +1 -0
- package/dist/components/Payroll/PrintChecks/index.d.ts +2 -0
- package/dist/components/Payroll/PrintChecks/printChecksStateMachine.d.ts +33 -0
- package/dist/components/Payroll/PrintChecks/printChecksStateMachine.js +93 -0
- package/dist/components/Payroll/PrintChecks/printChecksStateMachine.js.map +1 -0
- package/dist/components/Payroll/PrintChecks/types.d.ts +14 -0
- package/dist/components/Payroll/index.d.ts +2 -0
- package/dist/components/Payroll/index.js +26 -24
- package/dist/components/Payroll/index.js.map +1 -1
- package/dist/contexts/GustoProvider/GustoProviderCustomUIAdapter.d.ts +6 -0
- package/dist/contexts/GustoProvider/GustoProviderCustomUIAdapter.js +36 -34
- package/dist/contexts/GustoProvider/GustoProviderCustomUIAdapter.js.map +1 -1
- package/dist/contexts/UnstableFeaturesProvider/UnstableFeaturesProvider.d.ts +22 -0
- package/dist/contexts/UnstableFeaturesProvider/UnstableFeaturesProvider.js +14 -0
- package/dist/contexts/UnstableFeaturesProvider/UnstableFeaturesProvider.js.map +1 -0
- package/dist/contexts/UnstableFeaturesProvider/WithUnstableFeature.d.ts +19 -0
- package/dist/contexts/UnstableFeaturesProvider/WithUnstableFeature.js +8 -0
- package/dist/contexts/UnstableFeaturesProvider/WithUnstableFeature.js.map +1 -0
- package/dist/contexts/UnstableFeaturesProvider/useUnstableFeature.d.ts +41 -0
- package/dist/contexts/UnstableFeaturesProvider/useUnstableFeature.js +14 -0
- package/dist/contexts/UnstableFeaturesProvider/useUnstableFeature.js.map +1 -0
- package/dist/contexts/index.d.ts +1 -0
- package/dist/i18n/I18n.js +4 -0
- package/dist/i18n/I18n.js.map +1 -1
- package/dist/i18n/en/Contractor.Payments.CreateHistoricalPayment.json.js +34 -32
- package/dist/i18n/en/Contractor.Payments.CreateHistoricalPayment.json.js.map +1 -1
- package/dist/i18n/en/Contractor.Payments.PaymentsList.json.js +20 -18
- package/dist/i18n/en/Contractor.Payments.PaymentsList.json.js.map +1 -1
- package/dist/i18n/en/Payroll.PayrollConfiguration.json.js +9 -9
- package/dist/i18n/en/Payroll.PayrollOverview.json.js +38 -38
- package/dist/i18n/en/Payroll.PayrollReceipts.json.js +2 -2
- package/dist/i18n/en/Payroll.PrintChecksBanner.json.js +14 -0
- package/dist/i18n/en/Payroll.PrintChecksBanner.json.js.map +1 -0
- package/dist/i18n/en/Payroll.PrintChecksFailure.json.js +12 -0
- package/dist/i18n/en/Payroll.PrintChecksFailure.json.js.map +1 -0
- package/dist/i18n/en/Payroll.PrintChecksForm.json.js +28 -0
- package/dist/i18n/en/Payroll.PrintChecksForm.json.js.map +1 -0
- package/dist/i18n/en/Payroll.PrintChecksSummary.json.js +14 -0
- package/dist/i18n/en/Payroll.PrintChecksSummary.json.js.map +1 -0
- package/dist/i18n/en/common.json.d.ts +0 -21
- package/dist/i18n/types.d.ts +75 -9
- package/dist/models/external.d.ts +3 -0
- package/dist/partner-hook-utils/form/buildFormSchema.js +60 -54
- package/dist/partner-hook-utils/form/buildFormSchema.js.map +1 -1
- package/dist/shared/constants.d.ts +30 -0
- package/dist/shared/constants.js +62 -50
- package/dist/shared/constants.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/test-utils/renderWithProviders.d.ts +4 -1
- package/dist/test-utils/tableQueries.d.ts +9 -0
- package/docs/guides/endpoint-inventory.json +33 -0
- package/package.json +18 -18
|
@@ -1,169 +1,196 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { useState as f, useRef as
|
|
3
|
-
import { useQueryClient as
|
|
4
|
-
import { usePayrollsGetSuspense as
|
|
5
|
-
import { payrollsCalculate as
|
|
6
|
-
import { useGustoEmbeddedContext as
|
|
7
|
-
import { PayrollProcessingRequestStatus as
|
|
8
|
-
import { useTranslation as
|
|
9
|
-
import { usePayrollsUpdateMutation as
|
|
10
|
-
import { usePayrollsCalculateGrossUpMutation as
|
|
11
|
-
import { usePayrollsGetBlockersSuspense as
|
|
12
|
-
import { payrollSubmitHandler as
|
|
13
|
-
import { hasDirectDepositEmployees as
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
1
|
+
import { jsx as C, jsxs as fe, Fragment as Ce } from "react/jsx-runtime";
|
|
2
|
+
import { useState as f, useRef as q, useMemo as F, useEffect as D } from "react";
|
|
3
|
+
import { useQueryClient as Pe } from "@tanstack/react-query";
|
|
4
|
+
import { usePayrollsGetSuspense as Ue } from "@gusto/embedded-api/react-query/payrollsGet";
|
|
5
|
+
import { payrollsCalculate as ge } from "@gusto/embedded-api/funcs/payrollsCalculate";
|
|
6
|
+
import { useGustoEmbeddedContext as he } from "@gusto/embedded-api/react-query/_context";
|
|
7
|
+
import { PayrollProcessingRequestStatus as O } from "@gusto/embedded-api/models/components/payrollprocessingrequest";
|
|
8
|
+
import { useTranslation as Le } from "react-i18next";
|
|
9
|
+
import { usePayrollsUpdateMutation as Se } from "@gusto/embedded-api/react-query/payrollsUpdate";
|
|
10
|
+
import { usePayrollsCalculateGrossUpMutation as Ae } from "@gusto/embedded-api/react-query/payrollsCalculateGrossUp";
|
|
11
|
+
import { usePayrollsGetBlockersSuspense as _e } from "@gusto/embedded-api/react-query/payrollsGetBlockers";
|
|
12
|
+
import { payrollSubmitHandler as we } from "../PayrollBlocker/payrollHelpers.js";
|
|
13
|
+
import { hasDirectDepositEmployees as Re } from "../helpers.js";
|
|
14
|
+
import { PayrollOverview as Ee } from "../PayrollOverview/PayrollOverview.js";
|
|
15
|
+
import { PayrollConfigurationPresentation as De } from "./PayrollConfigurationPresentation.js";
|
|
16
|
+
import { usePayrollConfigurationData as Oe } from "./usePayrollConfigurationData.js";
|
|
17
|
+
import { isGrossUpEligible as Te, getGrossUpTargetCompensationName as xe } from "./grossUpHelpers.js";
|
|
18
|
+
import { BaseComponent as be } from "../../Base/Base.js";
|
|
19
|
+
import { componentEvents as l } from "../../../shared/constants.js";
|
|
20
|
+
import { useComponentDictionary as ke, useI18n as Ne } from "../../../i18n/I18n.js";
|
|
21
|
+
import { useBase as Ge } from "../../Base/useBase.js";
|
|
22
|
+
import { useDateFormatter as Ye } from "../../../hooks/useDateFormatter.js";
|
|
23
|
+
import { SDKInternalError as j } from "../../../types/sdkError.js";
|
|
24
|
+
import { API_QUERY_NAMESPACE as Me } from "../../../contexts/ApiProvider/apiVersion.js";
|
|
25
|
+
import { GrossUpModal as Be } from "../GrossUpModal/GrossUpModal.js";
|
|
26
|
+
const qe = (t) => t?.status === O.Calculating, Fe = (t, u) => u != null && (t?.status === O.CalculateSuccess || t == null);
|
|
27
|
+
function fo(t) {
|
|
28
|
+
return /* @__PURE__ */ C(be, { ...t, children: /* @__PURE__ */ C(je, { ...t, children: t.children }) });
|
|
28
29
|
}
|
|
29
|
-
const
|
|
30
|
+
const je = ({
|
|
30
31
|
onEvent: t,
|
|
31
|
-
companyId:
|
|
32
|
-
payrollId:
|
|
33
|
-
dictionary:
|
|
34
|
-
alerts:
|
|
35
|
-
withReimbursements:
|
|
32
|
+
companyId: u,
|
|
33
|
+
payrollId: i,
|
|
34
|
+
dictionary: v,
|
|
35
|
+
alerts: W,
|
|
36
|
+
withReimbursements: T = !0
|
|
36
37
|
}) => {
|
|
37
|
-
|
|
38
|
-
const { t: p } =
|
|
38
|
+
ke("Payroll.PayrollConfiguration", v), Ne("Payroll.PayrollConfiguration");
|
|
39
|
+
const { t: p } = Le("Payroll.PayrollConfiguration"), { baseSubmitHandler: P } = Ge(), c = Ye(), [n, m] = f(!1), [g, x] = f(!1), h = q(null), K = he(), H = Pe(), { data: s } = Ue(
|
|
39
40
|
{
|
|
40
|
-
companyId:
|
|
41
|
-
payrollId:
|
|
41
|
+
companyId: u,
|
|
42
|
+
payrollId: i,
|
|
42
43
|
include: ["taxes", "benefits", "deductions", "payroll_status_meta"]
|
|
43
44
|
},
|
|
44
|
-
{ refetchInterval:
|
|
45
|
-
),
|
|
45
|
+
{ refetchInterval: n ? 5e3 : !1 }
|
|
46
|
+
), V = F(
|
|
46
47
|
() => s.payrollShow?.employeeCompensations?.filter((e) => e.excluded).map((e) => e.employeeUuid).filter(Boolean) ?? [],
|
|
47
48
|
[s.payrollShow?.employeeCompensations]
|
|
48
49
|
), {
|
|
49
|
-
employeeDetails:
|
|
50
|
-
employeeCompensations:
|
|
51
|
-
paySchedule:
|
|
52
|
-
payPeriod:
|
|
50
|
+
employeeDetails: I,
|
|
51
|
+
employeeCompensations: b,
|
|
52
|
+
paySchedule: Q,
|
|
53
|
+
payPeriod: J,
|
|
53
54
|
payrollCategory: L,
|
|
54
|
-
pagination:
|
|
55
|
-
isLoading:
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
55
|
+
pagination: z,
|
|
56
|
+
isLoading: X,
|
|
57
|
+
isAlreadyProcessed: S,
|
|
58
|
+
refetch: A
|
|
59
|
+
} = Oe({
|
|
60
|
+
companyId: u,
|
|
61
|
+
payrollId: i,
|
|
62
|
+
isCalculating: n || g,
|
|
63
|
+
excludedEmployeeUuids: V
|
|
64
|
+
}), _ = F(
|
|
65
|
+
() => ({
|
|
66
|
+
type: "error",
|
|
67
|
+
title: p("alerts.alreadyProcessed"),
|
|
68
|
+
alertKey: "alreadyProcessed"
|
|
69
|
+
}),
|
|
70
|
+
[p]
|
|
71
|
+
), w = q(!1);
|
|
72
|
+
D(() => {
|
|
73
|
+
if (!S) {
|
|
74
|
+
w.current = !1;
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
w.current || (w.current = !0, t(l.RUN_PAYROLL_ALREADY_PROCESSED, {
|
|
78
|
+
payrollId: i,
|
|
79
|
+
alert: _,
|
|
80
|
+
payPeriod: s.payrollShow?.payPeriod
|
|
81
|
+
}));
|
|
82
|
+
}, [
|
|
83
|
+
S,
|
|
84
|
+
t,
|
|
85
|
+
i,
|
|
86
|
+
_,
|
|
87
|
+
s.payrollShow?.payPeriod
|
|
88
|
+
]);
|
|
89
|
+
const { mutateAsync: k, isPending: Z } = Se(), { mutateAsync: $ } = Ae(), [d, N] = f(null), [ee, R] = f(!1), G = Te(L), U = xe(L), oe = (e) => {
|
|
90
|
+
N(e), R(!0), t(l.RUN_PAYROLL_GROSS_UP_SELECTED, { employeeUuid: e });
|
|
91
|
+
}, te = async (e) => {
|
|
65
92
|
if (!d) return null;
|
|
66
93
|
let o = null;
|
|
67
|
-
return await
|
|
68
|
-
o = (await
|
|
94
|
+
return await P(null, async () => {
|
|
95
|
+
o = (await $({
|
|
69
96
|
request: {
|
|
70
|
-
payrollUuid:
|
|
97
|
+
payrollUuid: i,
|
|
71
98
|
payrollGrossUpRequest: {
|
|
72
99
|
employeeUuid: d,
|
|
73
100
|
netPay: e.toString()
|
|
74
101
|
}
|
|
75
102
|
}
|
|
76
|
-
})).payrollGrossUpResponse?.grossUp ?? null, o && t(
|
|
103
|
+
})).payrollGrossUpResponse?.grossUp ?? null, o && t(l.RUN_PAYROLL_GROSS_UP_CALCULATED, {
|
|
77
104
|
grossUp: o,
|
|
78
105
|
netPay: e,
|
|
79
106
|
employeeUuid: d
|
|
80
107
|
});
|
|
81
108
|
}), o;
|
|
82
|
-
},
|
|
109
|
+
}, ae = async (e) => {
|
|
83
110
|
if (!d || !U)
|
|
84
|
-
throw new
|
|
111
|
+
throw new j(
|
|
85
112
|
"Unable to apply gross-up: missing employee or target compensation."
|
|
86
113
|
);
|
|
87
|
-
const o =
|
|
114
|
+
const o = b.find((a) => a.employeeUuid === d);
|
|
88
115
|
if (!o)
|
|
89
|
-
throw new
|
|
90
|
-
const
|
|
116
|
+
throw new j("Unable to apply gross-up: employee compensation not found.");
|
|
117
|
+
const r = o.fixedCompensations ?? [], y = r.some(
|
|
91
118
|
(a) => a.name?.toLowerCase() === U.toLowerCase()
|
|
92
|
-
),
|
|
119
|
+
), B = r.map((a) => ({
|
|
93
120
|
name: a.name,
|
|
94
121
|
jobUuid: a.jobUuid,
|
|
95
122
|
amount: a.name?.toLowerCase() === U.toLowerCase() ? e : "0"
|
|
96
123
|
}));
|
|
97
124
|
if (!y) {
|
|
98
|
-
const a = o.hourlyCompensations?.[0]?.jobUuid ??
|
|
99
|
-
|
|
125
|
+
const a = o.hourlyCompensations?.[0]?.jobUuid ?? r[0]?.jobUuid ?? "";
|
|
126
|
+
B.push({
|
|
100
127
|
name: U,
|
|
101
128
|
jobUuid: a,
|
|
102
129
|
amount: e
|
|
103
130
|
});
|
|
104
131
|
}
|
|
105
|
-
const
|
|
132
|
+
const me = (o.hourlyCompensations ?? []).map((a) => ({
|
|
106
133
|
name: a.name,
|
|
107
134
|
jobUuid: a.jobUuid,
|
|
108
135
|
hours: "0"
|
|
109
|
-
})),
|
|
136
|
+
})), de = (o.paidTimeOff ?? []).map((a) => ({
|
|
110
137
|
name: a.name,
|
|
111
138
|
hours: "0"
|
|
112
|
-
})),
|
|
139
|
+
})), ye = M({
|
|
113
140
|
...o,
|
|
114
|
-
fixedCompensations:
|
|
115
|
-
hourlyCompensations:
|
|
116
|
-
paidTimeOff:
|
|
141
|
+
fixedCompensations: B,
|
|
142
|
+
hourlyCompensations: me,
|
|
143
|
+
paidTimeOff: de
|
|
117
144
|
});
|
|
118
|
-
await
|
|
119
|
-
const a = await
|
|
145
|
+
await P({}, async () => {
|
|
146
|
+
const a = await k({
|
|
120
147
|
request: {
|
|
121
|
-
companyId:
|
|
122
|
-
payrollId:
|
|
148
|
+
companyId: u,
|
|
149
|
+
payrollId: i,
|
|
123
150
|
payrollUpdate: {
|
|
124
|
-
employeeCompensations: [{ ...
|
|
151
|
+
employeeCompensations: [{ ...ye, excluded: !1 }]
|
|
125
152
|
}
|
|
126
153
|
}
|
|
127
154
|
});
|
|
128
|
-
t(
|
|
155
|
+
t(l.RUN_PAYROLL_EMPLOYEE_SAVED, {
|
|
129
156
|
payrollPrepared: a.payrollPrepared
|
|
130
|
-
}), await
|
|
131
|
-
}),
|
|
132
|
-
},
|
|
157
|
+
}), await A();
|
|
158
|
+
}), N(null), R(!1);
|
|
159
|
+
}, se = async (e) => {
|
|
133
160
|
try {
|
|
134
|
-
await
|
|
161
|
+
await ae(e);
|
|
135
162
|
} catch {
|
|
136
163
|
}
|
|
137
|
-
}, { data:
|
|
138
|
-
companyUuid:
|
|
139
|
-
}),
|
|
164
|
+
}, { data: re } = _e({
|
|
165
|
+
companyUuid: u
|
|
166
|
+
}), Y = (re.payrollBlockers ?? []).map((e) => ({
|
|
140
167
|
key: e.key,
|
|
141
168
|
message: e.message
|
|
142
|
-
})), [
|
|
143
|
-
|
|
144
|
-
const e = await
|
|
145
|
-
|
|
169
|
+
})), [le, E] = f(Y), ie = async () => {
|
|
170
|
+
E([]), h.current = s.payrollShow?.calculatedAt?.getTime() ?? null, await P({}, async () => {
|
|
171
|
+
const e = await we(async () => {
|
|
172
|
+
x(!0);
|
|
146
173
|
try {
|
|
147
|
-
const o = await
|
|
148
|
-
companyId:
|
|
149
|
-
payrollId:
|
|
174
|
+
const o = await ge(K, {
|
|
175
|
+
companyId: u,
|
|
176
|
+
payrollId: i
|
|
150
177
|
});
|
|
151
178
|
if (!o.ok)
|
|
152
179
|
throw o.error;
|
|
153
|
-
|
|
180
|
+
H.invalidateQueries({ queryKey: [Me] }), m(!0);
|
|
154
181
|
} finally {
|
|
155
|
-
|
|
182
|
+
x(!1);
|
|
156
183
|
}
|
|
157
184
|
});
|
|
158
|
-
!e.success && e.blockers.length > 0 &&
|
|
185
|
+
!e.success && e.blockers.length > 0 && E(e.blockers);
|
|
159
186
|
});
|
|
160
|
-
},
|
|
161
|
-
t(
|
|
187
|
+
}, ne = (e) => {
|
|
188
|
+
t(l.RUN_PAYROLL_EMPLOYEE_EDIT, {
|
|
162
189
|
employeeId: e.uuid,
|
|
163
190
|
firstName: e.firstName,
|
|
164
191
|
lastName: e.lastName
|
|
165
192
|
});
|
|
166
|
-
},
|
|
193
|
+
}, M = (e) => {
|
|
167
194
|
const { paymentMethod: o } = e;
|
|
168
195
|
return {
|
|
169
196
|
employeeUuid: e.employeeUuid,
|
|
@@ -176,14 +203,14 @@ const Ye = ({
|
|
|
176
203
|
...o && o !== "Historical" ? { paymentMethod: o } : {},
|
|
177
204
|
memo: e.memo || void 0
|
|
178
205
|
};
|
|
179
|
-
},
|
|
180
|
-
t(
|
|
206
|
+
}, ue = async (e) => {
|
|
207
|
+
t(l.RUN_PAYROLL_EMPLOYEE_SKIP, {
|
|
181
208
|
employeeId: e.employeeUuid
|
|
182
|
-
}), await
|
|
183
|
-
const o =
|
|
209
|
+
}), await P({}, async () => {
|
|
210
|
+
const o = M(e), r = await k({
|
|
184
211
|
request: {
|
|
185
|
-
companyId:
|
|
186
|
-
payrollId:
|
|
212
|
+
companyId: u,
|
|
213
|
+
payrollId: i,
|
|
187
214
|
payrollUpdate: {
|
|
188
215
|
employeeCompensations: [
|
|
189
216
|
{ ...o, excluded: !o.excluded }
|
|
@@ -191,42 +218,42 @@ const Ye = ({
|
|
|
191
218
|
}
|
|
192
219
|
}
|
|
193
220
|
});
|
|
194
|
-
t(
|
|
195
|
-
payrollPrepared:
|
|
196
|
-
}), await
|
|
221
|
+
t(l.RUN_PAYROLL_EMPLOYEE_SAVED, {
|
|
222
|
+
payrollPrepared: r.payrollPrepared
|
|
223
|
+
}), await A();
|
|
197
224
|
});
|
|
198
|
-
},
|
|
199
|
-
t(
|
|
225
|
+
}, pe = () => {
|
|
226
|
+
t(l.RUN_PAYROLL_BLOCKERS_VIEW_ALL);
|
|
200
227
|
};
|
|
201
|
-
|
|
202
|
-
|
|
228
|
+
D(() => {
|
|
229
|
+
qe(s.payrollShow?.processingRequest) && !n && (h.current = s.payrollShow?.calculatedAt?.getTime() ?? null, m(!0));
|
|
203
230
|
const e = s.payrollShow?.calculatedAt, o = e?.getTime() !== h.current;
|
|
204
|
-
|
|
205
|
-
payrollId:
|
|
231
|
+
n && o && Fe(s.payrollShow?.processingRequest, e) && (t(l.RUN_PAYROLL_CALCULATED, {
|
|
232
|
+
payrollId: i,
|
|
206
233
|
alert: {
|
|
207
234
|
type: "success",
|
|
208
235
|
title: p("alerts.progressSaved"),
|
|
209
236
|
alertKey: "progressSaved"
|
|
210
237
|
},
|
|
211
238
|
payPeriod: s.payrollShow?.payPeriod
|
|
212
|
-
}),
|
|
239
|
+
}), E([]), m(!1)), n && s.payrollShow?.processingRequest?.status === O.ProcessingFailed && (t(l.RUN_PAYROLL_PROCESSING_FAILED), m(!1));
|
|
213
240
|
}, [
|
|
214
241
|
s.payrollShow?.processingRequest?.status,
|
|
215
242
|
s.payrollShow?.calculatedAt,
|
|
216
|
-
|
|
243
|
+
n,
|
|
217
244
|
t,
|
|
218
245
|
p,
|
|
219
|
-
|
|
220
|
-
]),
|
|
221
|
-
if (!
|
|
246
|
+
i
|
|
247
|
+
]), D(() => {
|
|
248
|
+
if (!n) return;
|
|
222
249
|
const e = 180 * 1e3, o = setTimeout(() => {
|
|
223
|
-
t(
|
|
250
|
+
t(l.RUN_PAYROLL_PROCESSING_FAILED), m(!1);
|
|
224
251
|
}, e);
|
|
225
252
|
return () => {
|
|
226
253
|
clearTimeout(o);
|
|
227
254
|
};
|
|
228
|
-
}, [
|
|
229
|
-
const
|
|
255
|
+
}, [n, t]);
|
|
256
|
+
const ce = (() => {
|
|
230
257
|
const e = s.payrollShow?.payrollStatusMeta;
|
|
231
258
|
if (e?.payrollLate && e.initialCheckDate && e.expectedDebitTime && e.expectedCheckDate)
|
|
232
259
|
return {
|
|
@@ -239,56 +266,67 @@ const Ye = ({
|
|
|
239
266
|
}),
|
|
240
267
|
variant: "warning"
|
|
241
268
|
};
|
|
242
|
-
const { payrollShow:
|
|
243
|
-
if (
|
|
269
|
+
const { payrollShow: r } = s, y = r?.employeeCompensations;
|
|
270
|
+
if (r && y && y.length > 0 && Re(y))
|
|
244
271
|
return {
|
|
245
272
|
label: p("alerts.directDepositDeadline", {
|
|
246
|
-
payDate: c.formatShortWithWeekday(
|
|
247
|
-
...c.formatWithTime(
|
|
273
|
+
payDate: c.formatShortWithWeekday(r.checkDate),
|
|
274
|
+
...c.formatWithTime(r.payrollDeadline)
|
|
248
275
|
}),
|
|
249
276
|
content: p("alerts.directDepositDeadlineText"),
|
|
250
277
|
variant: "info"
|
|
251
278
|
};
|
|
252
279
|
})();
|
|
253
|
-
return /* @__PURE__ */
|
|
254
|
-
|
|
255
|
-
|
|
280
|
+
return S ? /* @__PURE__ */ C(
|
|
281
|
+
Ee,
|
|
282
|
+
{
|
|
283
|
+
companyId: u,
|
|
284
|
+
payrollId: i,
|
|
285
|
+
onEvent: (o, r) => {
|
|
286
|
+
o === l.RUN_PAYROLL_CANCELLED && A(), t(o, r);
|
|
287
|
+
},
|
|
288
|
+
withReimbursements: T,
|
|
289
|
+
alerts: [_]
|
|
290
|
+
}
|
|
291
|
+
) : /* @__PURE__ */ fe(Ce, { children: [
|
|
292
|
+
/* @__PURE__ */ C(
|
|
293
|
+
De,
|
|
256
294
|
{
|
|
257
|
-
onCalculatePayroll:
|
|
258
|
-
isCalculateDisabled:
|
|
259
|
-
onEdit:
|
|
260
|
-
onToggleExclude:
|
|
261
|
-
onViewBlockers:
|
|
262
|
-
employeeCompensations:
|
|
263
|
-
employeeDetails:
|
|
264
|
-
payPeriod:
|
|
265
|
-
paySchedule:
|
|
295
|
+
onCalculatePayroll: ie,
|
|
296
|
+
isCalculateDisabled: Y.length > 0,
|
|
297
|
+
onEdit: ne,
|
|
298
|
+
onToggleExclude: ue,
|
|
299
|
+
onViewBlockers: pe,
|
|
300
|
+
employeeCompensations: b,
|
|
301
|
+
employeeDetails: I,
|
|
302
|
+
payPeriod: J,
|
|
303
|
+
paySchedule: Q,
|
|
266
304
|
payrollCategory: L,
|
|
267
|
-
alerts:
|
|
268
|
-
payrollAlert:
|
|
269
|
-
isPending:
|
|
270
|
-
isCalculating: g ||
|
|
271
|
-
payrollBlockers:
|
|
272
|
-
pagination:
|
|
273
|
-
withReimbursements:
|
|
274
|
-
grossUpEnabled:
|
|
275
|
-
onGrossUpSelect:
|
|
305
|
+
alerts: W,
|
|
306
|
+
payrollAlert: ce,
|
|
307
|
+
isPending: n || X || Z || g,
|
|
308
|
+
isCalculating: g || n,
|
|
309
|
+
payrollBlockers: le,
|
|
310
|
+
pagination: z,
|
|
311
|
+
withReimbursements: T,
|
|
312
|
+
grossUpEnabled: G,
|
|
313
|
+
onGrossUpSelect: oe
|
|
276
314
|
}
|
|
277
315
|
),
|
|
278
|
-
|
|
279
|
-
|
|
316
|
+
G && /* @__PURE__ */ C(
|
|
317
|
+
Be,
|
|
280
318
|
{
|
|
281
|
-
isOpen:
|
|
282
|
-
onCalculateGrossUp:
|
|
283
|
-
onApply:
|
|
319
|
+
isOpen: ee,
|
|
320
|
+
onCalculateGrossUp: te,
|
|
321
|
+
onApply: se,
|
|
284
322
|
onCancel: () => {
|
|
285
|
-
|
|
323
|
+
R(!1);
|
|
286
324
|
}
|
|
287
325
|
}
|
|
288
326
|
)
|
|
289
327
|
] });
|
|
290
328
|
};
|
|
291
329
|
export {
|
|
292
|
-
|
|
330
|
+
fo as PayrollConfiguration
|
|
293
331
|
};
|
|
294
332
|
//# sourceMappingURL=PayrollConfiguration.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PayrollConfiguration.js","sources":["../../../../src/components/Payroll/PayrollConfiguration/PayrollConfiguration.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { usePayrollsGetSuspense } from '@gusto/embedded-api/react-query/payrollsGet'\nimport { payrollsCalculate } from '@gusto/embedded-api/funcs/payrollsCalculate'\nimport { useGustoEmbeddedContext } from '@gusto/embedded-api/react-query/_context'\nimport type { PayrollProcessingRequest } from '@gusto/embedded-api/models/components/payrollprocessingrequest'\nimport { PayrollProcessingRequestStatus } from '@gusto/embedded-api/models/components/payrollprocessingrequest'\nimport type { Employee } from '@gusto/embedded-api/models/components/employee'\nimport { useTranslation } from 'react-i18next'\nimport { usePayrollsUpdateMutation } from '@gusto/embedded-api/react-query/payrollsUpdate'\nimport { usePayrollsCalculateGrossUpMutation } from '@gusto/embedded-api/react-query/payrollsCalculateGrossUp'\nimport type { PayrollEmployeeCompensationsType } from '@gusto/embedded-api/models/components/payrollemployeecompensationstype'\nimport type { PayrollUpdateEmployeeCompensations } from '@gusto/embedded-api/models/components/payrollupdate'\nimport { usePayrollsGetBlockersSuspense } from '@gusto/embedded-api/react-query/payrollsGetBlockers'\nimport { payrollSubmitHandler, type ApiPayrollBlocker } from '../PayrollBlocker/payrollHelpers'\nimport { hasDirectDepositEmployees } from '../helpers'\nimport { GrossUpModal } from '../GrossUpModal'\nimport { PayrollConfigurationPresentation } from './PayrollConfigurationPresentation'\nimport { usePayrollConfigurationData } from './usePayrollConfigurationData'\nimport { getGrossUpTargetCompensationName, isGrossUpEligible } from './grossUpHelpers'\nimport type { BaseComponentInterface } from '@/components/Base/Base'\nimport { BaseComponent } from '@/components/Base/Base'\nimport { componentEvents } from '@/shared/constants'\nimport { useComponentDictionary, useI18n } from '@/i18n'\nimport { useBase } from '@/components/Base'\nimport { useDateFormatter } from '@/hooks/useDateFormatter'\nimport { SDKInternalError } from '@/types/sdkError'\nimport { API_QUERY_NAMESPACE } from '@/contexts/ApiProvider/apiVersion'\n\nconst isCalculatingStatus = (processingRequest?: PayrollProcessingRequest | null) =>\n processingRequest?.status === PayrollProcessingRequestStatus.Calculating\n\nconst isCalculatedStatus = (\n processingRequest?: PayrollProcessingRequest | null,\n calculatedAt?: Date | null,\n) =>\n calculatedAt != null &&\n (processingRequest?.status === PayrollProcessingRequestStatus.CalculateSuccess ||\n processingRequest == null)\n\n/**\n * Props for {@link PayrollConfiguration}.\n *\n * @public\n */\nexport interface PayrollConfigurationProps extends BaseComponentInterface<'Payroll.PayrollConfiguration'> {\n /** The associated company identifier. */\n companyId: string\n /** The associated payroll identifier. */\n payrollId: string\n /** Optional alert components to render above the configuration content. */\n alerts?: ReactNode\n /** Whether to show the reimbursements column in the compensation table. Defaults to `true`. */\n withReimbursements?: boolean\n}\n\n/**\n * Handles the configuration phase of payroll processing, allowing users to review and modify employee compensation before calculating the payroll.\n *\n * @remarks\n * Emits the following events:\n *\n * @events\n * | Event | Description | Data |\n * | ----- | ----------- | ---- |\n * | `runPayroll/employee/edit` | An employee row is selected for editing | `{ employeeId, firstName, lastName }` |\n * | `runPayroll/employee/skip` | An employee is skipped or unskipped for this payroll | `{ employeeId }` |\n * | `runPayroll/employee/saved` | Employee compensation changes are persisted | `{ payrollPrepared }` |\n * | `runPayroll/calculated` | Payroll calculation completes successfully | `{ payrollId, alert, payPeriod }` |\n * | `runPayroll/processingFailed` | Payroll calculation fails or times out | — |\n * | `runPayroll/blockers/viewAll` | The \"view all blockers\" affordance is selected | — |\n * | `runPayroll/grossUp/selected` | The set-net-earnings menu item is selected for an employee | `{ employeeUuid }` |\n * | `runPayroll/grossUp/calculated` | A gross-up amount is calculated from a target net pay | `{ grossUp, netPay, employeeUuid }` |\n *\n * @param props - See {@link PayrollConfigurationProps}.\n * @returns The payroll configuration screen.\n * @public\n */\nexport function PayrollConfiguration(props: PayrollConfigurationProps) {\n return (\n <BaseComponent {...props}>\n <Root {...props}>{props.children}</Root>\n </BaseComponent>\n )\n}\n\nconst Root = ({\n onEvent,\n companyId,\n payrollId,\n dictionary,\n alerts,\n withReimbursements = true,\n}: PayrollConfigurationProps) => {\n useComponentDictionary('Payroll.PayrollConfiguration', dictionary)\n useI18n('Payroll.PayrollConfiguration')\n const { t } = useTranslation('Payroll.PayrollConfiguration')\n const { baseSubmitHandler } = useBase()\n const dateFormatter = useDateFormatter()\n\n const [isPolling, setIsPolling] = useState(false)\n const [isCalculatingPayroll, setIsCalculatingPayroll] = useState(false)\n const previousCalculatedAtRef = useRef<number | null>(null)\n const gustoClient = useGustoEmbeddedContext()\n const queryClient = useQueryClient()\n\n const { data: payrollData } = usePayrollsGetSuspense(\n {\n companyId,\n payrollId,\n include: ['taxes', 'benefits', 'deductions', 'payroll_status_meta'],\n },\n { refetchInterval: isPolling ? 5_000 : false },\n )\n\n const excludedEmployeeUuids = useMemo(\n () =>\n payrollData.payrollShow?.employeeCompensations\n ?.filter(comp => comp.excluded)\n .map(comp => comp.employeeUuid!)\n .filter(Boolean) ?? [],\n [payrollData.payrollShow?.employeeCompensations],\n )\n\n const {\n employeeDetails,\n employeeCompensations,\n paySchedule,\n payPeriod,\n payrollCategory,\n pagination,\n isLoading,\n refetch,\n } = usePayrollConfigurationData({\n companyId,\n payrollId,\n isCalculating: isPolling || isCalculatingPayroll,\n excludedEmployeeUuids,\n })\n\n const { mutateAsync: updatePayroll, isPending: isUpdatingPayroll } = usePayrollsUpdateMutation()\n\n const { mutateAsync: calculateGrossUpMutation } = usePayrollsCalculateGrossUpMutation()\n\n const [grossUpEmployeeUuid, setGrossUpEmployeeUuid] = useState<string | null>(null)\n const [isGrossUpModalOpen, setIsGrossUpModalOpen] = useState(false)\n\n const grossUpEnabled = isGrossUpEligible(payrollCategory)\n const grossUpTargetCompensation = getGrossUpTargetCompensationName(payrollCategory)\n\n const onGrossUpSelect = (employeeUuid: string) => {\n setGrossUpEmployeeUuid(employeeUuid)\n setIsGrossUpModalOpen(true)\n onEvent(componentEvents.RUN_PAYROLL_GROSS_UP_SELECTED, { employeeUuid })\n }\n\n const onCalculateGrossUp = async (netPay: number): Promise<string | null> => {\n if (!grossUpEmployeeUuid) return null\n let grossUp: string | null = null\n\n await baseSubmitHandler(null, async () => {\n const result = await calculateGrossUpMutation({\n request: {\n payrollUuid: payrollId,\n payrollGrossUpRequest: {\n employeeUuid: grossUpEmployeeUuid,\n netPay: netPay.toString(),\n },\n },\n })\n\n grossUp = result.payrollGrossUpResponse?.grossUp ?? null\n\n if (grossUp) {\n onEvent(componentEvents.RUN_PAYROLL_GROSS_UP_CALCULATED, {\n grossUp,\n netPay,\n employeeUuid: grossUpEmployeeUuid,\n })\n }\n })\n\n return grossUp\n }\n\n const onGrossUpApply = async (grossAmount: string) => {\n if (!grossUpEmployeeUuid || !grossUpTargetCompensation) {\n throw new SDKInternalError(\n 'Unable to apply gross-up: missing employee or target compensation.',\n )\n }\n\n const employeeComp = employeeCompensations.find(ec => ec.employeeUuid === grossUpEmployeeUuid)\n if (!employeeComp) {\n throw new SDKInternalError('Unable to apply gross-up: employee compensation not found.')\n }\n\n const existingFixed = employeeComp.fixedCompensations ?? []\n const hasTargetCompensation = existingFixed.some(\n fc => fc.name?.toLowerCase() === grossUpTargetCompensation.toLowerCase(),\n )\n\n const updatedFixedCompensations = existingFixed.map(fc => ({\n name: fc.name,\n jobUuid: fc.jobUuid,\n amount:\n fc.name?.toLowerCase() === grossUpTargetCompensation.toLowerCase() ? grossAmount : '0',\n }))\n\n if (!hasTargetCompensation) {\n const primaryJobUuid =\n employeeComp.hourlyCompensations?.[0]?.jobUuid ?? existingFixed[0]?.jobUuid ?? ''\n updatedFixedCompensations.push({\n name: grossUpTargetCompensation,\n jobUuid: primaryJobUuid,\n amount: grossAmount,\n })\n }\n\n const updatedHourlyCompensations = (employeeComp.hourlyCompensations ?? []).map(hc => ({\n name: hc.name,\n jobUuid: hc.jobUuid,\n hours: '0',\n }))\n\n const updatedPaidTimeOff = (employeeComp.paidTimeOff ?? []).map(pto => ({\n name: pto.name,\n hours: '0',\n }))\n\n const transformedCompensation = transformEmployeeCompensation({\n ...employeeComp,\n fixedCompensations: updatedFixedCompensations,\n hourlyCompensations: updatedHourlyCompensations,\n paidTimeOff: updatedPaidTimeOff,\n })\n\n await baseSubmitHandler({}, async () => {\n const result = await updatePayroll({\n request: {\n companyId,\n payrollId,\n payrollUpdate: {\n employeeCompensations: [{ ...transformedCompensation, excluded: false }],\n },\n },\n })\n onEvent(componentEvents.RUN_PAYROLL_EMPLOYEE_SAVED, {\n payrollPrepared: result.payrollPrepared,\n })\n await refetch()\n })\n\n setGrossUpEmployeeUuid(null)\n setIsGrossUpModalOpen(false)\n }\n\n const handleGrossUpApply = async (grossAmount: string) => {\n try {\n await onGrossUpApply(grossAmount)\n } catch {\n // Modal stays open; error is surfaced by baseSubmitHandler\n }\n }\n\n const { data: blockersData } = usePayrollsGetBlockersSuspense({\n companyUuid: companyId,\n })\n\n const payrollBlockerList = blockersData.payrollBlockers ?? []\n\n const blockersFromApi: ApiPayrollBlocker[] = payrollBlockerList.map(blocker => ({\n key: blocker.key,\n message: blocker.message,\n }))\n\n const [payrollBlockers, setPayrollBlockers] = useState(blockersFromApi)\n\n const onCalculatePayroll = async () => {\n setPayrollBlockers([])\n previousCalculatedAtRef.current = payrollData.payrollShow?.calculatedAt?.getTime() ?? null\n\n await baseSubmitHandler({}, async () => {\n const result = await payrollSubmitHandler(async () => {\n setIsCalculatingPayroll(true)\n try {\n const calcResult = await payrollsCalculate(gustoClient, {\n companyId,\n payrollId,\n })\n if (!calcResult.ok) {\n throw calcResult.error\n }\n // `payrollsCalculate` is a raw func, so it skips the global onSuccess\n // invalidation that mutation hooks get; invalidate here so cached payroll\n // reads (e.g. PayrollOverview's separate key) refetch fresh. SDK-1018.\n void queryClient.invalidateQueries({ queryKey: [API_QUERY_NAMESPACE] })\n setIsPolling(true)\n } finally {\n setIsCalculatingPayroll(false)\n }\n })\n\n if (!result.success && result.blockers.length > 0) {\n setPayrollBlockers(result.blockers)\n }\n })\n }\n\n const onEdit = (employee: Employee) => {\n onEvent(componentEvents.RUN_PAYROLL_EMPLOYEE_EDIT, {\n employeeId: employee.uuid,\n firstName: employee.firstName,\n lastName: employee.lastName,\n })\n }\n\n const transformEmployeeCompensation = (\n compensation: PayrollEmployeeCompensationsType,\n ): PayrollUpdateEmployeeCompensations => {\n const { paymentMethod } = compensation\n return {\n employeeUuid: compensation.employeeUuid,\n version: compensation.version,\n excluded: compensation.excluded,\n fixedCompensations: compensation.fixedCompensations,\n hourlyCompensations: compensation.hourlyCompensations,\n paidTimeOff: compensation.paidTimeOff,\n deductions: compensation.deductions,\n ...(paymentMethod && paymentMethod !== 'Historical' ? { paymentMethod } : {}),\n memo: compensation.memo || undefined,\n }\n }\n\n const onToggleExclude = async (employeeCompensation: PayrollEmployeeCompensationsType) => {\n onEvent(componentEvents.RUN_PAYROLL_EMPLOYEE_SKIP, {\n employeeId: employeeCompensation.employeeUuid,\n })\n await baseSubmitHandler({}, async () => {\n const transformedCompensation = transformEmployeeCompensation(employeeCompensation)\n const result = await updatePayroll({\n request: {\n companyId,\n payrollId,\n payrollUpdate: {\n employeeCompensations: [\n { ...transformedCompensation, excluded: !transformedCompensation.excluded },\n ],\n },\n },\n })\n onEvent(componentEvents.RUN_PAYROLL_EMPLOYEE_SAVED, {\n payrollPrepared: result.payrollPrepared,\n })\n await refetch()\n })\n }\n\n const onViewBlockers = () => {\n onEvent(componentEvents.RUN_PAYROLL_BLOCKERS_VIEW_ALL)\n }\n\n useEffect(() => {\n if (isCalculatingStatus(payrollData.payrollShow?.processingRequest) && !isPolling) {\n previousCalculatedAtRef.current = payrollData.payrollShow?.calculatedAt?.getTime() ?? null\n setIsPolling(true)\n }\n const currentCalculatedAt = payrollData.payrollShow?.calculatedAt\n const isNewCalculation = currentCalculatedAt?.getTime() !== previousCalculatedAtRef.current\n if (\n isPolling &&\n isNewCalculation &&\n isCalculatedStatus(payrollData.payrollShow?.processingRequest, currentCalculatedAt)\n ) {\n onEvent(componentEvents.RUN_PAYROLL_CALCULATED, {\n payrollId,\n alert: {\n type: 'success',\n title: t('alerts.progressSaved'),\n alertKey: 'progressSaved',\n },\n payPeriod: payrollData.payrollShow?.payPeriod,\n })\n setPayrollBlockers([])\n setIsPolling(false)\n }\n if (\n isPolling &&\n payrollData.payrollShow?.processingRequest?.status ===\n PayrollProcessingRequestStatus.ProcessingFailed\n ) {\n onEvent(componentEvents.RUN_PAYROLL_PROCESSING_FAILED)\n setIsPolling(false)\n }\n }, [\n payrollData.payrollShow?.processingRequest?.status,\n payrollData.payrollShow?.calculatedAt,\n isPolling,\n onEvent,\n t,\n payrollId,\n ])\n\n useEffect(() => {\n if (!isPolling) return\n\n const POLLING_TIMEOUT_MS = 3 * 60 * 1000\n const timeoutId = setTimeout(() => {\n onEvent(componentEvents.RUN_PAYROLL_PROCESSING_FAILED)\n setIsPolling(false)\n }, POLLING_TIMEOUT_MS)\n\n return () => {\n clearTimeout(timeoutId)\n }\n }, [isPolling, onEvent])\n\n const payrollAlert = (() => {\n const statusMeta = payrollData.payrollShow?.payrollStatusMeta\n\n const isLatePayroll =\n statusMeta?.payrollLate &&\n statusMeta.initialCheckDate &&\n statusMeta.expectedDebitTime &&\n statusMeta.expectedCheckDate\n\n if (isLatePayroll) {\n return {\n label: t('alerts.payrollLate', {\n initialCheckDate: dateFormatter.formatShortWithWeekday(statusMeta.initialCheckDate),\n }),\n content: t('alerts.payrollLateText', {\n ...dateFormatter.formatWithTime(statusMeta.expectedDebitTime),\n newCheckDate: dateFormatter.formatShortWithWeekday(statusMeta.expectedCheckDate),\n }),\n variant: 'warning' as const,\n }\n }\n\n const { payrollShow } = payrollData\n const allCompensations = payrollShow?.employeeCompensations\n\n if (\n payrollShow &&\n allCompensations &&\n allCompensations.length > 0 &&\n hasDirectDepositEmployees(allCompensations)\n ) {\n return {\n label: t('alerts.directDepositDeadline', {\n payDate: dateFormatter.formatShortWithWeekday(payrollShow.checkDate),\n ...dateFormatter.formatWithTime(payrollShow.payrollDeadline),\n }),\n content: t('alerts.directDepositDeadlineText'),\n variant: 'info' as const,\n }\n }\n\n return undefined\n })()\n\n return (\n <>\n <PayrollConfigurationPresentation\n onCalculatePayroll={onCalculatePayroll}\n isCalculateDisabled={blockersFromApi.length > 0}\n onEdit={onEdit}\n onToggleExclude={onToggleExclude}\n onViewBlockers={onViewBlockers}\n employeeCompensations={employeeCompensations}\n employeeDetails={employeeDetails}\n payPeriod={payPeriod}\n paySchedule={paySchedule}\n payrollCategory={payrollCategory}\n alerts={alerts}\n payrollAlert={payrollAlert}\n isPending={isPolling || isLoading || isUpdatingPayroll || isCalculatingPayroll}\n isCalculating={isCalculatingPayroll || isPolling}\n payrollBlockers={payrollBlockers}\n pagination={pagination}\n withReimbursements={withReimbursements}\n grossUpEnabled={grossUpEnabled}\n onGrossUpSelect={onGrossUpSelect}\n />\n {grossUpEnabled && (\n <GrossUpModal\n isOpen={isGrossUpModalOpen}\n onCalculateGrossUp={onCalculateGrossUp}\n onApply={handleGrossUpApply}\n onCancel={() => {\n setIsGrossUpModalOpen(false)\n }}\n />\n )}\n </>\n )\n}\n"],"names":["isCalculatingStatus","processingRequest","PayrollProcessingRequestStatus","isCalculatedStatus","calculatedAt","PayrollConfiguration","props","jsx","BaseComponent","Root","onEvent","companyId","payrollId","dictionary","alerts","withReimbursements","useComponentDictionary","useI18n","t","useTranslation","baseSubmitHandler","useBase","dateFormatter","useDateFormatter","isPolling","setIsPolling","useState","isCalculatingPayroll","setIsCalculatingPayroll","previousCalculatedAtRef","useRef","gustoClient","useGustoEmbeddedContext","queryClient","useQueryClient","payrollData","usePayrollsGetSuspense","excludedEmployeeUuids","useMemo","comp","employeeDetails","employeeCompensations","paySchedule","payPeriod","payrollCategory","pagination","isLoading","refetch","usePayrollConfigurationData","updatePayroll","isUpdatingPayroll","usePayrollsUpdateMutation","calculateGrossUpMutation","usePayrollsCalculateGrossUpMutation","grossUpEmployeeUuid","setGrossUpEmployeeUuid","isGrossUpModalOpen","setIsGrossUpModalOpen","grossUpEnabled","isGrossUpEligible","grossUpTargetCompensation","getGrossUpTargetCompensationName","onGrossUpSelect","employeeUuid","componentEvents","onCalculateGrossUp","netPay","grossUp","onGrossUpApply","grossAmount","SDKInternalError","employeeComp","ec","existingFixed","hasTargetCompensation","fc","updatedFixedCompensations","primaryJobUuid","updatedHourlyCompensations","hc","updatedPaidTimeOff","pto","transformedCompensation","transformEmployeeCompensation","result","handleGrossUpApply","blockersData","usePayrollsGetBlockersSuspense","blockersFromApi","blocker","payrollBlockers","setPayrollBlockers","onCalculatePayroll","payrollSubmitHandler","calcResult","payrollsCalculate","API_QUERY_NAMESPACE","onEdit","employee","compensation","paymentMethod","onToggleExclude","employeeCompensation","onViewBlockers","useEffect","currentCalculatedAt","isNewCalculation","POLLING_TIMEOUT_MS","timeoutId","payrollAlert","statusMeta","payrollShow","allCompensations","hasDirectDepositEmployees","jsxs","Fragment","PayrollConfigurationPresentation","GrossUpModal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PayrollConfiguration.js","sources":["../../../../src/components/Payroll/PayrollConfiguration/PayrollConfiguration.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { usePayrollsGetSuspense } from '@gusto/embedded-api/react-query/payrollsGet'\nimport { payrollsCalculate } from '@gusto/embedded-api/funcs/payrollsCalculate'\nimport { useGustoEmbeddedContext } from '@gusto/embedded-api/react-query/_context'\nimport type { PayrollProcessingRequest } from '@gusto/embedded-api/models/components/payrollprocessingrequest'\nimport { PayrollProcessingRequestStatus } from '@gusto/embedded-api/models/components/payrollprocessingrequest'\nimport type { Employee } from '@gusto/embedded-api/models/components/employee'\nimport { useTranslation } from 'react-i18next'\nimport { usePayrollsUpdateMutation } from '@gusto/embedded-api/react-query/payrollsUpdate'\nimport { usePayrollsCalculateGrossUpMutation } from '@gusto/embedded-api/react-query/payrollsCalculateGrossUp'\nimport type { PayrollEmployeeCompensationsType } from '@gusto/embedded-api/models/components/payrollemployeecompensationstype'\nimport type { PayrollUpdateEmployeeCompensations } from '@gusto/embedded-api/models/components/payrollupdate'\nimport { usePayrollsGetBlockersSuspense } from '@gusto/embedded-api/react-query/payrollsGetBlockers'\nimport { payrollSubmitHandler, type ApiPayrollBlocker } from '../PayrollBlocker/payrollHelpers'\nimport { hasDirectDepositEmployees } from '../helpers'\nimport { GrossUpModal } from '../GrossUpModal'\nimport { PayrollOverview } from '../PayrollOverview/PayrollOverview'\nimport type { PayrollFlowAlert } from '../PayrollFlow/PayrollFlowComponents'\nimport { PayrollConfigurationPresentation } from './PayrollConfigurationPresentation'\nimport { usePayrollConfigurationData } from './usePayrollConfigurationData'\nimport { getGrossUpTargetCompensationName, isGrossUpEligible } from './grossUpHelpers'\nimport type { BaseComponentInterface } from '@/components/Base/Base'\nimport { BaseComponent } from '@/components/Base/Base'\nimport { componentEvents, type EventType } from '@/shared/constants'\nimport { useComponentDictionary, useI18n } from '@/i18n'\nimport { useBase } from '@/components/Base'\nimport { useDateFormatter } from '@/hooks/useDateFormatter'\nimport { SDKInternalError } from '@/types/sdkError'\nimport { API_QUERY_NAMESPACE } from '@/contexts/ApiProvider/apiVersion'\n\nconst isCalculatingStatus = (processingRequest?: PayrollProcessingRequest | null) =>\n processingRequest?.status === PayrollProcessingRequestStatus.Calculating\n\nconst isCalculatedStatus = (\n processingRequest?: PayrollProcessingRequest | null,\n calculatedAt?: Date | null,\n) =>\n calculatedAt != null &&\n (processingRequest?.status === PayrollProcessingRequestStatus.CalculateSuccess ||\n processingRequest == null)\n\n/**\n * Props for {@link PayrollConfiguration}.\n *\n * @public\n */\nexport interface PayrollConfigurationProps extends BaseComponentInterface<'Payroll.PayrollConfiguration'> {\n /** The associated company identifier. */\n companyId: string\n /** The associated payroll identifier. */\n payrollId: string\n /** Optional alert components to render above the configuration content. */\n alerts?: ReactNode\n /** Whether to show the reimbursements column in the compensation table. Defaults to `true`. */\n withReimbursements?: boolean\n}\n\n/**\n * Handles the configuration phase of payroll processing, allowing users to review and modify employee compensation before calculating the payroll.\n *\n * @remarks\n * If the payroll turns out to already be processed (e.g. another actor submitted it while this\n * screen was open), this component emits `runPayroll/alreadyProcessed` and then renders\n * {@link PayrollOverview} in its place — the read-only breakdown with the gated \"Cancel payroll\"\n * action — instead of the configuration table. Events from that delegated view (e.g.\n * `runPayroll/cancelled`) are emitted through this component's own `onEvent`.\n *\n * Emits the following events:\n *\n * @events\n * | Event | Description | Data |\n * | ----- | ----------- | ---- |\n * | `runPayroll/employee/edit` | An employee row is selected for editing | `{ employeeId, firstName, lastName }` |\n * | `runPayroll/employee/skip` | An employee is skipped or unskipped for this payroll | `{ employeeId }` |\n * | `runPayroll/employee/saved` | Employee compensation changes are persisted | `{ payrollPrepared }` |\n * | `runPayroll/calculated` | Payroll calculation completes successfully | `{ payrollId, alert, payPeriod }` |\n * | `runPayroll/alreadyProcessed` | The payroll turns out to already be processed while configuring it | `{ payrollId, alert, payPeriod }` |\n * | `runPayroll/processingFailed` | Payroll calculation fails or times out | — |\n * | `runPayroll/blockers/viewAll` | The \"view all blockers\" affordance is selected | — |\n * | `runPayroll/grossUp/selected` | The set-net-earnings menu item is selected for an employee | `{ employeeUuid }` |\n * | `runPayroll/grossUp/calculated` | A gross-up amount is calculated from a target net pay | `{ grossUp, netPay, employeeUuid }` |\n *\n * @param props - See {@link PayrollConfigurationProps}.\n * @returns The payroll configuration screen.\n * @public\n */\nexport function PayrollConfiguration(props: PayrollConfigurationProps) {\n return (\n <BaseComponent {...props}>\n <Root {...props}>{props.children}</Root>\n </BaseComponent>\n )\n}\n\nconst Root = ({\n onEvent,\n companyId,\n payrollId,\n dictionary,\n alerts,\n withReimbursements = true,\n}: PayrollConfigurationProps) => {\n useComponentDictionary('Payroll.PayrollConfiguration', dictionary)\n useI18n('Payroll.PayrollConfiguration')\n const { t } = useTranslation('Payroll.PayrollConfiguration')\n const { baseSubmitHandler } = useBase()\n const dateFormatter = useDateFormatter()\n\n const [isPolling, setIsPolling] = useState(false)\n const [isCalculatingPayroll, setIsCalculatingPayroll] = useState(false)\n const previousCalculatedAtRef = useRef<number | null>(null)\n const gustoClient = useGustoEmbeddedContext()\n const queryClient = useQueryClient()\n\n const { data: payrollData } = usePayrollsGetSuspense(\n {\n companyId,\n payrollId,\n include: ['taxes', 'benefits', 'deductions', 'payroll_status_meta'],\n },\n { refetchInterval: isPolling ? 5_000 : false },\n )\n\n const excludedEmployeeUuids = useMemo(\n () =>\n payrollData.payrollShow?.employeeCompensations\n ?.filter(comp => comp.excluded)\n .map(comp => comp.employeeUuid!)\n .filter(Boolean) ?? [],\n [payrollData.payrollShow?.employeeCompensations],\n )\n\n const {\n employeeDetails,\n employeeCompensations,\n paySchedule,\n payPeriod,\n payrollCategory,\n pagination,\n isLoading,\n isAlreadyProcessed,\n refetch,\n } = usePayrollConfigurationData({\n companyId,\n payrollId,\n isCalculating: isPolling || isCalculatingPayroll,\n excludedEmployeeUuids,\n })\n\n const alreadyProcessedAlert: PayrollFlowAlert = useMemo(\n () => ({\n type: 'error',\n title: t('alerts.alreadyProcessed'),\n alertKey: 'alreadyProcessed',\n }),\n [t],\n )\n\n const hasFiredAlreadyProcessedRef = useRef(false)\n\n useEffect(() => {\n if (!isAlreadyProcessed) {\n hasFiredAlreadyProcessedRef.current = false\n return\n }\n if (hasFiredAlreadyProcessedRef.current) return\n hasFiredAlreadyProcessedRef.current = true\n onEvent(componentEvents.RUN_PAYROLL_ALREADY_PROCESSED, {\n payrollId,\n alert: alreadyProcessedAlert,\n payPeriod: payrollData.payrollShow?.payPeriod,\n })\n }, [\n isAlreadyProcessed,\n onEvent,\n payrollId,\n alreadyProcessedAlert,\n payrollData.payrollShow?.payPeriod,\n ])\n\n const { mutateAsync: updatePayroll, isPending: isUpdatingPayroll } = usePayrollsUpdateMutation()\n\n const { mutateAsync: calculateGrossUpMutation } = usePayrollsCalculateGrossUpMutation()\n\n const [grossUpEmployeeUuid, setGrossUpEmployeeUuid] = useState<string | null>(null)\n const [isGrossUpModalOpen, setIsGrossUpModalOpen] = useState(false)\n\n const grossUpEnabled = isGrossUpEligible(payrollCategory)\n const grossUpTargetCompensation = getGrossUpTargetCompensationName(payrollCategory)\n\n const onGrossUpSelect = (employeeUuid: string) => {\n setGrossUpEmployeeUuid(employeeUuid)\n setIsGrossUpModalOpen(true)\n onEvent(componentEvents.RUN_PAYROLL_GROSS_UP_SELECTED, { employeeUuid })\n }\n\n const onCalculateGrossUp = async (netPay: number): Promise<string | null> => {\n if (!grossUpEmployeeUuid) return null\n let grossUp: string | null = null\n\n await baseSubmitHandler(null, async () => {\n const result = await calculateGrossUpMutation({\n request: {\n payrollUuid: payrollId,\n payrollGrossUpRequest: {\n employeeUuid: grossUpEmployeeUuid,\n netPay: netPay.toString(),\n },\n },\n })\n\n grossUp = result.payrollGrossUpResponse?.grossUp ?? null\n\n if (grossUp) {\n onEvent(componentEvents.RUN_PAYROLL_GROSS_UP_CALCULATED, {\n grossUp,\n netPay,\n employeeUuid: grossUpEmployeeUuid,\n })\n }\n })\n\n return grossUp\n }\n\n const onGrossUpApply = async (grossAmount: string) => {\n if (!grossUpEmployeeUuid || !grossUpTargetCompensation) {\n throw new SDKInternalError(\n 'Unable to apply gross-up: missing employee or target compensation.',\n )\n }\n\n const employeeComp = employeeCompensations.find(ec => ec.employeeUuid === grossUpEmployeeUuid)\n if (!employeeComp) {\n throw new SDKInternalError('Unable to apply gross-up: employee compensation not found.')\n }\n\n const existingFixed = employeeComp.fixedCompensations ?? []\n const hasTargetCompensation = existingFixed.some(\n fc => fc.name?.toLowerCase() === grossUpTargetCompensation.toLowerCase(),\n )\n\n const updatedFixedCompensations = existingFixed.map(fc => ({\n name: fc.name,\n jobUuid: fc.jobUuid,\n amount:\n fc.name?.toLowerCase() === grossUpTargetCompensation.toLowerCase() ? grossAmount : '0',\n }))\n\n if (!hasTargetCompensation) {\n const primaryJobUuid =\n employeeComp.hourlyCompensations?.[0]?.jobUuid ?? existingFixed[0]?.jobUuid ?? ''\n updatedFixedCompensations.push({\n name: grossUpTargetCompensation,\n jobUuid: primaryJobUuid,\n amount: grossAmount,\n })\n }\n\n const updatedHourlyCompensations = (employeeComp.hourlyCompensations ?? []).map(hc => ({\n name: hc.name,\n jobUuid: hc.jobUuid,\n hours: '0',\n }))\n\n const updatedPaidTimeOff = (employeeComp.paidTimeOff ?? []).map(pto => ({\n name: pto.name,\n hours: '0',\n }))\n\n const transformedCompensation = transformEmployeeCompensation({\n ...employeeComp,\n fixedCompensations: updatedFixedCompensations,\n hourlyCompensations: updatedHourlyCompensations,\n paidTimeOff: updatedPaidTimeOff,\n })\n\n await baseSubmitHandler({}, async () => {\n const result = await updatePayroll({\n request: {\n companyId,\n payrollId,\n payrollUpdate: {\n employeeCompensations: [{ ...transformedCompensation, excluded: false }],\n },\n },\n })\n onEvent(componentEvents.RUN_PAYROLL_EMPLOYEE_SAVED, {\n payrollPrepared: result.payrollPrepared,\n })\n await refetch()\n })\n\n setGrossUpEmployeeUuid(null)\n setIsGrossUpModalOpen(false)\n }\n\n const handleGrossUpApply = async (grossAmount: string) => {\n try {\n await onGrossUpApply(grossAmount)\n } catch {\n // Modal stays open; error is surfaced by baseSubmitHandler\n }\n }\n\n const { data: blockersData } = usePayrollsGetBlockersSuspense({\n companyUuid: companyId,\n })\n\n const payrollBlockerList = blockersData.payrollBlockers ?? []\n\n const blockersFromApi: ApiPayrollBlocker[] = payrollBlockerList.map(blocker => ({\n key: blocker.key,\n message: blocker.message,\n }))\n\n const [payrollBlockers, setPayrollBlockers] = useState(blockersFromApi)\n\n const onCalculatePayroll = async () => {\n setPayrollBlockers([])\n previousCalculatedAtRef.current = payrollData.payrollShow?.calculatedAt?.getTime() ?? null\n\n await baseSubmitHandler({}, async () => {\n const result = await payrollSubmitHandler(async () => {\n setIsCalculatingPayroll(true)\n try {\n const calcResult = await payrollsCalculate(gustoClient, {\n companyId,\n payrollId,\n })\n if (!calcResult.ok) {\n throw calcResult.error\n }\n // `payrollsCalculate` is a raw func, so it skips the global onSuccess\n // invalidation that mutation hooks get; invalidate here so cached payroll\n // reads (e.g. PayrollOverview's separate key) refetch fresh. SDK-1018.\n void queryClient.invalidateQueries({ queryKey: [API_QUERY_NAMESPACE] })\n setIsPolling(true)\n } finally {\n setIsCalculatingPayroll(false)\n }\n })\n\n if (!result.success && result.blockers.length > 0) {\n setPayrollBlockers(result.blockers)\n }\n })\n }\n\n const onEdit = (employee: Employee) => {\n onEvent(componentEvents.RUN_PAYROLL_EMPLOYEE_EDIT, {\n employeeId: employee.uuid,\n firstName: employee.firstName,\n lastName: employee.lastName,\n })\n }\n\n const transformEmployeeCompensation = (\n compensation: PayrollEmployeeCompensationsType,\n ): PayrollUpdateEmployeeCompensations => {\n const { paymentMethod } = compensation\n return {\n employeeUuid: compensation.employeeUuid,\n version: compensation.version,\n excluded: compensation.excluded,\n fixedCompensations: compensation.fixedCompensations,\n hourlyCompensations: compensation.hourlyCompensations,\n paidTimeOff: compensation.paidTimeOff,\n deductions: compensation.deductions,\n ...(paymentMethod && paymentMethod !== 'Historical' ? { paymentMethod } : {}),\n memo: compensation.memo || undefined,\n }\n }\n\n const onToggleExclude = async (employeeCompensation: PayrollEmployeeCompensationsType) => {\n onEvent(componentEvents.RUN_PAYROLL_EMPLOYEE_SKIP, {\n employeeId: employeeCompensation.employeeUuid,\n })\n await baseSubmitHandler({}, async () => {\n const transformedCompensation = transformEmployeeCompensation(employeeCompensation)\n const result = await updatePayroll({\n request: {\n companyId,\n payrollId,\n payrollUpdate: {\n employeeCompensations: [\n { ...transformedCompensation, excluded: !transformedCompensation.excluded },\n ],\n },\n },\n })\n onEvent(componentEvents.RUN_PAYROLL_EMPLOYEE_SAVED, {\n payrollPrepared: result.payrollPrepared,\n })\n await refetch()\n })\n }\n\n const onViewBlockers = () => {\n onEvent(componentEvents.RUN_PAYROLL_BLOCKERS_VIEW_ALL)\n }\n\n useEffect(() => {\n if (isCalculatingStatus(payrollData.payrollShow?.processingRequest) && !isPolling) {\n previousCalculatedAtRef.current = payrollData.payrollShow?.calculatedAt?.getTime() ?? null\n setIsPolling(true)\n }\n const currentCalculatedAt = payrollData.payrollShow?.calculatedAt\n const isNewCalculation = currentCalculatedAt?.getTime() !== previousCalculatedAtRef.current\n if (\n isPolling &&\n isNewCalculation &&\n isCalculatedStatus(payrollData.payrollShow?.processingRequest, currentCalculatedAt)\n ) {\n onEvent(componentEvents.RUN_PAYROLL_CALCULATED, {\n payrollId,\n alert: {\n type: 'success',\n title: t('alerts.progressSaved'),\n alertKey: 'progressSaved',\n },\n payPeriod: payrollData.payrollShow?.payPeriod,\n })\n setPayrollBlockers([])\n setIsPolling(false)\n }\n if (\n isPolling &&\n payrollData.payrollShow?.processingRequest?.status ===\n PayrollProcessingRequestStatus.ProcessingFailed\n ) {\n onEvent(componentEvents.RUN_PAYROLL_PROCESSING_FAILED)\n setIsPolling(false)\n }\n }, [\n payrollData.payrollShow?.processingRequest?.status,\n payrollData.payrollShow?.calculatedAt,\n isPolling,\n onEvent,\n t,\n payrollId,\n ])\n\n useEffect(() => {\n if (!isPolling) return\n\n const POLLING_TIMEOUT_MS = 3 * 60 * 1000\n const timeoutId = setTimeout(() => {\n onEvent(componentEvents.RUN_PAYROLL_PROCESSING_FAILED)\n setIsPolling(false)\n }, POLLING_TIMEOUT_MS)\n\n return () => {\n clearTimeout(timeoutId)\n }\n }, [isPolling, onEvent])\n\n const payrollAlert = (() => {\n const statusMeta = payrollData.payrollShow?.payrollStatusMeta\n\n const isLatePayroll =\n statusMeta?.payrollLate &&\n statusMeta.initialCheckDate &&\n statusMeta.expectedDebitTime &&\n statusMeta.expectedCheckDate\n\n if (isLatePayroll) {\n return {\n label: t('alerts.payrollLate', {\n initialCheckDate: dateFormatter.formatShortWithWeekday(statusMeta.initialCheckDate),\n }),\n content: t('alerts.payrollLateText', {\n ...dateFormatter.formatWithTime(statusMeta.expectedDebitTime),\n newCheckDate: dateFormatter.formatShortWithWeekday(statusMeta.expectedCheckDate),\n }),\n variant: 'warning' as const,\n }\n }\n\n const { payrollShow } = payrollData\n const allCompensations = payrollShow?.employeeCompensations\n\n if (\n payrollShow &&\n allCompensations &&\n allCompensations.length > 0 &&\n hasDirectDepositEmployees(allCompensations)\n ) {\n return {\n label: t('alerts.directDepositDeadline', {\n payDate: dateFormatter.formatShortWithWeekday(payrollShow.checkDate),\n ...dateFormatter.formatWithTime(payrollShow.payrollDeadline),\n }),\n content: t('alerts.directDepositDeadlineText'),\n variant: 'info' as const,\n }\n }\n\n return undefined\n })()\n\n if (isAlreadyProcessed) {\n const onAlreadyProcessedOverviewEvent = (type: EventType, data?: unknown) => {\n if (type === componentEvents.RUN_PAYROLL_CANCELLED) {\n // Cancelling un-processes the payroll, making it editable again — re-run prepare so\n // this component drops back into the configuration table for the same payrollId.\n void refetch()\n }\n onEvent(type, data)\n }\n\n return (\n <PayrollOverview\n companyId={companyId}\n payrollId={payrollId}\n onEvent={onAlreadyProcessedOverviewEvent}\n withReimbursements={withReimbursements}\n alerts={[alreadyProcessedAlert]}\n />\n )\n }\n\n return (\n <>\n <PayrollConfigurationPresentation\n onCalculatePayroll={onCalculatePayroll}\n isCalculateDisabled={blockersFromApi.length > 0}\n onEdit={onEdit}\n onToggleExclude={onToggleExclude}\n onViewBlockers={onViewBlockers}\n employeeCompensations={employeeCompensations}\n employeeDetails={employeeDetails}\n payPeriod={payPeriod}\n paySchedule={paySchedule}\n payrollCategory={payrollCategory}\n alerts={alerts}\n payrollAlert={payrollAlert}\n isPending={isPolling || isLoading || isUpdatingPayroll || isCalculatingPayroll}\n isCalculating={isCalculatingPayroll || isPolling}\n payrollBlockers={payrollBlockers}\n pagination={pagination}\n withReimbursements={withReimbursements}\n grossUpEnabled={grossUpEnabled}\n onGrossUpSelect={onGrossUpSelect}\n />\n {grossUpEnabled && (\n <GrossUpModal\n isOpen={isGrossUpModalOpen}\n onCalculateGrossUp={onCalculateGrossUp}\n onApply={handleGrossUpApply}\n onCancel={() => {\n setIsGrossUpModalOpen(false)\n }}\n />\n )}\n </>\n )\n}\n"],"names":["isCalculatingStatus","processingRequest","PayrollProcessingRequestStatus","isCalculatedStatus","calculatedAt","PayrollConfiguration","props","jsx","BaseComponent","Root","onEvent","companyId","payrollId","dictionary","alerts","withReimbursements","useComponentDictionary","useI18n","t","useTranslation","baseSubmitHandler","useBase","dateFormatter","useDateFormatter","isPolling","setIsPolling","useState","isCalculatingPayroll","setIsCalculatingPayroll","previousCalculatedAtRef","useRef","gustoClient","useGustoEmbeddedContext","queryClient","useQueryClient","payrollData","usePayrollsGetSuspense","excludedEmployeeUuids","useMemo","comp","employeeDetails","employeeCompensations","paySchedule","payPeriod","payrollCategory","pagination","isLoading","isAlreadyProcessed","refetch","usePayrollConfigurationData","alreadyProcessedAlert","hasFiredAlreadyProcessedRef","useEffect","componentEvents","updatePayroll","isUpdatingPayroll","usePayrollsUpdateMutation","calculateGrossUpMutation","usePayrollsCalculateGrossUpMutation","grossUpEmployeeUuid","setGrossUpEmployeeUuid","isGrossUpModalOpen","setIsGrossUpModalOpen","grossUpEnabled","isGrossUpEligible","grossUpTargetCompensation","getGrossUpTargetCompensationName","onGrossUpSelect","employeeUuid","onCalculateGrossUp","netPay","grossUp","onGrossUpApply","grossAmount","SDKInternalError","employeeComp","ec","existingFixed","hasTargetCompensation","fc","updatedFixedCompensations","primaryJobUuid","updatedHourlyCompensations","hc","updatedPaidTimeOff","pto","transformedCompensation","transformEmployeeCompensation","result","handleGrossUpApply","blockersData","usePayrollsGetBlockersSuspense","blockersFromApi","blocker","payrollBlockers","setPayrollBlockers","onCalculatePayroll","payrollSubmitHandler","calcResult","payrollsCalculate","API_QUERY_NAMESPACE","onEdit","employee","compensation","paymentMethod","onToggleExclude","employeeCompensation","onViewBlockers","currentCalculatedAt","isNewCalculation","POLLING_TIMEOUT_MS","timeoutId","payrollAlert","statusMeta","payrollShow","allCompensations","hasDirectDepositEmployees","PayrollOverview","type","data","jsxs","Fragment","PayrollConfigurationPresentation","GrossUpModal"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,MAAMA,KAAsB,CAACC,MAC3BA,GAAmB,WAAWC,EAA+B,aAEzDC,KAAqB,CACzBF,GACAG,MAEAA,KAAgB,SACfH,GAAmB,WAAWC,EAA+B,oBAC5DD,KAAqB;AA+ClB,SAASI,GAAqBC,GAAkC;AACrE,SACE,gBAAAC,EAACC,IAAA,EAAe,GAAGF,GACjB,UAAA,gBAAAC,EAACE,MAAM,GAAGH,GAAQ,UAAAA,EAAM,SAAA,CAAS,EAAA,CACnC;AAEJ;AAEA,MAAMG,KAAO,CAAC;AAAA,EACZ,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,WAAAC;AAAA,EACA,YAAAC;AAAA,EACA,QAAAC;AAAA,EACA,oBAAAC,IAAqB;AACvB,MAAiC;AAC/B,EAAAC,GAAuB,gCAAgCH,CAAU,GACjEI,GAAQ,8BAA8B;AACtC,QAAM,EAAE,GAAAC,EAAA,IAAMC,GAAe,8BAA8B,GACrD,EAAE,mBAAAC,EAAA,IAAsBC,GAAA,GACxBC,IAAgBC,GAAA,GAEhB,CAACC,GAAWC,CAAY,IAAIC,EAAS,EAAK,GAC1C,CAACC,GAAsBC,CAAuB,IAAIF,EAAS,EAAK,GAChEG,IAA0BC,EAAsB,IAAI,GACpDC,IAAcC,GAAA,GACdC,IAAcC,GAAA,GAEd,EAAE,MAAMC,EAAA,IAAgBC;AAAA,IAC5B;AAAA,MACE,WAAAzB;AAAA,MACA,WAAAC;AAAA,MACA,SAAS,CAAC,SAAS,YAAY,cAAc,qBAAqB;AAAA,IAAA;AAAA,IAEpE,EAAE,iBAAiBY,IAAY,MAAQ,GAAA;AAAA,EAAM,GAGzCa,IAAwBC;AAAA,IAC5B,MACEH,EAAY,aAAa,uBACrB,OAAO,OAAQI,EAAK,QAAQ,EAC7B,IAAI,OAAQA,EAAK,YAAa,EAC9B,OAAO,OAAO,KAAK,CAAA;AAAA,IACxB,CAACJ,EAAY,aAAa,qBAAqB;AAAA,EAAA,GAG3C;AAAA,IACJ,iBAAAK;AAAA,IACA,uBAAAC;AAAA,IACA,aAAAC;AAAA,IACA,WAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,YAAAC;AAAA,IACA,WAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,SAAAC;AAAA,EAAA,IACEC,GAA4B;AAAA,IAC9B,WAAAtC;AAAA,IACA,WAAAC;AAAA,IACA,eAAeY,KAAaG;AAAA,IAC5B,uBAAAU;AAAA,EAAA,CACD,GAEKa,IAA0CZ;AAAA,IAC9C,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAOpB,EAAE,yBAAyB;AAAA,MAClC,UAAU;AAAA,IAAA;AAAA,IAEZ,CAACA,CAAC;AAAA,EAAA,GAGEiC,IAA8BrB,EAAO,EAAK;AAEhD,EAAAsB,EAAU,MAAM;AACd,QAAI,CAACL,GAAoB;AACvB,MAAAI,EAA4B,UAAU;AACtC;AAAA,IACF;AACA,IAAIA,EAA4B,YAChCA,EAA4B,UAAU,IACtCzC,EAAQ2C,EAAgB,+BAA+B;AAAA,MACrD,WAAAzC;AAAA,MACA,OAAOsC;AAAA,MACP,WAAWf,EAAY,aAAa;AAAA,IAAA,CACrC;AAAA,EACH,GAAG;AAAA,IACDY;AAAA,IACArC;AAAA,IACAE;AAAA,IACAsC;AAAA,IACAf,EAAY,aAAa;AAAA,EAAA,CAC1B;AAED,QAAM,EAAE,aAAamB,GAAe,WAAWC,EAAA,IAAsBC,GAAA,GAE/D,EAAE,aAAaC,EAAA,IAA6BC,GAAA,GAE5C,CAACC,GAAqBC,CAAsB,IAAIlC,EAAwB,IAAI,GAC5E,CAACmC,IAAoBC,CAAqB,IAAIpC,EAAS,EAAK,GAE5DqC,IAAiBC,GAAkBpB,CAAe,GAClDqB,IAA4BC,GAAiCtB,CAAe,GAE5EuB,KAAkB,CAACC,MAAyB;AAChD,IAAAR,EAAuBQ,CAAY,GACnCN,EAAsB,EAAI,GAC1BpD,EAAQ2C,EAAgB,+BAA+B,EAAE,cAAAe,EAAA,CAAc;AAAA,EACzE,GAEMC,KAAqB,OAAOC,MAA2C;AAC3E,QAAI,CAACX,EAAqB,QAAO;AACjC,QAAIY,IAAyB;AAE7B,iBAAMnD,EAAkB,MAAM,YAAY;AAWxC,MAAAmD,KAVe,MAAMd,EAAyB;AAAA,QAC5C,SAAS;AAAA,UACP,aAAa7C;AAAA,UACb,uBAAuB;AAAA,YACrB,cAAc+C;AAAA,YACd,QAAQW,EAAO,SAAA;AAAA,UAAS;AAAA,QAC1B;AAAA,MACF,CACD,GAEgB,wBAAwB,WAAW,MAEhDC,KACF7D,EAAQ2C,EAAgB,iCAAiC;AAAA,QACvD,SAAAkB;AAAA,QACA,QAAAD;AAAA,QACA,cAAcX;AAAA,MAAA,CACf;AAAA,IAEL,CAAC,GAEMY;AAAA,EACT,GAEMC,KAAiB,OAAOC,MAAwB;AACpD,QAAI,CAACd,KAAuB,CAACM;AAC3B,YAAM,IAAIS;AAAA,QACR;AAAA,MAAA;AAIJ,UAAMC,IAAelC,EAAsB,KAAK,CAAAmC,MAAMA,EAAG,iBAAiBjB,CAAmB;AAC7F,QAAI,CAACgB;AACH,YAAM,IAAID,EAAiB,4DAA4D;AAGzF,UAAMG,IAAgBF,EAAa,sBAAsB,CAAA,GACnDG,IAAwBD,EAAc;AAAA,MAC1C,OAAME,EAAG,MAAM,YAAA,MAAkBd,EAA0B,YAAA;AAAA,IAAY,GAGnEe,IAA4BH,EAAc,IAAI,CAAAE,OAAO;AAAA,MACzD,MAAMA,EAAG;AAAA,MACT,SAASA,EAAG;AAAA,MACZ,QACEA,EAAG,MAAM,YAAA,MAAkBd,EAA0B,YAAA,IAAgBQ,IAAc;AAAA,IAAA,EACrF;AAEF,QAAI,CAACK,GAAuB;AAC1B,YAAMG,IACJN,EAAa,sBAAsB,CAAC,GAAG,WAAWE,EAAc,CAAC,GAAG,WAAW;AACjF,MAAAG,EAA0B,KAAK;AAAA,QAC7B,MAAMf;AAAA,QACN,SAASgB;AAAA,QACT,QAAQR;AAAA,MAAA,CACT;AAAA,IACH;AAEA,UAAMS,MAA8BP,EAAa,uBAAuB,CAAA,GAAI,IAAI,CAAAQ,OAAO;AAAA,MACrF,MAAMA,EAAG;AAAA,MACT,SAASA,EAAG;AAAA,MACZ,OAAO;AAAA,IAAA,EACP,GAEIC,MAAsBT,EAAa,eAAe,CAAA,GAAI,IAAI,CAAAU,OAAQ;AAAA,MACtE,MAAMA,EAAI;AAAA,MACV,OAAO;AAAA,IAAA,EACP,GAEIC,KAA0BC,EAA8B;AAAA,MAC5D,GAAGZ;AAAA,MACH,oBAAoBK;AAAA,MACpB,qBAAqBE;AAAA,MACrB,aAAaE;AAAA,IAAA,CACd;AAED,UAAMhE,EAAkB,CAAA,GAAI,YAAY;AACtC,YAAMoE,IAAS,MAAMlC,EAAc;AAAA,QACjC,SAAS;AAAA,UACP,WAAA3C;AAAA,UACA,WAAAC;AAAA,UACA,eAAe;AAAA,YACb,uBAAuB,CAAC,EAAE,GAAG0E,IAAyB,UAAU,IAAO;AAAA,UAAA;AAAA,QACzE;AAAA,MACF,CACD;AACD,MAAA5E,EAAQ2C,EAAgB,4BAA4B;AAAA,QAClD,iBAAiBmC,EAAO;AAAA,MAAA,CACzB,GACD,MAAMxC,EAAA;AAAA,IACR,CAAC,GAEDY,EAAuB,IAAI,GAC3BE,EAAsB,EAAK;AAAA,EAC7B,GAEM2B,KAAqB,OAAOhB,MAAwB;AACxD,QAAI;AACF,YAAMD,GAAeC,CAAW;AAAA,IAClC,QAAQ;AAAA,IAER;AAAA,EACF,GAEM,EAAE,MAAMiB,GAAA,IAAiBC,GAA+B;AAAA,IAC5D,aAAahF;AAAA,EAAA,CACd,GAIKiF,KAFqBF,GAAa,mBAAmB,CAAA,GAEK,IAAI,CAAAG,OAAY;AAAA,IAC9E,KAAKA,EAAQ;AAAA,IACb,SAASA,EAAQ;AAAA,EAAA,EACjB,GAEI,CAACC,IAAiBC,CAAkB,IAAIrE,EAASkE,CAAe,GAEhEI,KAAqB,YAAY;AACrC,IAAAD,EAAmB,CAAA,CAAE,GACrBlE,EAAwB,UAAUM,EAAY,aAAa,cAAc,aAAa,MAEtF,MAAMf,EAAkB,CAAA,GAAI,YAAY;AACtC,YAAMoE,IAAS,MAAMS,GAAqB,YAAY;AACpD,QAAArE,EAAwB,EAAI;AAC5B,YAAI;AACF,gBAAMsE,IAAa,MAAMC,GAAkBpE,GAAa;AAAA,YACtD,WAAApB;AAAA,YACA,WAAAC;AAAA,UAAA,CACD;AACD,cAAI,CAACsF,EAAW;AACd,kBAAMA,EAAW;AAKnB,UAAKjE,EAAY,kBAAkB,EAAE,UAAU,CAACmE,EAAmB,GAAG,GACtE3E,EAAa,EAAI;AAAA,QACnB,UAAA;AACE,UAAAG,EAAwB,EAAK;AAAA,QAC/B;AAAA,MACF,CAAC;AAED,MAAI,CAAC4D,EAAO,WAAWA,EAAO,SAAS,SAAS,KAC9CO,EAAmBP,EAAO,QAAQ;AAAA,IAEtC,CAAC;AAAA,EACH,GAEMa,KAAS,CAACC,MAAuB;AACrC,IAAA5F,EAAQ2C,EAAgB,2BAA2B;AAAA,MACjD,YAAYiD,EAAS;AAAA,MACrB,WAAWA,EAAS;AAAA,MACpB,UAAUA,EAAS;AAAA,IAAA,CACpB;AAAA,EACH,GAEMf,IAAgC,CACpCgB,MACuC;AACvC,UAAM,EAAE,eAAAC,MAAkBD;AAC1B,WAAO;AAAA,MACL,cAAcA,EAAa;AAAA,MAC3B,SAASA,EAAa;AAAA,MACtB,UAAUA,EAAa;AAAA,MACvB,oBAAoBA,EAAa;AAAA,MACjC,qBAAqBA,EAAa;AAAA,MAClC,aAAaA,EAAa;AAAA,MAC1B,YAAYA,EAAa;AAAA,MACzB,GAAIC,KAAiBA,MAAkB,eAAe,EAAE,eAAAA,EAAA,IAAkB,CAAA;AAAA,MAC1E,MAAMD,EAAa,QAAQ;AAAA,IAAA;AAAA,EAE/B,GAEME,KAAkB,OAAOC,MAA2D;AACxF,IAAAhG,EAAQ2C,EAAgB,2BAA2B;AAAA,MACjD,YAAYqD,EAAqB;AAAA,IAAA,CAClC,GACD,MAAMtF,EAAkB,CAAA,GAAI,YAAY;AACtC,YAAMkE,IAA0BC,EAA8BmB,CAAoB,GAC5ElB,IAAS,MAAMlC,EAAc;AAAA,QACjC,SAAS;AAAA,UACP,WAAA3C;AAAA,UACA,WAAAC;AAAA,UACA,eAAe;AAAA,YACb,uBAAuB;AAAA,cACrB,EAAE,GAAG0E,GAAyB,UAAU,CAACA,EAAwB,SAAA;AAAA,YAAS;AAAA,UAC5E;AAAA,QACF;AAAA,MACF,CACD;AACD,MAAA5E,EAAQ2C,EAAgB,4BAA4B;AAAA,QAClD,iBAAiBmC,EAAO;AAAA,MAAA,CACzB,GACD,MAAMxC,EAAA;AAAA,IACR,CAAC;AAAA,EACH,GAEM2D,KAAiB,MAAM;AAC3B,IAAAjG,EAAQ2C,EAAgB,6BAA6B;AAAA,EACvD;AAEA,EAAAD,EAAU,MAAM;AACd,IAAIpD,GAAoBmC,EAAY,aAAa,iBAAiB,KAAK,CAACX,MACtEK,EAAwB,UAAUM,EAAY,aAAa,cAAc,aAAa,MACtFV,EAAa,EAAI;AAEnB,UAAMmF,IAAsBzE,EAAY,aAAa,cAC/C0E,IAAmBD,GAAqB,QAAA,MAAc/E,EAAwB;AACpF,IACEL,KACAqF,KACA1G,GAAmBgC,EAAY,aAAa,mBAAmByE,CAAmB,MAElFlG,EAAQ2C,EAAgB,wBAAwB;AAAA,MAC9C,WAAAzC;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAOM,EAAE,sBAAsB;AAAA,QAC/B,UAAU;AAAA,MAAA;AAAA,MAEZ,WAAWiB,EAAY,aAAa;AAAA,IAAA,CACrC,GACD4D,EAAmB,CAAA,CAAE,GACrBtE,EAAa,EAAK,IAGlBD,KACAW,EAAY,aAAa,mBAAmB,WAC1CjC,EAA+B,qBAEjCQ,EAAQ2C,EAAgB,6BAA6B,GACrD5B,EAAa,EAAK;AAAA,EAEtB,GAAG;AAAA,IACDU,EAAY,aAAa,mBAAmB;AAAA,IAC5CA,EAAY,aAAa;AAAA,IACzBX;AAAA,IACAd;AAAA,IACAQ;AAAA,IACAN;AAAA,EAAA,CACD,GAEDwC,EAAU,MAAM;AACd,QAAI,CAAC5B,EAAW;AAEhB,UAAMsF,IAAqB,MAAS,KAC9BC,IAAY,WAAW,MAAM;AACjC,MAAArG,EAAQ2C,EAAgB,6BAA6B,GACrD5B,EAAa,EAAK;AAAA,IACpB,GAAGqF,CAAkB;AAErB,WAAO,MAAM;AACX,mBAAaC,CAAS;AAAA,IACxB;AAAA,EACF,GAAG,CAACvF,GAAWd,CAAO,CAAC;AAEvB,QAAMsG,MAAgB,MAAM;AAC1B,UAAMC,IAAa9E,EAAY,aAAa;AAQ5C,QALE8E,GAAY,eACZA,EAAW,oBACXA,EAAW,qBACXA,EAAW;AAGX,aAAO;AAAA,QACL,OAAO/F,EAAE,sBAAsB;AAAA,UAC7B,kBAAkBI,EAAc,uBAAuB2F,EAAW,gBAAgB;AAAA,QAAA,CACnF;AAAA,QACD,SAAS/F,EAAE,0BAA0B;AAAA,UACnC,GAAGI,EAAc,eAAe2F,EAAW,iBAAiB;AAAA,UAC5D,cAAc3F,EAAc,uBAAuB2F,EAAW,iBAAiB;AAAA,QAAA,CAChF;AAAA,QACD,SAAS;AAAA,MAAA;AAIb,UAAM,EAAE,aAAAC,MAAgB/E,GAClBgF,IAAmBD,GAAa;AAEtC,QACEA,KACAC,KACAA,EAAiB,SAAS,KAC1BC,GAA0BD,CAAgB;AAE1C,aAAO;AAAA,QACL,OAAOjG,EAAE,gCAAgC;AAAA,UACvC,SAASI,EAAc,uBAAuB4F,EAAY,SAAS;AAAA,UACnE,GAAG5F,EAAc,eAAe4F,EAAY,eAAe;AAAA,QAAA,CAC5D;AAAA,QACD,SAAShG,EAAE,kCAAkC;AAAA,QAC7C,SAAS;AAAA,MAAA;AAAA,EAKf,GAAA;AAEA,SAAI6B,IAWA,gBAAAxC;AAAA,IAAC8G;AAAA,IAAA;AAAA,MACC,WAAA1G;AAAA,MACA,WAAAC;AAAA,MACA,SAboC,CAAC0G,GAAiBC,MAAmB;AAC3E,QAAID,MAASjE,EAAgB,yBAGtBL,EAAA,GAEPtC,EAAQ4G,GAAMC,CAAI;AAAA,MACpB;AAAA,MAOI,oBAAAxG;AAAA,MACA,QAAQ,CAACmC,CAAqB;AAAA,IAAA;AAAA,EAAA,IAMlC,gBAAAsE,GAAAC,IAAA,EACE,UAAA;AAAA,IAAA,gBAAAlH;AAAA,MAACmH;AAAA,MAAA;AAAA,QACC,oBAAA1B;AAAA,QACA,qBAAqBJ,EAAgB,SAAS;AAAA,QAC9C,QAAAS;AAAA,QACA,iBAAAI;AAAA,QACA,gBAAAE;AAAA,QACA,uBAAAlE;AAAA,QACA,iBAAAD;AAAA,QACA,WAAAG;AAAA,QACA,aAAAD;AAAA,QACA,iBAAAE;AAAA,QACA,QAAA9B;AAAA,QACA,cAAAkG;AAAA,QACA,WAAWxF,KAAasB,KAAaS,KAAqB5B;AAAA,QAC1D,eAAeA,KAAwBH;AAAA,QACvC,iBAAAsE;AAAA,QACA,YAAAjD;AAAA,QACA,oBAAA9B;AAAA,QACA,gBAAAgD;AAAA,QACA,iBAAAI;AAAA,MAAA;AAAA,IAAA;AAAA,IAEDJ,KACC,gBAAAxD;AAAA,MAACoH;AAAA,MAAA;AAAA,QACC,QAAQ9D;AAAA,QACR,oBAAAQ;AAAA,QACA,SAASoB;AAAA,QACT,UAAU,MAAM;AACd,UAAA3B,EAAsB,EAAK;AAAA,QAC7B;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GAEJ;AAEJ;"}
|