@gusto/embedded-react-sdk 0.56.0 → 0.56.1

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.
Files changed (109) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/components/Payroll/OffCycle/OffCycleFlow.js.map +1 -1
  3. package/dist/components/Payroll/OffCycle/OffCycleFlowComponents.js +24 -18
  4. package/dist/components/Payroll/OffCycle/OffCycleFlowComponents.js.map +1 -1
  5. package/dist/components/Payroll/OffCycle/offCycleStateMachine.js +39 -21
  6. package/dist/components/Payroll/OffCycle/offCycleStateMachine.js.map +1 -1
  7. package/dist/components/Payroll/OffCycleCreation/OffCycleCreation.js +85 -82
  8. package/dist/components/Payroll/OffCycleCreation/OffCycleCreation.js.map +1 -1
  9. package/dist/components/Payroll/OffCycleCreation/OffCycleCreationPresentation.js +52 -51
  10. package/dist/components/Payroll/OffCycleCreation/OffCycleCreationPresentation.js.map +1 -1
  11. package/dist/components/Payroll/PayrollBlocker/components/PayrollBlockerAlerts.js +12 -12
  12. package/dist/components/Payroll/PayrollBlocker/components/PayrollBlockerAlerts.js.map +1 -1
  13. package/dist/components/Payroll/PayrollBlocker/components/PayrollBlockerList.js +40 -40
  14. package/dist/components/Payroll/PayrollBlocker/components/PayrollBlockerList.js.map +1 -1
  15. package/dist/components/Payroll/PayrollConfiguration/PayrollConfiguration.js +26 -25
  16. package/dist/components/Payroll/PayrollConfiguration/PayrollConfiguration.js.map +1 -1
  17. package/dist/components/Payroll/PayrollEditEmployee/PayrollEditEmployeePresentation.js +13 -16
  18. package/dist/components/Payroll/PayrollEditEmployee/PayrollEditEmployeePresentation.js.map +1 -1
  19. package/dist/components/Payroll/PayrollEditEmployee/TimeOffField.js +0 -1
  20. package/dist/components/Payroll/PayrollEditEmployee/TimeOffField.js.map +1 -1
  21. package/dist/components/Payroll/PayrollEditEmployee/shared/usePayrollEditEmployeeForm/payrollEditEmployeeHelpers.js +138 -110
  22. package/dist/components/Payroll/PayrollEditEmployee/shared/usePayrollEditEmployeeForm/payrollEditEmployeeHelpers.js.map +1 -1
  23. package/dist/components/Payroll/PayrollEditEmployee/shared/usePayrollEditEmployeeForm/usePayrollEditEmployeeForm.js +149 -146
  24. package/dist/components/Payroll/PayrollEditEmployee/shared/usePayrollEditEmployeeForm/usePayrollEditEmployeeForm.js.map +1 -1
  25. package/dist/components/Payroll/PayrollExecutionFlow/PayrollExecutionFlow.js.map +1 -1
  26. package/dist/components/Payroll/PayrollExecutionFlow/payrollExecutionMachine.js +4 -0
  27. package/dist/components/Payroll/PayrollExecutionFlow/payrollExecutionMachine.js.map +1 -1
  28. package/dist/components/Payroll/PayrollFlow/PayrollFlow.js.map +1 -1
  29. package/dist/components/Payroll/PayrollFlow/TransitionFlowContextual.js +22 -35
  30. package/dist/components/Payroll/PayrollFlow/TransitionFlowContextual.js.map +1 -1
  31. package/dist/components/Payroll/Transition/TransitionFlow.js +49 -36
  32. package/dist/components/Payroll/Transition/TransitionFlow.js.map +1 -1
  33. package/dist/components/Payroll/Transition/TransitionFlowComponents.js +24 -47
  34. package/dist/components/Payroll/Transition/TransitionFlowComponents.js.map +1 -1
  35. package/dist/components/Payroll/Transition/transitionStateMachine.js +35 -40
  36. package/dist/components/Payroll/Transition/transitionStateMachine.js.map +1 -1
  37. package/dist/components/Payroll/TransitionPayroll/TransitionPayroll.js +48 -0
  38. package/dist/components/Payroll/TransitionPayroll/TransitionPayroll.js.map +1 -0
  39. package/dist/components/Payroll/TransitionPayroll/TransitionPayrollComponents.js +35 -0
  40. package/dist/components/Payroll/TransitionPayroll/TransitionPayrollComponents.js.map +1 -0
  41. package/dist/components/Payroll/TransitionPayroll/transitionPayrollStateMachine.js +23 -0
  42. package/dist/components/Payroll/TransitionPayroll/transitionPayrollStateMachine.js.map +1 -0
  43. package/dist/components/Payroll/TransitionPayroll/useResolveTransitionPayroll.js +32 -0
  44. package/dist/components/Payroll/TransitionPayroll/useResolveTransitionPayroll.js.map +1 -0
  45. package/dist/components/Payroll/index.js +7 -5
  46. package/dist/components/Payroll/index.js.map +1 -1
  47. package/dist/i18n/I18n.js +9 -4
  48. package/dist/i18n/I18n.js.map +1 -1
  49. package/dist/i18n/en/Payroll.PayrollBlocker.json.js +10 -8
  50. package/dist/i18n/en/Payroll.PayrollBlocker.json.js.map +1 -1
  51. package/dist/i18n/es_US/Company.StateTaxes.json.js +1 -1
  52. package/dist/i18n/es_US/Contractor.ContractorList.json.js +14 -12
  53. package/dist/i18n/es_US/Contractor.ContractorList.json.js.map +1 -1
  54. package/dist/i18n/es_US/Contractor.Management.Compensation.json.js +4 -4
  55. package/dist/i18n/es_US/Contractor.Management.Profile.json.js +4 -4
  56. package/dist/i18n/es_US/Contractor.ManagementContractorList.json.js +40 -38
  57. package/dist/i18n/es_US/Contractor.ManagementContractorList.json.js.map +1 -1
  58. package/dist/i18n/es_US/Contractor.Payments.PaymentsList.json.js +18 -16
  59. package/dist/i18n/es_US/Contractor.Payments.PaymentsList.json.js.map +1 -1
  60. package/dist/i18n/es_US/Contractor.Profile.json.js +5 -5
  61. package/dist/i18n/es_US/Payroll.OffCycleCreation.json.js +11 -9
  62. package/dist/i18n/es_US/Payroll.OffCycleCreation.json.js.map +1 -1
  63. package/dist/i18n/es_US/Payroll.OffCyclePayPeriodDateForm.json.js +2 -2
  64. package/dist/i18n/es_US/Payroll.OffCycleTaxWithholding.json.js +6 -6
  65. package/dist/i18n/es_US/Payroll.PayrollConfiguration.json.js +15 -15
  66. package/dist/i18n/es_US/Payroll.PayrollEditEmployee.json.js +28 -26
  67. package/dist/i18n/es_US/Payroll.PayrollEditEmployee.json.js.map +1 -1
  68. package/dist/i18n/es_US/Payroll.PayrollOverview.json.js +40 -38
  69. package/dist/i18n/es_US/Payroll.PayrollOverview.json.js.map +1 -1
  70. package/dist/i18n/es_US/Payroll.PrintChecksBanner.json.js +14 -0
  71. package/dist/i18n/es_US/Payroll.PrintChecksBanner.json.js.map +1 -0
  72. package/dist/i18n/es_US/Payroll.PrintChecksFailure.json.js +12 -0
  73. package/dist/i18n/es_US/Payroll.PrintChecksFailure.json.js.map +1 -0
  74. package/dist/i18n/es_US/Payroll.PrintChecksForm.json.js +26 -0
  75. package/dist/i18n/es_US/Payroll.PrintChecksForm.json.js.map +1 -0
  76. package/dist/i18n/es_US/Payroll.PrintChecksSummary.json.js +14 -0
  77. package/dist/i18n/es_US/Payroll.PrintChecksSummary.json.js.map +1 -0
  78. package/dist/i18n/es_US/Payroll.UNSTABLE_PayrollEditEmployee.json.js +78 -0
  79. package/dist/i18n/es_US/Payroll.UNSTABLE_PayrollEditEmployee.json.js.map +1 -0
  80. package/dist/i18n/es_US/common.json.js +1 -1
  81. package/dist/package.json.js +1 -1
  82. package/dist/shared/constants.js +21 -20
  83. package/dist/shared/constants.js.map +1 -1
  84. package/dist/src/components/Payroll/OffCycle/OffCycleFlow.d.ts +2 -0
  85. package/dist/src/components/Payroll/OffCycle/OffCycleFlowComponents.d.ts +2 -0
  86. package/dist/src/components/Payroll/OffCycle/offCycleStateMachine.d.ts +1 -0
  87. package/dist/src/components/Payroll/OffCycleCreation/OffCycleCreation.d.ts +1 -0
  88. package/dist/src/components/Payroll/OffCycleCreation/OffCycleCreationPresentation.d.ts +1 -1
  89. package/dist/src/components/Payroll/OffCycleCreation/OffCycleCreationTypes.d.ts +5 -0
  90. package/dist/src/components/Payroll/PayrollConfiguration/PayrollConfiguration.d.ts +1 -1
  91. package/dist/src/components/Payroll/PayrollEditEmployee/shared/usePayrollEditEmployeeForm/payrollEditEmployeeHelpers.d.ts +18 -0
  92. package/dist/src/components/Payroll/PayrollExecutionFlow/PayrollExecutionFlow.d.ts +1 -1
  93. package/dist/src/components/Payroll/PayrollExecutionFlow/payrollExecutionMachine.d.ts +8 -0
  94. package/dist/src/components/Payroll/PayrollFlow/PayrollFlow.d.ts +1 -1
  95. package/dist/src/components/Payroll/PayrollFlow/TransitionFlowContextual.d.ts +6 -1
  96. package/dist/src/components/Payroll/Transition/TransitionFlow.d.ts +17 -15
  97. package/dist/src/components/Payroll/Transition/TransitionFlowComponents.d.ts +21 -12
  98. package/dist/src/components/Payroll/Transition/transitionStateMachine.d.ts +25 -4
  99. package/dist/src/components/Payroll/TransitionPayroll/TransitionPayroll.d.ts +55 -0
  100. package/dist/src/components/Payroll/TransitionPayroll/TransitionPayrollComponents.d.ts +24 -0
  101. package/dist/src/components/Payroll/TransitionPayroll/TransitionPayrollTypes.d.ts +23 -0
  102. package/dist/src/components/Payroll/TransitionPayroll/index.d.ts +2 -0
  103. package/dist/src/components/Payroll/TransitionPayroll/transitionPayrollStateMachine.d.ts +15 -0
  104. package/dist/src/components/Payroll/TransitionPayroll/useResolveTransitionPayroll.d.ts +28 -0
  105. package/dist/src/components/Payroll/index.d.ts +2 -0
  106. package/dist/src/i18n/types.d.ts +6 -0
  107. package/dist/src/shared/constants.d.ts +2 -0
  108. package/docs/guides/endpoint-inventory.json +14 -19
  109. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"PayrollEditEmployeePresentation.js","sources":["../../../../src/components/Payroll/PayrollEditEmployee/PayrollEditEmployeePresentation.tsx"],"sourcesContent":["import { FormProvider, useFieldArray, useForm, useWatch } from 'react-hook-form'\nimport { useMemo, useRef, useState } from 'react'\nimport classNames from 'classnames'\nimport type { Employee } from '@gusto/embedded-api/models/components/employee'\nimport type {\n FixedCompensations,\n PayrollEmployeeCompensationsType,\n PayrollEmployeeCompensationsTypePaidTimeOff,\n Reimbursements as Reimbursement,\n} from '@gusto/embedded-api/models/components/payrollemployeecompensationstype'\nimport { PayrollEmployeeCompensationsTypePaymentMethod } from '@gusto/embedded-api/models/components/payrollemployeecompensationstype'\nimport type { PayrollFixedCompensationTypesType } from '@gusto/embedded-api/models/components/payrollfixedcompensationtypestype'\nimport type { PayScheduleShow as PayScheduleObject } from '@gusto/embedded-api/models/components/payscheduleshow'\nimport { useTranslation } from 'react-i18next'\nimport { z } from 'zod'\nimport { zodResolver } from '@hookform/resolvers/zod'\nimport styles from './PayrollEditEmployeePresentation.module.scss'\nimport { TimeOffField, PayoutTimeOffField } from './TimeOffField'\nimport {\n Flex,\n Grid,\n TextInputField,\n RadioGroupField,\n DataView,\n useDataView,\n EmptyData,\n} from '@/components/Common'\nimport { useComponentContext } from '@/contexts/ComponentAdapter/useComponentContext'\nimport { useI18n } from '@/i18n'\nimport { Form } from '@/components/Common/Form'\nimport { formatNumberAsCurrency, firstLastName } from '@/helpers/formattedStrings'\nimport { getAdditionalEarningsCompensations, calculateGrossPay } from '@/components/Payroll/helpers'\nimport { PayrollCategory, isOffCyclePayroll } from '@/components/Payroll/payrollTypes'\nimport {\n COMPENSATION_NAME_DOUBLE_OVERTIME,\n COMPENSATION_NAME_OVERTIME,\n COMPENSATION_NAME_REGULAR_HOURS,\n HOURS_COMPENSATION_NAMES,\n EXCLUDED_ADDITIONAL_EARNINGS,\n COMPENSATION_NAME_REIMBURSEMENT,\n COMPENSATION_NAME_BONUS,\n COMPENSATION_NAME_PAYCHECK_TIPS,\n COMPENSATION_NAME_CORRECTION_PAYMENT,\n COMPENSATION_NAME_COMMISSION,\n COMPENSATION_NAME_CASH_TIPS,\n} from '@/shared/constants'\nimport useContainerBreakpoints from '@/hooks/useContainerBreakpoints/useContainerBreakpoints'\nimport PlusCircleIcon from '@/assets/icons/plus-circle.svg?react'\nimport TrashCanSvg from '@/assets/icons/trashcan.svg?react'\n\ninterface PayrollEditEmployeeProps {\n /** CSS class name applied to the root element. */\n className?: string\n onSave: (updatedCompensation: PayrollEmployeeCompensationsType) => void\n onCancel: () => void\n employee: Employee\n employeeCompensation?: PayrollEmployeeCompensationsType\n isPending?: boolean\n fixedCompensationTypes: PayrollFixedCompensationTypesType[]\n payPeriodStartDate?: string\n paySchedule?: PayScheduleObject\n payrollCategory?: PayrollCategory\n withReimbursements?: boolean\n hasDirectDepositSetup?: boolean\n}\n\nconst ReimbursementFormSchema = z.object({\n uuid: z.string().nullable().optional(),\n description: z.string(),\n amount: z.string(),\n recurring: z.boolean().optional(),\n})\n\nconst DraftReimbursementSchema = z.object({\n description: z.string(),\n amount: z.string().refine(\n val => {\n const num = parseFloat(val)\n return !Number.isNaN(num) && num > 0\n },\n { message: 'validations.reimbursementAmount' },\n ),\n})\n\n// A native `min={0}` only constrains the stepper: it does not stop a typed \"-50\", and the\n// SDK's <form> is noValidate so the browser never enforces it either. Negative amounts\n// therefore reached the platform and came back only as a submit-time error (SDK-1285).\n// Applied via z.record below, this covers every additional earning -- correction payment\n// included -- because they all share the fixedCompensations record.\nconst nonNegativeAmountSchema = z\n .string()\n .optional()\n .refine(val => !val || parseFloat(val) >= 0, { message: 'validations.negativeAmount' })\n\nconst PayrollEditEmployeeFormSchema = z.object({\n hourlyCompensations: z.record(z.string(), z.record(z.string(), z.string().optional())),\n timeOffCompensations: z.record(z.string(), z.string().optional()),\n finalPayoutCompensations: z.record(z.string(), z.string().optional()),\n fixedCompensations: z.record(z.string(), nonNegativeAmountSchema),\n reimbursements: z.array(ReimbursementFormSchema),\n paymentMethod: z.enum(PayrollEmployeeCompensationsTypePaymentMethod).optional(),\n})\n\n/** @internal */\nexport type PayrollEditEmployeeFormValues = z.infer<typeof PayrollEditEmployeeFormSchema>\n\nconst buildCompensationFromFormData = (\n formData: PayrollEditEmployeeFormValues,\n employeeCompensation: PayrollEmployeeCompensationsType | undefined,\n timeOff: PayrollEmployeeCompensationsTypePaidTimeOff[],\n primaryJobUuid?: string,\n payrollCategory: PayrollCategory = PayrollCategory.Regular,\n): PayrollEmployeeCompensationsType => {\n const updatedCompensation = {\n ...employeeCompensation,\n paymentMethod: formData.paymentMethod,\n }\n\n updatedCompensation.hourlyCompensations = employeeCompensation?.hourlyCompensations?.map(\n compensation => {\n const hours =\n compensation.jobUuid && compensation.name\n ? formData.hourlyCompensations[compensation.jobUuid]?.[compensation.name]\n : undefined\n return hours\n ? {\n ...compensation,\n hours,\n }\n : compensation\n },\n )\n\n updatedCompensation.paidTimeOff = timeOff.map(timeOffEntry => {\n const isDismissal = payrollCategory === PayrollCategory.Dismissal\n const { finalPayoutUnusedHoursInput: _, ...timeOffWithoutPayout } = timeOffEntry\n\n if (isDismissal) {\n const finalPayout =\n formData.finalPayoutCompensations[timeOffEntry.name!] ??\n timeOffEntry.finalPayoutUnusedHoursInput\n return {\n ...timeOffEntry,\n hours: formData.timeOffCompensations[timeOffEntry.name!] || '0',\n ...(finalPayout != null ? { finalPayoutUnusedHoursInput: finalPayout || '0' } : {}),\n }\n }\n\n return {\n ...timeOffWithoutPayout,\n hours: formData.timeOffCompensations[timeOffEntry.name!] || '0',\n }\n })\n\n // Off-cycle payrolls today use the legacy single Reimbursement field in fixed_compensations\n // because the backend feature flag `emb_off_cycle_disable_named_reimbursements` (default: true,\n // expected removal 2026-09-01) rejects named entries in the itemized `reimbursements[]` array.\n // TODO(post-2026-09-01): once that flag is removed, unify on the itemized path for all categories.\n const usesItemizedReimbursements = !isOffCyclePayroll(payrollCategory)\n\n const updatedFixedCompensations: FixedCompensations[] = []\n\n Object.entries(formData.fixedCompensations).forEach(([fixedCompensationName, formAmount]) => {\n const isReimbursementEntry =\n fixedCompensationName.toLowerCase() === COMPENSATION_NAME_REIMBURSEMENT.toLowerCase()\n\n // Regular payrolls write reimbursements via the itemized array; never let the legacy\n // fixed_compensations entry slip through (the backend rejects it on v2025-11-15+).\n if (isReimbursementEntry && usesItemizedReimbursements) {\n return\n }\n\n const existingFixedCompensation = employeeCompensation?.fixedCompensations?.find(\n fixedCompensation =>\n fixedCompensation.name?.toLowerCase() === fixedCompensationName.toLowerCase(),\n )\n\n // Clearing the field means \"no additional earning\". For an entry that already has a\n // saved amount we have to send an explicit 0: omitting it leaves the previously saved\n // value in place server-side, so the box looked empty while the old amount survived\n // the save (SDK-1284). This makes clearing behave exactly like typing 0. An entry with\n // no saved compensation stays omitted -- there is nothing to zero out.\n const resolvedAmount = formAmount === '' && existingFixedCompensation ? '0' : formAmount\n\n if (resolvedAmount !== undefined && resolvedAmount !== '') {\n if (existingFixedCompensation) {\n updatedFixedCompensations.push({\n name: existingFixedCompensation.name,\n jobUuid: existingFixedCompensation.jobUuid,\n amount: resolvedAmount,\n })\n } else if (parseFloat(resolvedAmount) !== 0) {\n updatedFixedCompensations.push({\n name: fixedCompensationName,\n jobUuid: primaryJobUuid,\n amount: resolvedAmount,\n })\n }\n }\n })\n\n updatedCompensation.fixedCompensations = updatedFixedCompensations\n\n if (usesItemizedReimbursements) {\n updatedCompensation.reimbursements = formData.reimbursements.map(reimbursement => ({\n amount: reimbursement.amount,\n description:\n reimbursement.description.trim() === '' ? null : reimbursement.description.trim(),\n uuid: reimbursement.uuid ?? null,\n recurring: reimbursement.recurring,\n }))\n } else {\n // Off-cycle: ensure no itemized array leaks through. The container also strips this defensively.\n updatedCompensation.reimbursements = []\n }\n\n return updatedCompensation\n}\n\n/** @internal */\nexport const PayrollEditEmployeePresentation = ({\n className,\n onSave,\n onCancel,\n employee,\n employeeCompensation,\n isPending = false,\n fixedCompensationTypes,\n payPeriodStartDate,\n paySchedule,\n payrollCategory = PayrollCategory.Regular,\n withReimbursements = true,\n hasDirectDepositSetup = true,\n}: PayrollEditEmployeeProps) => {\n const { Button, ButtonIcon, Heading, Text } = useComponentContext()\n\n const { t } = useTranslation('Payroll.PayrollEditEmployee')\n useI18n('Payroll.PayrollEditEmployee')\n\n const primaryJob = employee.jobs?.find(job => job.primary)\n const primaryJobHasHourlyCompensations = employeeCompensation?.hourlyCompensations?.some(\n c => c.jobUuid === primaryJob?.uuid,\n )\n const hourlyJobs = primaryJob && primaryJobHasHourlyCompensations ? [primaryJob] : []\n\n const containerRef = useRef<HTMLDivElement>(null)\n const breakpoints = useContainerBreakpoints({\n ref: containerRef,\n })\n const isSmallOrGreater = breakpoints.includes('small')\n\n employeeCompensation?.hourlyCompensations?.forEach(compensation => {\n const job = employee.jobs?.find(job => job.uuid === compensation.jobUuid)\n if (job && !hourlyJobs.find(hourlyJob => hourlyJob.uuid === job.uuid)) {\n hourlyJobs.push(job)\n }\n })\n\n const timeOff = (employeeCompensation?.paidTimeOff || []).filter(entry => entry.name)\n\n const additionalEarnings = getAdditionalEarningsCompensations({\n flsaStatus: primaryJob?.compensations?.[0]?.flsaStatus,\n existingFixedCompensations: employeeCompensation?.fixedCompensations || [],\n primaryJobUuid: primaryJob?.uuid,\n fixedCompensationTypes,\n excludedTypes: EXCLUDED_ADDITIONAL_EARNINGS,\n })\n\n // Off-cycle payrolls use the legacy single Reimbursement field in fixed_compensations because\n // the backend `emb_off_cycle_disable_named_reimbursements` flag (default: true, expected\n // removal 2026-09-01) rejects named entries in the itemized `reimbursements[]` array.\n // TODO(post-2026-09-01): unify on the itemized path once that flag is removed.\n const usesItemizedReimbursements = !isOffCyclePayroll(payrollCategory)\n\n const initialReimbursements: Reimbursement[] = useMemo(\n () =>\n withReimbursements && usesItemizedReimbursements\n ? (employeeCompensation?.reimbursements ?? [])\n : [],\n [withReimbursements, usesItemizedReimbursements, employeeCompensation?.reimbursements],\n )\n\n const existingReimbursementFixedCompensation = useMemo(\n () =>\n employeeCompensation?.fixedCompensations?.find(\n comp => comp.name?.toLowerCase() === COMPENSATION_NAME_REIMBURSEMENT.toLowerCase(),\n ),\n [employeeCompensation?.fixedCompensations],\n )\n\n const showLegacyReimbursementField =\n withReimbursements && !usesItemizedReimbursements && Boolean(primaryJob?.uuid)\n\n const findMatchingCompensation = (jobUuid: string, compensationName: string) => {\n return employeeCompensation?.hourlyCompensations?.find(\n compensation =>\n compensation.jobUuid === jobUuid &&\n compensation.name?.toLowerCase() === compensationName.toLowerCase(),\n )\n }\n\n const getCompensationLabel = (compensationName?: string) => {\n switch (compensationName) {\n case COMPENSATION_NAME_REGULAR_HOURS:\n return t('compensationNames.regularHours')\n case COMPENSATION_NAME_OVERTIME:\n return t('compensationNames.overtime')\n case COMPENSATION_NAME_DOUBLE_OVERTIME:\n return t('compensationNames.doubleOvertime')\n default:\n return compensationName\n }\n }\n\n const getFixedCompensationLabel = (compensationName?: string) => {\n switch (compensationName) {\n case COMPENSATION_NAME_BONUS:\n return t('fixedCompensationNames.bonus')\n case COMPENSATION_NAME_PAYCHECK_TIPS:\n return t('fixedCompensationNames.paycheckTips')\n case COMPENSATION_NAME_CORRECTION_PAYMENT:\n return t('fixedCompensationNames.correctionPayment')\n case COMPENSATION_NAME_COMMISSION:\n return t('fixedCompensationNames.commission')\n case COMPENSATION_NAME_CASH_TIPS:\n return t('fixedCompensationNames.cashTips')\n case COMPENSATION_NAME_REIMBURSEMENT:\n return t('fixedCompensationNames.reimbursement')\n default:\n return compensationName\n }\n }\n\n const resolveDefaultPaymentMethod = () => {\n const preparedPaymentMethod = employeeCompensation?.paymentMethod\n\n if (!preparedPaymentMethod) {\n return hasDirectDepositSetup\n ? PayrollEmployeeCompensationsTypePaymentMethod.DirectDeposit\n : PayrollEmployeeCompensationsTypePaymentMethod.Check\n }\n\n if (\n !hasDirectDepositSetup &&\n preparedPaymentMethod === PayrollEmployeeCompensationsTypePaymentMethod.DirectDeposit\n ) {\n return PayrollEmployeeCompensationsTypePaymentMethod.Check\n }\n\n return preparedPaymentMethod\n }\n\n const defaultValues = {\n hourlyCompensations: (() => {\n const hourlyCompensations: PayrollEditEmployeeFormValues['hourlyCompensations'] = {}\n\n hourlyJobs.forEach(hourlyJob => {\n HOURS_COMPENSATION_NAMES.forEach(compensationName => {\n const matchingCompensation = findMatchingCompensation(hourlyJob.uuid, compensationName)\n if (matchingCompensation) {\n if (!hourlyCompensations[hourlyJob.uuid]) {\n hourlyCompensations[hourlyJob.uuid] = {}\n }\n hourlyCompensations[hourlyJob.uuid]![matchingCompensation.name!] =\n matchingCompensation.hours ? parseFloat(matchingCompensation.hours).toString() : ''\n }\n })\n })\n\n return hourlyCompensations\n })(),\n\n timeOffCompensations: (() => {\n const timeOffCompensations: PayrollEditEmployeeFormValues['timeOffCompensations'] = {}\n\n timeOff.forEach(timeOffCompensation => {\n timeOffCompensations[timeOffCompensation.name!] = timeOffCompensation.hours\n ? parseFloat(timeOffCompensation.hours).toString()\n : ''\n })\n\n return timeOffCompensations\n })(),\n\n finalPayoutCompensations: (() => {\n const finalPayoutCompensations: PayrollEditEmployeeFormValues['finalPayoutCompensations'] = {}\n\n timeOff.forEach(timeOffCompensation => {\n finalPayoutCompensations[timeOffCompensation.name!] =\n timeOffCompensation.finalPayoutUnusedHoursInput ?? '0'\n })\n\n return finalPayoutCompensations\n })(),\n\n fixedCompensations: (() => {\n const fixedCompensations: PayrollEditEmployeeFormValues['fixedCompensations'] = {}\n\n additionalEarnings.forEach(fixedComp => {\n fixedCompensations[fixedComp.name!] = fixedComp.amount ?? ''\n })\n\n if (showLegacyReimbursementField) {\n fixedCompensations[COMPENSATION_NAME_REIMBURSEMENT] =\n existingReimbursementFixedCompensation?.amount ?? '0.00'\n }\n\n return fixedCompensations\n })(),\n\n reimbursements: initialReimbursements.map(reimbursement => ({\n uuid: reimbursement.uuid ?? null,\n description: reimbursement.description ?? '',\n amount: reimbursement.amount,\n recurring: reimbursement.recurring ?? false,\n })),\n\n paymentMethod: resolveDefaultPaymentMethod(),\n }\n\n const formHandlers = useForm<PayrollEditEmployeeFormValues>({\n resolver: zodResolver(PayrollEditEmployeeFormSchema),\n defaultValues,\n })\n\n const {\n fields: reimbursementFields,\n append: appendReimbursement,\n remove: removeReimbursement,\n update: updateReimbursement,\n } = useFieldArray({\n control: formHandlers.control,\n name: 'reimbursements',\n })\n\n const handleRemoveReimbursement = (index: number) => {\n const field = reimbursementFields[index]\n if (!field) return\n\n if (field.uuid) {\n updateReimbursement(index, { ...field, amount: '0' })\n } else {\n removeReimbursement(index)\n }\n }\n\n type VisibleReimbursementRow = (typeof reimbursementFields)[number] & {\n originalIndex: number\n }\n\n const visibleReimbursementRows: VisibleReimbursementRow[] = reimbursementFields\n .map((field, originalIndex) => ({ ...field, originalIndex }))\n .filter(row => parseFloat(row.amount || '0') !== 0)\n\n const [isAddingReimbursement, setIsAddingReimbursement] = useState(false)\n\n type DraftReimbursementValues = z.infer<typeof DraftReimbursementSchema>\n\n const draftForm = useForm<DraftReimbursementValues>({\n resolver: zodResolver(DraftReimbursementSchema),\n defaultValues: { description: '', amount: '' },\n })\n\n const resetReimbursementDraft = () => {\n setIsAddingReimbursement(false)\n draftForm.reset()\n }\n\n const onDraftReimbursementValid = (data: DraftReimbursementValues) => {\n const parsedAmount = parseFloat(data.amount)\n appendReimbursement({\n uuid: null,\n description: data.description.trim(),\n amount: parsedAmount.toFixed(2),\n recurring: false,\n })\n resetReimbursementDraft()\n }\n\n const reimbursementDataViewProps = useDataView<VisibleReimbursementRow>({\n data: visibleReimbursementRows,\n columns: [\n {\n key: 'description',\n title: t('reimbursementDescriptionColumn'),\n render: row => row.description.trim() || t('reimbursementUnnamedFallback'),\n },\n {\n key: 'amount',\n title: t('reimbursementAmountColumn'),\n justify: 'end',\n render: row => formatNumberAsCurrency(parseFloat(row.amount || '0')),\n },\n {\n key: 'recurring',\n title: t('reimbursementTypeColumn'),\n render: row =>\n row.recurring ? t('reimbursementTypeRecurring') : t('reimbursementTypeOneTime'),\n },\n ],\n itemMenu: row => {\n if (row.recurring) return null\n const displayDescription = row.description.trim() || t('reimbursementUnnamedFallback')\n return (\n <ButtonIcon\n variant=\"tertiary\"\n onClick={() => {\n handleRemoveReimbursement(row.originalIndex)\n }}\n aria-label={t('removeReimbursementLabel', { description: displayDescription })}\n >\n <TrashCanSvg aria-hidden />\n </ButtonIcon>\n )\n },\n emptyState: () => (\n <EmptyData title={t('reimbursementEmptyTitle')}>\n <Button\n variant=\"secondary\"\n onClick={() => {\n setIsAddingReimbursement(true)\n }}\n icon={<PlusCircleIcon aria-hidden />}\n >\n {t('addReimbursementCta')}\n </Button>\n </EmptyData>\n ),\n })\n\n const watchedFormData = useWatch({\n control: formHandlers.control,\n })\n\n const currentGrossPay = useMemo(() => {\n try {\n const hourlyCompensations: Record<string, Record<string, string | undefined>> = {}\n if (watchedFormData.hourlyCompensations) {\n Object.entries(watchedFormData.hourlyCompensations).forEach(([jobId, compensations]) => {\n if (compensations) {\n hourlyCompensations[jobId] = compensations\n }\n })\n }\n\n const reimbursementsWithDefaults: PayrollEditEmployeeFormValues['reimbursements'] = (\n watchedFormData.reimbursements ?? []\n ).map(reimbursement => ({\n uuid: reimbursement.uuid ?? null,\n description: reimbursement.description ?? '',\n amount: reimbursement.amount ?? '0',\n recurring: reimbursement.recurring,\n }))\n\n const formDataWithDefaults: PayrollEditEmployeeFormValues = {\n hourlyCompensations,\n timeOffCompensations: watchedFormData.timeOffCompensations || {},\n finalPayoutCompensations: watchedFormData.finalPayoutCompensations || {},\n fixedCompensations: watchedFormData.fixedCompensations || {},\n reimbursements: reimbursementsWithDefaults,\n paymentMethod: watchedFormData.paymentMethod,\n }\n\n const updatedCompensation = buildCompensationFromFormData(\n formDataWithDefaults,\n employeeCompensation,\n (employeeCompensation?.paidTimeOff || []).filter(entry => entry.name),\n primaryJob?.uuid,\n payrollCategory,\n )\n\n return calculateGrossPay(\n updatedCompensation,\n employee,\n payPeriodStartDate,\n paySchedule,\n payrollCategory,\n )\n } catch {\n return employeeCompensation\n ? calculateGrossPay(\n employeeCompensation,\n employee,\n payPeriodStartDate,\n paySchedule,\n payrollCategory,\n )\n : 0\n }\n }, [\n watchedFormData,\n employeeCompensation,\n primaryJob?.uuid,\n employee,\n payPeriodStartDate,\n paySchedule,\n payrollCategory,\n ])\n\n const employeeName = firstLastName({\n first_name: employee.firstName,\n last_name: employee.lastName,\n })\n\n const onSubmit = (data: PayrollEditEmployeeFormValues) => {\n const updatedCompensation = buildCompensationFromFormData(\n data,\n employeeCompensation,\n timeOff,\n primaryJob?.uuid,\n payrollCategory,\n )\n onSave(updatedCompensation)\n }\n\n const formattedCurrentGrossPay = formatNumberAsCurrency(currentGrossPay || 0)\n\n const actions = (\n <Flex\n flexDirection={isSmallOrGreater ? 'row' : 'column'}\n justifyContent={isSmallOrGreater ? 'flex-end' : 'normal'}\n alignItems={isSmallOrGreater ? 'flex-start' : 'stretch'}\n gap={12}\n >\n <Button variant=\"secondary\" onClick={onCancel} title={t('cancelCta')}>\n {t('cancelCta')}\n </Button>\n <Button\n onClick={formHandlers.handleSubmit(onSubmit)}\n title={t('saveCta')}\n isLoading={isPending}\n >\n {t('saveCta')}\n </Button>\n </Flex>\n )\n\n return (\n <div ref={containerRef} className={classNames(styles.container, className)}>\n <div\n className={`${styles.headerSection} ${!isSmallOrGreater ? styles.headerSectionSticky : ''}`}\n >\n <Flex justifyContent=\"space-between\">\n <Flex flexDirection=\"column\" alignItems=\"stretch\" gap={isSmallOrGreater ? 8 : 2}>\n <Heading as=\"h1\" styledAs={isSmallOrGreater ? 'h2' : 'h4'}>\n {t('pageTitle', { employeeName })}\n </Heading>\n {isSmallOrGreater ? (\n <Flex flexDirection=\"column\" gap={6}>\n <Heading as=\"h2\" styledAs=\"h3\">\n {formattedCurrentGrossPay}\n </Heading>\n <Text className={styles.grossPayLabel}>{t('grossPayLabel')}</Text>\n </Flex>\n ) : (\n <Heading as=\"h2\" styledAs=\"h6\" className={styles.grossPayLabel}>\n {t('grossPayLabelMobile', { grossPay: formattedCurrentGrossPay })}\n </Heading>\n )}\n </Flex>\n {isSmallOrGreater && actions}\n </Flex>\n </div>\n <FormProvider {...formHandlers}>\n <Form>\n {hourlyJobs.length > 0 && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\">{t('regularHoursTitle')}</Heading>\n {hourlyJobs.map(hourlyJob => (\n <Flex key={hourlyJob.uuid} flexDirection=\"column\" gap={8}>\n {hourlyJobs.length > 1 && <Heading as=\"h4\">{hourlyJob.title}</Heading>}\n <Grid gridTemplateColumns={{ base: '1fr', small: [320, 320] }} gap={20}>\n {HOURS_COMPENSATION_NAMES.map(compensationName => {\n const employeeHourlyCompensation = findMatchingCompensation(\n hourlyJob.uuid,\n compensationName,\n )\n if (employeeHourlyCompensation) {\n return (\n <TextInputField\n key={compensationName}\n type=\"number\"\n min={0}\n adornmentEnd={t('hoursUnit')}\n isRequired\n label={getCompensationLabel(compensationName)}\n name={`hourlyCompensations.${hourlyJob.uuid}.${employeeHourlyCompensation.name}`}\n />\n )\n }\n })}\n </Grid>\n </Flex>\n ))}\n </div>\n )}\n {timeOff.length > 0 && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {payrollCategory === PayrollCategory.Dismissal\n ? t('timeOffTitleDismissal')\n : t('timeOffTitle')}\n </Heading>\n <Grid gridTemplateColumns={{ base: '1fr', small: [320, 320] }} gap={20}>\n {timeOff.map(timeOffEntry => (\n <TimeOffField\n key={timeOffEntry.name}\n timeOff={timeOffEntry}\n employee={employee}\n />\n ))}\n </Grid>\n </div>\n )}\n {payrollCategory === PayrollCategory.Dismissal && timeOff.length > 0 && (\n <div className={styles.fieldGroup}>\n <Flex flexDirection=\"column\" gap={4}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {t('finalPayoutTitle')}\n </Heading>\n <Text variant=\"supporting\">{t('finalPayoutDescription')}</Text>\n </Flex>\n <Grid gridTemplateColumns={{ base: '1fr', small: [320, 320] }} gap={20}>\n {timeOff.map(timeOffEntry => (\n <PayoutTimeOffField\n key={`payout-${timeOffEntry.name}`}\n timeOff={timeOffEntry}\n employee={employee}\n />\n ))}\n </Grid>\n </div>\n )}\n {additionalEarnings.length > 0 && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {t('additionalEarningsTitle')}\n </Heading>\n <Grid\n gridTemplateColumns={{ base: '1fr', small: [320, 320], large: [320, 320, 320] }}\n gap={20}\n >\n {additionalEarnings.map(fixedCompensation => (\n <TextInputField\n key={fixedCompensation.name}\n type=\"number\"\n min={0}\n adornmentStart=\"$\"\n isRequired\n label={getFixedCompensationLabel(fixedCompensation.name)}\n name={`fixedCompensations.${fixedCompensation.name}`}\n // useField only surfaces this once react-hook-form has flagged the\n // field, and the schema's only rule here is the negative-amount check.\n errorMessage={t('validations.negativeAmount')}\n />\n ))}\n </Grid>\n </div>\n )}\n {showLegacyReimbursementField && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {t('reimbursementTitle')}\n </Heading>\n <Grid gridTemplateColumns={{ base: '1fr', small: [320, 320] }} gap={20}>\n <TextInputField\n type=\"number\"\n min={0}\n adornmentStart=\"$\"\n isRequired\n label={getFixedCompensationLabel(COMPENSATION_NAME_REIMBURSEMENT)}\n name={`fixedCompensations.${COMPENSATION_NAME_REIMBURSEMENT}`}\n errorMessage={t('validations.negativeAmount')}\n />\n </Grid>\n </div>\n )}\n {withReimbursements && usesItemizedReimbursements && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {t('reimbursementTitle')}\n </Heading>\n {!(visibleReimbursementRows.length === 0 && isAddingReimbursement) && (\n <DataView label={t('reimbursementsTableLabel')} {...reimbursementDataViewProps} />\n )}\n {isAddingReimbursement ? (\n <FormProvider {...draftForm}>\n <Flex flexDirection=\"column\" gap={12}>\n <Grid gridTemplateColumns={{ base: '1fr', small: [320, 320] }} gap={20}>\n <TextInputField\n name=\"description\"\n label={t('reimbursementDescriptionLabel')}\n placeholder={t('reimbursementDescriptionPlaceholder')}\n />\n <TextInputField\n name=\"amount\"\n type=\"number\"\n min={0}\n adornmentStart=\"$\"\n isRequired\n label={t('reimbursementAmountLabel')}\n errorMessage={t('validations.reimbursementAmount')}\n />\n </Grid>\n <Flex gap={12}>\n <Button onClick={draftForm.handleSubmit(onDraftReimbursementValid)}>\n {t('saveReimbursementCta')}\n </Button>\n <Button variant=\"secondary\" onClick={resetReimbursementDraft}>\n {t('cancelReimbursementCta')}\n </Button>\n </Flex>\n </Flex>\n </FormProvider>\n ) : (\n visibleReimbursementRows.length > 0 && (\n <div>\n <Button\n variant=\"secondary\"\n onClick={() => {\n setIsAddingReimbursement(true)\n }}\n title={t('addReimbursementLink')}\n icon={<PlusCircleIcon aria-hidden />}\n >\n {t('addReimbursementLink')}\n </Button>\n </div>\n )\n )}\n </div>\n )}\n {hasDirectDepositSetup && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {t('paymentMethodTitle')}\n </Heading>\n <RadioGroupField\n name=\"paymentMethod\"\n isRequired\n label={t('paymentMethodLabel')}\n description={t('paymentMethodDescription')}\n options={[\n {\n value: PayrollEmployeeCompensationsTypePaymentMethod.DirectDeposit,\n label: t('paymentMethodOptions.directDeposit'),\n },\n {\n value: PayrollEmployeeCompensationsTypePaymentMethod.Check,\n label: t('paymentMethodOptions.check'),\n },\n ]}\n />\n </div>\n )}\n </Form>\n {!isSmallOrGreater && actions}\n </FormProvider>\n </div>\n )\n}\n"],"names":["ReimbursementFormSchema","z","DraftReimbursementSchema","val","num","nonNegativeAmountSchema","PayrollEditEmployeeFormSchema","PayrollEmployeeCompensationsTypePaymentMethod","buildCompensationFromFormData","formData","employeeCompensation","timeOff","primaryJobUuid","payrollCategory","PayrollCategory","updatedCompensation","compensation","hours","timeOffEntry","isDismissal","_","timeOffWithoutPayout","finalPayout","usesItemizedReimbursements","isOffCyclePayroll","updatedFixedCompensations","fixedCompensationName","formAmount","COMPENSATION_NAME_REIMBURSEMENT","existingFixedCompensation","fixedCompensation","resolvedAmount","reimbursement","PayrollEditEmployeePresentation","className","onSave","onCancel","employee","isPending","fixedCompensationTypes","payPeriodStartDate","paySchedule","withReimbursements","hasDirectDepositSetup","Button","ButtonIcon","Heading","Text","useComponentContext","t","useTranslation","useI18n","primaryJob","job","primaryJobHasHourlyCompensations","c","hourlyJobs","containerRef","useRef","isSmallOrGreater","useContainerBreakpoints","hourlyJob","entry","additionalEarnings","getAdditionalEarningsCompensations","EXCLUDED_ADDITIONAL_EARNINGS","initialReimbursements","useMemo","existingReimbursementFixedCompensation","comp","showLegacyReimbursementField","findMatchingCompensation","jobUuid","compensationName","getCompensationLabel","COMPENSATION_NAME_REGULAR_HOURS","COMPENSATION_NAME_OVERTIME","COMPENSATION_NAME_DOUBLE_OVERTIME","getFixedCompensationLabel","COMPENSATION_NAME_BONUS","COMPENSATION_NAME_PAYCHECK_TIPS","COMPENSATION_NAME_CORRECTION_PAYMENT","COMPENSATION_NAME_COMMISSION","COMPENSATION_NAME_CASH_TIPS","resolveDefaultPaymentMethod","preparedPaymentMethod","defaultValues","hourlyCompensations","HOURS_COMPENSATION_NAMES","matchingCompensation","timeOffCompensations","timeOffCompensation","finalPayoutCompensations","fixedCompensations","fixedComp","formHandlers","useForm","zodResolver","reimbursementFields","appendReimbursement","removeReimbursement","updateReimbursement","useFieldArray","handleRemoveReimbursement","index","field","visibleReimbursementRows","originalIndex","row","isAddingReimbursement","setIsAddingReimbursement","useState","draftForm","resetReimbursementDraft","onDraftReimbursementValid","data","parsedAmount","reimbursementDataViewProps","useDataView","formatNumberAsCurrency","displayDescription","jsx","TrashCanSvg","EmptyData","PlusCircleIcon","watchedFormData","useWatch","currentGrossPay","jobId","compensations","reimbursementsWithDefaults","formDataWithDefaults","calculateGrossPay","employeeName","firstLastName","onSubmit","formattedCurrentGrossPay","actions","jsxs","Flex","classNames","styles","FormProvider","Form","Grid","employeeHourlyCompensation","TextInputField","TimeOffField","PayoutTimeOffField","DataView","RadioGroupField"],"mappings":"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"}
1
+ {"version":3,"file":"PayrollEditEmployeePresentation.js","sources":["../../../../src/components/Payroll/PayrollEditEmployee/PayrollEditEmployeePresentation.tsx"],"sourcesContent":["import { FormProvider, useFieldArray, useForm, useWatch } from 'react-hook-form'\nimport { useMemo, useRef, useState } from 'react'\nimport classNames from 'classnames'\nimport type { Employee } from '@gusto/embedded-api/models/components/employee'\nimport type {\n FixedCompensations,\n PayrollEmployeeCompensationsType,\n PayrollEmployeeCompensationsTypePaidTimeOff,\n Reimbursements as Reimbursement,\n} from '@gusto/embedded-api/models/components/payrollemployeecompensationstype'\nimport { PayrollEmployeeCompensationsTypePaymentMethod } from '@gusto/embedded-api/models/components/payrollemployeecompensationstype'\nimport type { PayrollFixedCompensationTypesType } from '@gusto/embedded-api/models/components/payrollfixedcompensationtypestype'\nimport type { PayScheduleShow as PayScheduleObject } from '@gusto/embedded-api/models/components/payscheduleshow'\nimport { useTranslation } from 'react-i18next'\nimport { z } from 'zod'\nimport { zodResolver } from '@hookform/resolvers/zod'\nimport styles from './PayrollEditEmployeePresentation.module.scss'\nimport { TimeOffField, PayoutTimeOffField } from './TimeOffField'\nimport {\n Flex,\n Grid,\n TextInputField,\n RadioGroupField,\n DataView,\n useDataView,\n EmptyData,\n} from '@/components/Common'\nimport { useComponentContext } from '@/contexts/ComponentAdapter/useComponentContext'\nimport { useI18n } from '@/i18n'\nimport { Form } from '@/components/Common/Form'\nimport { formatNumberAsCurrency, firstLastName } from '@/helpers/formattedStrings'\nimport { getAdditionalEarningsCompensations, calculateGrossPay } from '@/components/Payroll/helpers'\nimport { PayrollCategory, isOffCyclePayroll } from '@/components/Payroll/payrollTypes'\nimport {\n COMPENSATION_NAME_DOUBLE_OVERTIME,\n COMPENSATION_NAME_OVERTIME,\n COMPENSATION_NAME_REGULAR_HOURS,\n HOURS_COMPENSATION_NAMES,\n EXCLUDED_ADDITIONAL_EARNINGS,\n COMPENSATION_NAME_REIMBURSEMENT,\n COMPENSATION_NAME_BONUS,\n COMPENSATION_NAME_PAYCHECK_TIPS,\n COMPENSATION_NAME_CORRECTION_PAYMENT,\n COMPENSATION_NAME_COMMISSION,\n COMPENSATION_NAME_CASH_TIPS,\n} from '@/shared/constants'\nimport useContainerBreakpoints from '@/hooks/useContainerBreakpoints/useContainerBreakpoints'\nimport PlusCircleIcon from '@/assets/icons/plus-circle.svg?react'\nimport TrashCanSvg from '@/assets/icons/trashcan.svg?react'\n\ninterface PayrollEditEmployeeProps {\n /** CSS class name applied to the root element. */\n className?: string\n onSave: (updatedCompensation: PayrollEmployeeCompensationsType) => void\n onCancel: () => void\n employee: Employee\n employeeCompensation?: PayrollEmployeeCompensationsType\n isPending?: boolean\n fixedCompensationTypes: PayrollFixedCompensationTypesType[]\n payPeriodStartDate?: string\n paySchedule?: PayScheduleObject\n payrollCategory?: PayrollCategory\n withReimbursements?: boolean\n hasDirectDepositSetup?: boolean\n}\n\nconst ReimbursementFormSchema = z.object({\n uuid: z.string().nullable().optional(),\n description: z.string(),\n amount: z.string(),\n recurring: z.boolean().optional(),\n})\n\nconst DraftReimbursementSchema = z.object({\n description: z.string(),\n amount: z.string().refine(\n val => {\n const num = parseFloat(val)\n return !Number.isNaN(num) && num > 0\n },\n { message: 'validations.reimbursementAmount' },\n ),\n})\n\n// A native `min={0}` only constrains the stepper: it does not stop a typed \"-50\", and the\n// SDK's <form> is noValidate so the browser never enforces it either. Negative amounts\n// therefore reached the platform and came back only as a submit-time error (SDK-1285).\n// Applied via z.record below, this covers every additional earning -- correction payment\n// included -- because they all share the fixedCompensations record.\nconst nonNegativeAmountSchema = z\n .string()\n .optional()\n .refine(val => !val || parseFloat(val) >= 0, { message: 'validations.negativeAmount' })\n\nconst PayrollEditEmployeeFormSchema = z.object({\n hourlyCompensations: z.record(z.string(), z.record(z.string(), z.string().optional())),\n timeOffCompensations: z.record(z.string(), z.string().optional()),\n finalPayoutCompensations: z.record(z.string(), z.string().optional()),\n fixedCompensations: z.record(z.string(), nonNegativeAmountSchema),\n reimbursements: z.array(ReimbursementFormSchema),\n paymentMethod: z.enum(PayrollEmployeeCompensationsTypePaymentMethod).optional(),\n})\n\n/** @internal */\nexport type PayrollEditEmployeeFormValues = z.infer<typeof PayrollEditEmployeeFormSchema>\n\nconst buildCompensationFromFormData = (\n formData: PayrollEditEmployeeFormValues,\n employeeCompensation: PayrollEmployeeCompensationsType | undefined,\n timeOff: PayrollEmployeeCompensationsTypePaidTimeOff[],\n primaryJobUuid?: string,\n payrollCategory: PayrollCategory = PayrollCategory.Regular,\n): PayrollEmployeeCompensationsType => {\n const updatedCompensation = {\n ...employeeCompensation,\n paymentMethod: formData.paymentMethod,\n }\n\n updatedCompensation.hourlyCompensations = employeeCompensation?.hourlyCompensations?.map(\n compensation => {\n const hours =\n compensation.jobUuid && compensation.name\n ? formData.hourlyCompensations[compensation.jobUuid]?.[compensation.name]\n : undefined\n return hours\n ? {\n ...compensation,\n hours,\n }\n : compensation\n },\n )\n\n updatedCompensation.paidTimeOff = timeOff.map(timeOffEntry => {\n const isDismissal = payrollCategory === PayrollCategory.Dismissal\n const { finalPayoutUnusedHoursInput: _, ...timeOffWithoutPayout } = timeOffEntry\n\n if (isDismissal) {\n const finalPayout =\n formData.finalPayoutCompensations[timeOffEntry.name!] ??\n timeOffEntry.finalPayoutUnusedHoursInput\n return {\n ...timeOffEntry,\n hours: formData.timeOffCompensations[timeOffEntry.name!] || '0',\n ...(finalPayout != null ? { finalPayoutUnusedHoursInput: finalPayout || '0' } : {}),\n }\n }\n\n return {\n ...timeOffWithoutPayout,\n hours: formData.timeOffCompensations[timeOffEntry.name!] || '0',\n }\n })\n\n // Off-cycle payrolls today use the legacy single Reimbursement field in fixed_compensations\n // because the backend feature flag `emb_off_cycle_disable_named_reimbursements` (default: true,\n // expected removal 2026-09-01) rejects named entries in the itemized `reimbursements[]` array.\n // TODO(post-2026-09-01): once that flag is removed, unify on the itemized path for all categories.\n const usesItemizedReimbursements = !isOffCyclePayroll(payrollCategory)\n\n const updatedFixedCompensations: FixedCompensations[] = []\n\n Object.entries(formData.fixedCompensations).forEach(([fixedCompensationName, formAmount]) => {\n const isReimbursementEntry =\n fixedCompensationName.toLowerCase() === COMPENSATION_NAME_REIMBURSEMENT.toLowerCase()\n\n // Regular payrolls write reimbursements via the itemized array; never let the legacy\n // fixed_compensations entry slip through (the backend rejects it on v2025-11-15+).\n if (isReimbursementEntry && usesItemizedReimbursements) {\n return\n }\n\n const existingFixedCompensation = employeeCompensation?.fixedCompensations?.find(\n fixedCompensation =>\n fixedCompensation.name?.toLowerCase() === fixedCompensationName.toLowerCase(),\n )\n\n // Clearing the field means \"no additional earning\". For an entry that already has a\n // saved amount we have to send an explicit 0: omitting it leaves the previously saved\n // value in place server-side, so the box looked empty while the old amount survived\n // the save (SDK-1284). This makes clearing behave exactly like typing 0. An entry with\n // no saved compensation stays omitted -- there is nothing to zero out.\n const resolvedAmount = formAmount === '' && existingFixedCompensation ? '0' : formAmount\n\n if (resolvedAmount !== undefined && resolvedAmount !== '') {\n if (existingFixedCompensation) {\n updatedFixedCompensations.push({\n name: existingFixedCompensation.name,\n jobUuid: existingFixedCompensation.jobUuid,\n amount: resolvedAmount,\n })\n } else if (parseFloat(resolvedAmount) !== 0) {\n updatedFixedCompensations.push({\n name: fixedCompensationName,\n jobUuid: primaryJobUuid,\n amount: resolvedAmount,\n })\n }\n }\n })\n\n updatedCompensation.fixedCompensations = updatedFixedCompensations\n\n if (usesItemizedReimbursements) {\n updatedCompensation.reimbursements = formData.reimbursements.map(reimbursement => ({\n amount: reimbursement.amount,\n description:\n reimbursement.description.trim() === '' ? null : reimbursement.description.trim(),\n uuid: reimbursement.uuid ?? null,\n recurring: reimbursement.recurring,\n }))\n } else {\n // Off-cycle: ensure no itemized array leaks through. The container also strips this defensively.\n updatedCompensation.reimbursements = []\n }\n\n return updatedCompensation\n}\n\n/** @internal */\nexport const PayrollEditEmployeePresentation = ({\n className,\n onSave,\n onCancel,\n employee,\n employeeCompensation,\n isPending = false,\n fixedCompensationTypes,\n payPeriodStartDate,\n paySchedule,\n payrollCategory = PayrollCategory.Regular,\n withReimbursements = true,\n hasDirectDepositSetup = true,\n}: PayrollEditEmployeeProps) => {\n const { Button, ButtonIcon, Heading, Text } = useComponentContext()\n\n const { t } = useTranslation('Payroll.PayrollEditEmployee')\n useI18n('Payroll.PayrollEditEmployee')\n\n const primaryJob = employee.jobs?.find(job => job.primary)\n const primaryJobHasHourlyCompensations = employeeCompensation?.hourlyCompensations?.some(\n c => c.jobUuid === primaryJob?.uuid,\n )\n const hourlyJobs = primaryJob && primaryJobHasHourlyCompensations ? [primaryJob] : []\n\n const containerRef = useRef<HTMLDivElement>(null)\n const breakpoints = useContainerBreakpoints({\n ref: containerRef,\n })\n const isSmallOrGreater = breakpoints.includes('small')\n\n employeeCompensation?.hourlyCompensations?.forEach(compensation => {\n const job = employee.jobs?.find(job => job.uuid === compensation.jobUuid)\n if (job && !hourlyJobs.find(hourlyJob => hourlyJob.uuid === job.uuid)) {\n hourlyJobs.push(job)\n }\n })\n\n const timeOff = (employeeCompensation?.paidTimeOff || []).filter(entry => entry.name)\n\n const additionalEarnings = getAdditionalEarningsCompensations({\n flsaStatus: primaryJob?.compensations?.[0]?.flsaStatus,\n existingFixedCompensations: employeeCompensation?.fixedCompensations || [],\n primaryJobUuid: primaryJob?.uuid,\n fixedCompensationTypes,\n excludedTypes: EXCLUDED_ADDITIONAL_EARNINGS,\n })\n\n // Off-cycle payrolls use the legacy single Reimbursement field in fixed_compensations because\n // the backend `emb_off_cycle_disable_named_reimbursements` flag (default: true, expected\n // removal 2026-09-01) rejects named entries in the itemized `reimbursements[]` array.\n // TODO(post-2026-09-01): unify on the itemized path once that flag is removed.\n const usesItemizedReimbursements = !isOffCyclePayroll(payrollCategory)\n\n const initialReimbursements: Reimbursement[] = useMemo(\n () =>\n withReimbursements && usesItemizedReimbursements\n ? (employeeCompensation?.reimbursements ?? [])\n : [],\n [withReimbursements, usesItemizedReimbursements, employeeCompensation?.reimbursements],\n )\n\n const existingReimbursementFixedCompensation = useMemo(\n () =>\n employeeCompensation?.fixedCompensations?.find(\n comp => comp.name?.toLowerCase() === COMPENSATION_NAME_REIMBURSEMENT.toLowerCase(),\n ),\n [employeeCompensation?.fixedCompensations],\n )\n\n const showLegacyReimbursementField =\n withReimbursements && !usesItemizedReimbursements && Boolean(primaryJob?.uuid)\n\n const findMatchingCompensation = (jobUuid: string, compensationName: string) => {\n return employeeCompensation?.hourlyCompensations?.find(\n compensation =>\n compensation.jobUuid === jobUuid &&\n compensation.name?.toLowerCase() === compensationName.toLowerCase(),\n )\n }\n\n const getCompensationLabel = (compensationName?: string) => {\n switch (compensationName) {\n case COMPENSATION_NAME_REGULAR_HOURS:\n return t('compensationNames.regularHours')\n case COMPENSATION_NAME_OVERTIME:\n return t('compensationNames.overtime')\n case COMPENSATION_NAME_DOUBLE_OVERTIME:\n return t('compensationNames.doubleOvertime')\n default:\n return compensationName\n }\n }\n\n const getFixedCompensationLabel = (compensationName?: string) => {\n switch (compensationName) {\n case COMPENSATION_NAME_BONUS:\n return t('fixedCompensationNames.bonus')\n case COMPENSATION_NAME_PAYCHECK_TIPS:\n return t('fixedCompensationNames.paycheckTips')\n case COMPENSATION_NAME_CORRECTION_PAYMENT:\n return t('fixedCompensationNames.correctionPayment')\n case COMPENSATION_NAME_COMMISSION:\n return t('fixedCompensationNames.commission')\n case COMPENSATION_NAME_CASH_TIPS:\n return t('fixedCompensationNames.cashTips')\n case COMPENSATION_NAME_REIMBURSEMENT:\n return t('fixedCompensationNames.reimbursement')\n default:\n return compensationName\n }\n }\n\n const resolveDefaultPaymentMethod = () => {\n const preparedPaymentMethod = employeeCompensation?.paymentMethod\n\n if (!preparedPaymentMethod) {\n return hasDirectDepositSetup\n ? PayrollEmployeeCompensationsTypePaymentMethod.DirectDeposit\n : PayrollEmployeeCompensationsTypePaymentMethod.Check\n }\n\n if (\n !hasDirectDepositSetup &&\n preparedPaymentMethod === PayrollEmployeeCompensationsTypePaymentMethod.DirectDeposit\n ) {\n return PayrollEmployeeCompensationsTypePaymentMethod.Check\n }\n\n return preparedPaymentMethod\n }\n\n const defaultValues = {\n hourlyCompensations: (() => {\n const hourlyCompensations: PayrollEditEmployeeFormValues['hourlyCompensations'] = {}\n\n hourlyJobs.forEach(hourlyJob => {\n HOURS_COMPENSATION_NAMES.forEach(compensationName => {\n const matchingCompensation = findMatchingCompensation(hourlyJob.uuid, compensationName)\n if (matchingCompensation) {\n if (!hourlyCompensations[hourlyJob.uuid]) {\n hourlyCompensations[hourlyJob.uuid] = {}\n }\n hourlyCompensations[hourlyJob.uuid]![matchingCompensation.name!] =\n matchingCompensation.hours ? parseFloat(matchingCompensation.hours).toString() : ''\n }\n })\n })\n\n return hourlyCompensations\n })(),\n\n timeOffCompensations: (() => {\n const timeOffCompensations: PayrollEditEmployeeFormValues['timeOffCompensations'] = {}\n\n timeOff.forEach(timeOffCompensation => {\n timeOffCompensations[timeOffCompensation.name!] = timeOffCompensation.hours\n ? parseFloat(timeOffCompensation.hours).toString()\n : ''\n })\n\n return timeOffCompensations\n })(),\n\n finalPayoutCompensations: (() => {\n const finalPayoutCompensations: PayrollEditEmployeeFormValues['finalPayoutCompensations'] = {}\n\n timeOff.forEach(timeOffCompensation => {\n finalPayoutCompensations[timeOffCompensation.name!] =\n timeOffCompensation.finalPayoutUnusedHoursInput ?? '0'\n })\n\n return finalPayoutCompensations\n })(),\n\n fixedCompensations: (() => {\n const fixedCompensations: PayrollEditEmployeeFormValues['fixedCompensations'] = {}\n\n additionalEarnings.forEach(fixedComp => {\n fixedCompensations[fixedComp.name!] = fixedComp.amount ?? ''\n })\n\n if (showLegacyReimbursementField) {\n fixedCompensations[COMPENSATION_NAME_REIMBURSEMENT] =\n existingReimbursementFixedCompensation?.amount ?? '0.00'\n }\n\n return fixedCompensations\n })(),\n\n reimbursements: initialReimbursements.map(reimbursement => ({\n uuid: reimbursement.uuid ?? null,\n description: reimbursement.description ?? '',\n amount: reimbursement.amount,\n recurring: reimbursement.recurring ?? false,\n })),\n\n paymentMethod: resolveDefaultPaymentMethod(),\n }\n\n const formHandlers = useForm<PayrollEditEmployeeFormValues>({\n resolver: zodResolver(PayrollEditEmployeeFormSchema),\n defaultValues,\n })\n\n const {\n fields: reimbursementFields,\n append: appendReimbursement,\n remove: removeReimbursement,\n update: updateReimbursement,\n } = useFieldArray({\n control: formHandlers.control,\n name: 'reimbursements',\n })\n\n const handleRemoveReimbursement = (index: number) => {\n const field = reimbursementFields[index]\n if (!field) return\n\n if (field.uuid) {\n updateReimbursement(index, { ...field, amount: '0' })\n } else {\n removeReimbursement(index)\n }\n }\n\n type VisibleReimbursementRow = (typeof reimbursementFields)[number] & {\n originalIndex: number\n }\n\n const visibleReimbursementRows: VisibleReimbursementRow[] = reimbursementFields\n .map((field, originalIndex) => ({ ...field, originalIndex }))\n .filter(row => parseFloat(row.amount || '0') !== 0)\n\n const [isAddingReimbursement, setIsAddingReimbursement] = useState(false)\n\n type DraftReimbursementValues = z.infer<typeof DraftReimbursementSchema>\n\n const draftForm = useForm<DraftReimbursementValues>({\n resolver: zodResolver(DraftReimbursementSchema),\n defaultValues: { description: '', amount: '' },\n })\n\n const resetReimbursementDraft = () => {\n setIsAddingReimbursement(false)\n draftForm.reset()\n }\n\n const onDraftReimbursementValid = (data: DraftReimbursementValues) => {\n const parsedAmount = parseFloat(data.amount)\n appendReimbursement({\n uuid: null,\n description: data.description.trim(),\n amount: parsedAmount.toFixed(2),\n recurring: false,\n })\n resetReimbursementDraft()\n }\n\n const reimbursementDataViewProps = useDataView<VisibleReimbursementRow>({\n data: visibleReimbursementRows,\n columns: [\n {\n key: 'description',\n title: t('reimbursementDescriptionColumn'),\n render: row => row.description.trim() || t('reimbursementUnnamedFallback'),\n },\n {\n key: 'amount',\n title: t('reimbursementAmountColumn'),\n justify: 'end',\n render: row => formatNumberAsCurrency(parseFloat(row.amount || '0')),\n },\n {\n key: 'recurring',\n title: t('reimbursementTypeColumn'),\n render: row =>\n row.recurring ? t('reimbursementTypeRecurring') : t('reimbursementTypeOneTime'),\n },\n ],\n itemMenu: row => {\n if (row.recurring) return null\n const displayDescription = row.description.trim() || t('reimbursementUnnamedFallback')\n return (\n <ButtonIcon\n variant=\"tertiary\"\n onClick={() => {\n handleRemoveReimbursement(row.originalIndex)\n }}\n aria-label={t('removeReimbursementLabel', { description: displayDescription })}\n >\n <TrashCanSvg aria-hidden />\n </ButtonIcon>\n )\n },\n emptyState: () => (\n <EmptyData title={t('reimbursementEmptyTitle')}>\n <Button\n variant=\"secondary\"\n onClick={() => {\n setIsAddingReimbursement(true)\n }}\n icon={<PlusCircleIcon aria-hidden />}\n >\n {t('addReimbursementCta')}\n </Button>\n </EmptyData>\n ),\n })\n\n const watchedFormData = useWatch({\n control: formHandlers.control,\n })\n\n const currentGrossPay = useMemo(() => {\n try {\n const hourlyCompensations: Record<string, Record<string, string | undefined>> = {}\n if (watchedFormData.hourlyCompensations) {\n Object.entries(watchedFormData.hourlyCompensations).forEach(([jobId, compensations]) => {\n if (compensations) {\n hourlyCompensations[jobId] = compensations\n }\n })\n }\n\n const reimbursementsWithDefaults: PayrollEditEmployeeFormValues['reimbursements'] = (\n watchedFormData.reimbursements ?? []\n ).map(reimbursement => ({\n uuid: reimbursement.uuid ?? null,\n description: reimbursement.description ?? '',\n amount: reimbursement.amount ?? '0',\n recurring: reimbursement.recurring,\n }))\n\n const formDataWithDefaults: PayrollEditEmployeeFormValues = {\n hourlyCompensations,\n timeOffCompensations: watchedFormData.timeOffCompensations || {},\n finalPayoutCompensations: watchedFormData.finalPayoutCompensations || {},\n fixedCompensations: watchedFormData.fixedCompensations || {},\n reimbursements: reimbursementsWithDefaults,\n paymentMethod: watchedFormData.paymentMethod,\n }\n\n const updatedCompensation = buildCompensationFromFormData(\n formDataWithDefaults,\n employeeCompensation,\n (employeeCompensation?.paidTimeOff || []).filter(entry => entry.name),\n primaryJob?.uuid,\n payrollCategory,\n )\n\n return calculateGrossPay(\n updatedCompensation,\n employee,\n payPeriodStartDate,\n paySchedule,\n payrollCategory,\n )\n } catch {\n return employeeCompensation\n ? calculateGrossPay(\n employeeCompensation,\n employee,\n payPeriodStartDate,\n paySchedule,\n payrollCategory,\n )\n : 0\n }\n }, [\n watchedFormData,\n employeeCompensation,\n primaryJob?.uuid,\n employee,\n payPeriodStartDate,\n paySchedule,\n payrollCategory,\n ])\n\n const employeeName = firstLastName({\n first_name: employee.firstName,\n last_name: employee.lastName,\n })\n\n const onSubmit = (data: PayrollEditEmployeeFormValues) => {\n const updatedCompensation = buildCompensationFromFormData(\n data,\n employeeCompensation,\n timeOff,\n primaryJob?.uuid,\n payrollCategory,\n )\n onSave(updatedCompensation)\n }\n\n const formattedCurrentGrossPay = formatNumberAsCurrency(currentGrossPay || 0)\n\n const actions = (\n <Flex\n flexDirection={isSmallOrGreater ? 'row' : 'column'}\n justifyContent={isSmallOrGreater ? 'flex-end' : 'normal'}\n alignItems={isSmallOrGreater ? 'flex-start' : 'stretch'}\n gap={12}\n >\n <Button variant=\"secondary\" onClick={onCancel} title={t('cancelCta')}>\n {t('cancelCta')}\n </Button>\n <Button\n onClick={formHandlers.handleSubmit(onSubmit)}\n title={t('saveCta')}\n isLoading={isPending}\n >\n {t('saveCta')}\n </Button>\n </Flex>\n )\n\n return (\n <div ref={containerRef} className={classNames(styles.container, className)}>\n <div\n className={`${styles.headerSection} ${!isSmallOrGreater ? styles.headerSectionSticky : ''}`}\n >\n <Flex justifyContent=\"space-between\">\n <Flex flexDirection=\"column\" alignItems=\"stretch\" gap={isSmallOrGreater ? 8 : 2}>\n <Heading as=\"h1\" styledAs={isSmallOrGreater ? 'h2' : 'h4'}>\n {t('pageTitle', { employeeName })}\n </Heading>\n {isSmallOrGreater ? (\n <Flex flexDirection=\"column\" gap={6}>\n <Heading as=\"h2\" styledAs=\"h3\">\n {formattedCurrentGrossPay}\n </Heading>\n <Text className={styles.grossPayLabel}>{t('grossPayLabel')}</Text>\n </Flex>\n ) : (\n <Heading as=\"h2\" styledAs=\"h6\" className={styles.grossPayLabel}>\n {t('grossPayLabelMobile', { grossPay: formattedCurrentGrossPay })}\n </Heading>\n )}\n </Flex>\n {isSmallOrGreater && actions}\n </Flex>\n </div>\n <FormProvider {...formHandlers}>\n <Form>\n {hourlyJobs.length > 0 && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\">{t('regularHoursTitle')}</Heading>\n {hourlyJobs.map(hourlyJob => (\n <Flex key={hourlyJob.uuid} flexDirection=\"column\" gap={8}>\n {hourlyJobs.length > 1 && <Heading as=\"h4\">{hourlyJob.title}</Heading>}\n <Grid gridTemplateColumns={{ base: '1fr', small: [320, 320] }} gap={20}>\n {HOURS_COMPENSATION_NAMES.map(compensationName => {\n const employeeHourlyCompensation = findMatchingCompensation(\n hourlyJob.uuid,\n compensationName,\n )\n if (employeeHourlyCompensation) {\n return (\n <TextInputField\n key={compensationName}\n type=\"number\"\n min={0}\n adornmentEnd={t('hoursUnit')}\n label={getCompensationLabel(compensationName)}\n name={`hourlyCompensations.${hourlyJob.uuid}.${employeeHourlyCompensation.name}`}\n />\n )\n }\n })}\n </Grid>\n </Flex>\n ))}\n </div>\n )}\n {timeOff.length > 0 && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {payrollCategory === PayrollCategory.Dismissal\n ? t('timeOffTitleDismissal')\n : t('timeOffTitle')}\n </Heading>\n <Grid gridTemplateColumns={{ base: '1fr', small: [320, 320] }} gap={20}>\n {timeOff.map(timeOffEntry => (\n <TimeOffField\n key={timeOffEntry.name}\n timeOff={timeOffEntry}\n employee={employee}\n />\n ))}\n </Grid>\n </div>\n )}\n {payrollCategory === PayrollCategory.Dismissal && timeOff.length > 0 && (\n <div className={styles.fieldGroup}>\n <Flex flexDirection=\"column\" gap={4}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {t('finalPayoutTitle')}\n </Heading>\n <Text variant=\"supporting\">{t('finalPayoutDescription')}</Text>\n </Flex>\n <Grid gridTemplateColumns={{ base: '1fr', small: [320, 320] }} gap={20}>\n {timeOff.map(timeOffEntry => (\n <PayoutTimeOffField\n key={`payout-${timeOffEntry.name}`}\n timeOff={timeOffEntry}\n employee={employee}\n />\n ))}\n </Grid>\n </div>\n )}\n {additionalEarnings.length > 0 && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {t('additionalEarningsTitle')}\n </Heading>\n <Grid\n gridTemplateColumns={{ base: '1fr', small: [320, 320], large: [320, 320, 320] }}\n gap={20}\n >\n {additionalEarnings.map(fixedCompensation => (\n <TextInputField\n key={fixedCompensation.name}\n type=\"number\"\n min={0}\n adornmentStart=\"$\"\n label={getFixedCompensationLabel(fixedCompensation.name)}\n name={`fixedCompensations.${fixedCompensation.name}`}\n // useField only surfaces this once react-hook-form has flagged the\n // field, and the schema's only rule here is the negative-amount check.\n errorMessage={t('validations.negativeAmount')}\n />\n ))}\n </Grid>\n </div>\n )}\n {showLegacyReimbursementField && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {t('reimbursementTitle')}\n </Heading>\n <Grid gridTemplateColumns={{ base: '1fr', small: [320, 320] }} gap={20}>\n <TextInputField\n type=\"number\"\n min={0}\n adornmentStart=\"$\"\n label={getFixedCompensationLabel(COMPENSATION_NAME_REIMBURSEMENT)}\n name={`fixedCompensations.${COMPENSATION_NAME_REIMBURSEMENT}`}\n errorMessage={t('validations.negativeAmount')}\n />\n </Grid>\n </div>\n )}\n {withReimbursements && usesItemizedReimbursements && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {t('reimbursementTitle')}\n </Heading>\n {!(visibleReimbursementRows.length === 0 && isAddingReimbursement) && (\n <DataView label={t('reimbursementsTableLabel')} {...reimbursementDataViewProps} />\n )}\n {isAddingReimbursement ? (\n <FormProvider {...draftForm}>\n <Flex flexDirection=\"column\" gap={12}>\n <Grid gridTemplateColumns={{ base: '1fr', small: [320, 320] }} gap={20}>\n <TextInputField\n name=\"description\"\n label={t('reimbursementDescriptionLabel')}\n placeholder={t('reimbursementDescriptionPlaceholder')}\n />\n <TextInputField\n name=\"amount\"\n type=\"number\"\n min={0}\n adornmentStart=\"$\"\n isRequired\n label={t('reimbursementAmountLabel')}\n errorMessage={t('validations.reimbursementAmount')}\n />\n </Grid>\n <Flex gap={12}>\n <Button onClick={draftForm.handleSubmit(onDraftReimbursementValid)}>\n {t('saveReimbursementCta')}\n </Button>\n <Button variant=\"secondary\" onClick={resetReimbursementDraft}>\n {t('cancelReimbursementCta')}\n </Button>\n </Flex>\n </Flex>\n </FormProvider>\n ) : (\n visibleReimbursementRows.length > 0 && (\n <div>\n <Button\n variant=\"secondary\"\n onClick={() => {\n setIsAddingReimbursement(true)\n }}\n title={t('addReimbursementLink')}\n icon={<PlusCircleIcon aria-hidden />}\n >\n {t('addReimbursementLink')}\n </Button>\n </div>\n )\n )}\n </div>\n )}\n {hasDirectDepositSetup && (\n <div className={styles.fieldGroup}>\n <Heading as=\"h3\" styledAs=\"h4\">\n {t('paymentMethodTitle')}\n </Heading>\n <RadioGroupField\n name=\"paymentMethod\"\n isRequired\n label={t('paymentMethodLabel')}\n description={t('paymentMethodDescription')}\n options={[\n {\n value: PayrollEmployeeCompensationsTypePaymentMethod.DirectDeposit,\n label: t('paymentMethodOptions.directDeposit'),\n },\n {\n value: PayrollEmployeeCompensationsTypePaymentMethod.Check,\n label: t('paymentMethodOptions.check'),\n },\n ]}\n />\n </div>\n )}\n </Form>\n {!isSmallOrGreater && actions}\n </FormProvider>\n </div>\n )\n}\n"],"names":["ReimbursementFormSchema","z","DraftReimbursementSchema","val","num","nonNegativeAmountSchema","PayrollEditEmployeeFormSchema","PayrollEmployeeCompensationsTypePaymentMethod","buildCompensationFromFormData","formData","employeeCompensation","timeOff","primaryJobUuid","payrollCategory","PayrollCategory","updatedCompensation","compensation","hours","timeOffEntry","isDismissal","_","timeOffWithoutPayout","finalPayout","usesItemizedReimbursements","isOffCyclePayroll","updatedFixedCompensations","fixedCompensationName","formAmount","COMPENSATION_NAME_REIMBURSEMENT","existingFixedCompensation","fixedCompensation","resolvedAmount","reimbursement","PayrollEditEmployeePresentation","className","onSave","onCancel","employee","isPending","fixedCompensationTypes","payPeriodStartDate","paySchedule","withReimbursements","hasDirectDepositSetup","Button","ButtonIcon","Heading","Text","useComponentContext","t","useTranslation","useI18n","primaryJob","job","primaryJobHasHourlyCompensations","c","hourlyJobs","containerRef","useRef","isSmallOrGreater","useContainerBreakpoints","hourlyJob","entry","additionalEarnings","getAdditionalEarningsCompensations","EXCLUDED_ADDITIONAL_EARNINGS","initialReimbursements","useMemo","existingReimbursementFixedCompensation","comp","showLegacyReimbursementField","findMatchingCompensation","jobUuid","compensationName","getCompensationLabel","COMPENSATION_NAME_REGULAR_HOURS","COMPENSATION_NAME_OVERTIME","COMPENSATION_NAME_DOUBLE_OVERTIME","getFixedCompensationLabel","COMPENSATION_NAME_BONUS","COMPENSATION_NAME_PAYCHECK_TIPS","COMPENSATION_NAME_CORRECTION_PAYMENT","COMPENSATION_NAME_COMMISSION","COMPENSATION_NAME_CASH_TIPS","resolveDefaultPaymentMethod","preparedPaymentMethod","defaultValues","hourlyCompensations","HOURS_COMPENSATION_NAMES","matchingCompensation","timeOffCompensations","timeOffCompensation","finalPayoutCompensations","fixedCompensations","fixedComp","formHandlers","useForm","zodResolver","reimbursementFields","appendReimbursement","removeReimbursement","updateReimbursement","useFieldArray","handleRemoveReimbursement","index","field","visibleReimbursementRows","originalIndex","row","isAddingReimbursement","setIsAddingReimbursement","useState","draftForm","resetReimbursementDraft","onDraftReimbursementValid","data","parsedAmount","reimbursementDataViewProps","useDataView","formatNumberAsCurrency","displayDescription","jsx","TrashCanSvg","EmptyData","PlusCircleIcon","watchedFormData","useWatch","currentGrossPay","jobId","compensations","reimbursementsWithDefaults","formDataWithDefaults","calculateGrossPay","employeeName","firstLastName","onSubmit","formattedCurrentGrossPay","actions","jsxs","Flex","classNames","styles","FormProvider","Form","Grid","employeeHourlyCompensation","TextInputField","TimeOffField","PayoutTimeOffField","DataView","RadioGroupField"],"mappings":"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"}
@@ -68,7 +68,6 @@ const b = ({
68
68
  type: "number",
69
69
  min: 0,
70
70
  adornmentEnd: l("hoursUnit"),
71
- isRequired: !0,
72
71
  label: e.name,
73
72
  "aria-describedby": n
74
73
  },
@@ -1 +1 @@
1
- {"version":3,"file":"TimeOffField.js","sources":["../../../../src/components/Payroll/PayrollEditEmployee/TimeOffField.tsx"],"sourcesContent":["import { useId } from 'react'\nimport { useWatch, useFormContext } from 'react-hook-form'\nimport { useTranslation } from 'react-i18next'\nimport type { Employee } from '@gusto/embedded-api/models/components/employee'\nimport type { PayrollEmployeeCompensationsTypePaidTimeOff } from '@gusto/embedded-api/models/components/payrollemployeecompensationstype'\nimport type { PayrollEditEmployeeFormValues } from './PayrollEditEmployeePresentation'\nimport { Flex, TextInputField } from '@/components/Common'\nimport { useComponentContext } from '@/contexts/ComponentAdapter/useComponentContext'\nimport { useI18n } from '@/i18n'\n\n/** @internal */\nexport interface TimeOffFieldProps {\n /** The time-off entry whose hours the field captures. */\n timeOff: PayrollEmployeeCompensationsTypePaidTimeOff\n /** The employee whose accrual balance is displayed alongside the field. */\n employee: Employee\n}\n\nconst TimeOffBalance = ({\n accrualBalance,\n accrualMethod,\n hoursUsed,\n id,\n}: {\n accrualBalance: string\n accrualMethod?: string\n hoursUsed: number\n id: string\n}) => {\n const { Text } = useComponentContext()\n const { t } = useTranslation('Payroll.PayrollEditEmployee')\n\n if (accrualMethod === 'unlimited') {\n return null\n }\n\n const currentBalance = parseFloat(accrualBalance)\n const remainingBalance = currentBalance - hoursUsed\n\n return (\n <Text size=\"sm\" variant=\"supporting\" aria-live=\"polite\" aria-atomic={true} id={id}>\n {t('timeOffBalance.remaining', { balance: remainingBalance.toFixed(1) })}\n </Text>\n )\n}\n\n/** @internal */\nexport interface PayoutTimeOffFieldProps {\n /** The time-off entry whose final-payout hours the field captures. */\n timeOff: PayrollEmployeeCompensationsTypePaidTimeOff\n /** The employee whose accrual balance is displayed alongside the field. */\n employee: Employee\n}\n\n/** @internal */\nexport const PayoutTimeOffField = ({ timeOff, employee }: PayoutTimeOffFieldProps) => {\n const { t } = useTranslation('Payroll.PayrollEditEmployee')\n useI18n('Payroll.PayrollEditEmployee')\n\n const { control } = useFormContext<PayrollEditEmployeeFormValues>()\n const id = useId()\n\n const hoursUsedThisPeriod = useWatch({\n control,\n name: `timeOffCompensations.${timeOff.name}`,\n })\n\n if (!timeOff.name) {\n return null\n }\n\n const hoursUsed = parseFloat(hoursUsedThisPeriod || '0')\n const eligiblePolicy = employee.eligiblePaidTimeOff?.find(policy => policy.name === timeOff.name)\n\n return (\n <Flex flexDirection=\"column\" gap={4}>\n <TextInputField\n key={`payout-${timeOff.name}`}\n name={`finalPayoutCompensations.${timeOff.name}`}\n type=\"number\"\n min={0}\n adornmentEnd={t('hoursUnit')}\n label={timeOff.name}\n aria-describedby={id}\n />\n {eligiblePolicy?.accrualBalance && (\n <TimeOffBalance\n accrualBalance={eligiblePolicy.accrualBalance}\n accrualMethod={eligiblePolicy.accrualMethod ?? undefined}\n hoursUsed={hoursUsed}\n id={id}\n />\n )}\n </Flex>\n )\n}\n\n/** @internal */\nexport const TimeOffField = ({ timeOff, employee }: TimeOffFieldProps) => {\n const { t } = useTranslation('Payroll.PayrollEditEmployee')\n useI18n('Payroll.PayrollEditEmployee')\n\n const { control } = useFormContext<PayrollEditEmployeeFormValues>()\n const id = useId()\n\n const watchedValue = useWatch({\n control,\n name: `timeOffCompensations.${timeOff.name}`,\n })\n\n if (!timeOff.name) {\n return null\n }\n\n const hoursUsed = parseFloat(watchedValue || '0')\n const eligiblePolicy = employee.eligiblePaidTimeOff?.find(policy => policy.name === timeOff.name)\n\n return (\n <Flex flexDirection=\"column\" gap={4}>\n <TextInputField\n key={timeOff.name}\n name={`timeOffCompensations.${timeOff.name}`}\n type=\"number\"\n min={0}\n adornmentEnd={t('hoursUnit')}\n isRequired\n label={timeOff.name}\n aria-describedby={id}\n />\n {eligiblePolicy?.accrualBalance && (\n <TimeOffBalance\n accrualBalance={eligiblePolicy.accrualBalance}\n accrualMethod={eligiblePolicy.accrualMethod ?? undefined}\n hoursUsed={hoursUsed}\n id={id}\n />\n )}\n </Flex>\n )\n}\n"],"names":["TimeOffBalance","accrualBalance","accrualMethod","hoursUsed","id","Text","useComponentContext","useTranslation","remainingBalance","jsx","PayoutTimeOffField","timeOff","employee","t","useI18n","control","useFormContext","useId","hoursUsedThisPeriod","useWatch","eligiblePolicy","policy","jsxs","Flex","TextInputField","TimeOffField","watchedValue"],"mappings":"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"}
1
+ {"version":3,"file":"TimeOffField.js","sources":["../../../../src/components/Payroll/PayrollEditEmployee/TimeOffField.tsx"],"sourcesContent":["import { useId } from 'react'\nimport { useWatch, useFormContext } from 'react-hook-form'\nimport { useTranslation } from 'react-i18next'\nimport type { Employee } from '@gusto/embedded-api/models/components/employee'\nimport type { PayrollEmployeeCompensationsTypePaidTimeOff } from '@gusto/embedded-api/models/components/payrollemployeecompensationstype'\nimport type { PayrollEditEmployeeFormValues } from './PayrollEditEmployeePresentation'\nimport { Flex, TextInputField } from '@/components/Common'\nimport { useComponentContext } from '@/contexts/ComponentAdapter/useComponentContext'\nimport { useI18n } from '@/i18n'\n\n/** @internal */\nexport interface TimeOffFieldProps {\n /** The time-off entry whose hours the field captures. */\n timeOff: PayrollEmployeeCompensationsTypePaidTimeOff\n /** The employee whose accrual balance is displayed alongside the field. */\n employee: Employee\n}\n\nconst TimeOffBalance = ({\n accrualBalance,\n accrualMethod,\n hoursUsed,\n id,\n}: {\n accrualBalance: string\n accrualMethod?: string\n hoursUsed: number\n id: string\n}) => {\n const { Text } = useComponentContext()\n const { t } = useTranslation('Payroll.PayrollEditEmployee')\n\n if (accrualMethod === 'unlimited') {\n return null\n }\n\n const currentBalance = parseFloat(accrualBalance)\n const remainingBalance = currentBalance - hoursUsed\n\n return (\n <Text size=\"sm\" variant=\"supporting\" aria-live=\"polite\" aria-atomic={true} id={id}>\n {t('timeOffBalance.remaining', { balance: remainingBalance.toFixed(1) })}\n </Text>\n )\n}\n\n/** @internal */\nexport interface PayoutTimeOffFieldProps {\n /** The time-off entry whose final-payout hours the field captures. */\n timeOff: PayrollEmployeeCompensationsTypePaidTimeOff\n /** The employee whose accrual balance is displayed alongside the field. */\n employee: Employee\n}\n\n/** @internal */\nexport const PayoutTimeOffField = ({ timeOff, employee }: PayoutTimeOffFieldProps) => {\n const { t } = useTranslation('Payroll.PayrollEditEmployee')\n useI18n('Payroll.PayrollEditEmployee')\n\n const { control } = useFormContext<PayrollEditEmployeeFormValues>()\n const id = useId()\n\n const hoursUsedThisPeriod = useWatch({\n control,\n name: `timeOffCompensations.${timeOff.name}`,\n })\n\n if (!timeOff.name) {\n return null\n }\n\n const hoursUsed = parseFloat(hoursUsedThisPeriod || '0')\n const eligiblePolicy = employee.eligiblePaidTimeOff?.find(policy => policy.name === timeOff.name)\n\n return (\n <Flex flexDirection=\"column\" gap={4}>\n <TextInputField\n key={`payout-${timeOff.name}`}\n name={`finalPayoutCompensations.${timeOff.name}`}\n type=\"number\"\n min={0}\n adornmentEnd={t('hoursUnit')}\n label={timeOff.name}\n aria-describedby={id}\n />\n {eligiblePolicy?.accrualBalance && (\n <TimeOffBalance\n accrualBalance={eligiblePolicy.accrualBalance}\n accrualMethod={eligiblePolicy.accrualMethod ?? undefined}\n hoursUsed={hoursUsed}\n id={id}\n />\n )}\n </Flex>\n )\n}\n\n/** @internal */\nexport const TimeOffField = ({ timeOff, employee }: TimeOffFieldProps) => {\n const { t } = useTranslation('Payroll.PayrollEditEmployee')\n useI18n('Payroll.PayrollEditEmployee')\n\n const { control } = useFormContext<PayrollEditEmployeeFormValues>()\n const id = useId()\n\n const watchedValue = useWatch({\n control,\n name: `timeOffCompensations.${timeOff.name}`,\n })\n\n if (!timeOff.name) {\n return null\n }\n\n const hoursUsed = parseFloat(watchedValue || '0')\n const eligiblePolicy = employee.eligiblePaidTimeOff?.find(policy => policy.name === timeOff.name)\n\n return (\n <Flex flexDirection=\"column\" gap={4}>\n <TextInputField\n key={timeOff.name}\n name={`timeOffCompensations.${timeOff.name}`}\n type=\"number\"\n min={0}\n adornmentEnd={t('hoursUnit')}\n label={timeOff.name}\n aria-describedby={id}\n />\n {eligiblePolicy?.accrualBalance && (\n <TimeOffBalance\n accrualBalance={eligiblePolicy.accrualBalance}\n accrualMethod={eligiblePolicy.accrualMethod ?? undefined}\n hoursUsed={hoursUsed}\n id={id}\n />\n )}\n </Flex>\n )\n}\n"],"names":["TimeOffBalance","accrualBalance","accrualMethod","hoursUsed","id","Text","useComponentContext","useTranslation","remainingBalance","jsx","PayoutTimeOffField","timeOff","employee","t","useI18n","control","useFormContext","useId","hoursUsedThisPeriod","useWatch","eligiblePolicy","policy","jsxs","Flex","TextInputField","TimeOffField","watchedValue"],"mappings":";;;;;;;;AAkBA,MAAMA,IAAiB,CAAC;AAAA,EACtB,gBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,WAAAC;AAAA,EACA,IAAAC;AACF,MAKM;AACJ,QAAM,EAAE,MAAAC,EAAA,IAASC,EAAA,GACX,EAAE,EAAA,IAAMC,EAAe,6BAA6B;AAE1D,MAAIL,MAAkB;AACpB,WAAO;AAIT,QAAMM,IADiB,WAAWP,CAAc,IACNE;AAE1C,SACE,gBAAAM,EAACJ,KAAK,MAAK,MAAK,SAAQ,cAAa,aAAU,UAAS,eAAa,IAAM,IAAAD,GACxE,UAAA,EAAE,4BAA4B,EAAE,SAASI,EAAiB,QAAQ,CAAC,EAAA,CAAG,GACzE;AAEJ,GAWaE,IAAqB,CAAC,EAAE,SAAAC,GAAS,UAAAC,QAAwC;AACpF,QAAM,EAAE,GAAAC,EAAA,IAAMN,EAAe,6BAA6B;AAC1D,EAAAO,EAAQ,6BAA6B;AAErC,QAAM,EAAE,SAAAC,EAAA,IAAYC,EAAA,GACdZ,IAAKa,EAAA,GAELC,IAAsBC,EAAS;AAAA,IACnC,SAAAJ;AAAA,IACA,MAAM,wBAAwBJ,EAAQ,IAAI;AAAA,EAAA,CAC3C;AAED,MAAI,CAACA,EAAQ;AACX,WAAO;AAGT,QAAMR,IAAY,WAAWe,KAAuB,GAAG,GACjDE,IAAiBR,EAAS,qBAAqB,KAAK,OAAUS,EAAO,SAASV,EAAQ,IAAI;AAEhG,SACE,gBAAAW,EAACC,GAAA,EAAK,eAAc,UAAS,KAAK,GAChC,UAAA;AAAA,IAAA,gBAAAd;AAAA,MAACe;AAAA,MAAA;AAAA,QAEC,MAAM,4BAA4Bb,EAAQ,IAAI;AAAA,QAC9C,MAAK;AAAA,QACL,KAAK;AAAA,QACL,cAAcE,EAAE,WAAW;AAAA,QAC3B,OAAOF,EAAQ;AAAA,QACf,oBAAkBP;AAAA,MAAA;AAAA,MANb,UAAUO,EAAQ,IAAI;AAAA,IAAA;AAAA,IAQ5BS,GAAgB,kBACf,gBAAAX;AAAA,MAACT;AAAA,MAAA;AAAA,QACC,gBAAgBoB,EAAe;AAAA,QAC/B,eAAeA,EAAe,iBAAiB;AAAA,QAC/C,WAAAjB;AAAA,QACA,IAAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GAEJ;AAEJ,GAGaqB,IAAe,CAAC,EAAE,SAAAd,GAAS,UAAAC,QAAkC;AACxE,QAAM,EAAE,GAAAC,EAAA,IAAMN,EAAe,6BAA6B;AAC1D,EAAAO,EAAQ,6BAA6B;AAErC,QAAM,EAAE,SAAAC,EAAA,IAAYC,EAAA,GACdZ,IAAKa,EAAA,GAELS,IAAeP,EAAS;AAAA,IAC5B,SAAAJ;AAAA,IACA,MAAM,wBAAwBJ,EAAQ,IAAI;AAAA,EAAA,CAC3C;AAED,MAAI,CAACA,EAAQ;AACX,WAAO;AAGT,QAAMR,IAAY,WAAWuB,KAAgB,GAAG,GAC1CN,IAAiBR,EAAS,qBAAqB,KAAK,OAAUS,EAAO,SAASV,EAAQ,IAAI;AAEhG,SACE,gBAAAW,EAACC,GAAA,EAAK,eAAc,UAAS,KAAK,GAChC,UAAA;AAAA,IAAA,gBAAAd;AAAA,MAACe;AAAA,MAAA;AAAA,QAEC,MAAM,wBAAwBb,EAAQ,IAAI;AAAA,QAC1C,MAAK;AAAA,QACL,KAAK;AAAA,QACL,cAAcE,EAAE,WAAW;AAAA,QAC3B,OAAOF,EAAQ;AAAA,QACf,oBAAkBP;AAAA,MAAA;AAAA,MANbO,EAAQ;AAAA,IAAA;AAAA,IAQdS,GAAgB,kBACf,gBAAAX;AAAA,MAACT;AAAA,MAAA;AAAA,QACC,gBAAgBoB,EAAe;AAAA,QAC/B,eAAeA,EAAe,iBAAiB;AAAA,QAC/C,WAAAjB;AAAA,QACA,IAAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GAEJ;AAEJ;"}