@gusto/embedded-react-sdk 0.37.0-rc.2 → 0.37.0-rc.3
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/README.md +3 -0
- package/dist/components/Company/AssignSignatory/CreateSignatory/CreateSignatoryForm.js +11 -11
- package/dist/components/Company/PaySchedule/_parts/Edit.js +6 -6
- package/dist/components/Contractor/Profile/ContractorProfileForm.js +15 -15
- package/dist/components/Employee/DocumentSigner/EmploymentEligibility/EmploymentEligibilityPresentation.js +16 -16
- package/dist/components/Employee/Profile/PersonalDetailsInputs.js +1 -1
- package/dist/components/Employee/Terminations/TerminateEmployee/TerminateEmployeePresentation.js +10 -10
- package/dist/components/Payroll/ConfirmWireDetails/ConfirmWireDetailsForm/ConfirmWireDetailsForm.js +10 -10
- package/dist/components/Payroll/Dismissal/DismissalPayPeriodSelection/DismissalPayPeriodSelection.js +44 -46
- package/dist/components/Payroll/Dismissal/DismissalPayPeriodSelection/DismissalPayPeriodSelection.js.map +1 -1
- package/dist/components/Payroll/OffCycle/OffCycleFlowComponents.js +25 -23
- package/dist/components/Payroll/OffCycle/OffCycleFlowComponents.js.map +1 -1
- package/dist/components/Payroll/OffCyclePayPeriodDateForm/OffCyclePayPeriodDateFormPresentation.js +1 -1
- package/dist/components/Payroll/PayrollConfiguration/PayrollConfiguration.js +105 -106
- package/dist/components/Payroll/PayrollConfiguration/PayrollConfiguration.js.map +1 -1
- package/dist/components/Payroll/PayrollConfiguration/PayrollConfigurationPresentation.js +54 -54
- package/dist/components/Payroll/PayrollConfiguration/PayrollConfigurationPresentation.js.map +1 -1
- package/dist/components/Payroll/PayrollExecutionFlow/PayrollExecutionFlow.d.ts +2 -1
- package/dist/components/Payroll/PayrollExecutionFlow/PayrollExecutionFlow.js +29 -27
- package/dist/components/Payroll/PayrollExecutionFlow/PayrollExecutionFlow.js.map +1 -1
- package/dist/components/Payroll/PayrollExecutionFlow/index.d.ts +1 -1
- package/dist/components/Payroll/PayrollExecutionFlow/payrollExecutionMachine.d.ts +1 -1
- package/dist/components/Payroll/PayrollExecutionFlow/payrollExecutionMachine.js +60 -60
- package/dist/components/Payroll/PayrollExecutionFlow/payrollExecutionMachine.js.map +1 -1
- package/dist/components/Payroll/PayrollFlow/PayrollExecutionFlowContextual.js +22 -20
- package/dist/components/Payroll/PayrollFlow/PayrollExecutionFlowContextual.js.map +1 -1
- package/dist/components/Payroll/PayrollOverview/PayrollOverviewPresentation.js +143 -143
- package/dist/components/Payroll/PayrollOverview/PayrollOverviewPresentation.js.map +1 -1
- package/dist/components/Payroll/TransitionCreation/TransitionCreationPresentation.js +10 -10
- package/dist/components/Payroll/helpers.d.ts +1 -0
- package/dist/components/Payroll/helpers.js +71 -69
- package/dist/components/Payroll/helpers.js.map +1 -1
- package/dist/components/UNSTABLE_Hooks/hooks/useCompensationForm/compensationSchema.d.ts +4 -4
- package/dist/components/UNSTABLE_Hooks/hooks/useCompensationForm/compensationSchema.js +86 -89
- package/dist/components/UNSTABLE_Hooks/hooks/useCompensationForm/compensationSchema.js.map +1 -1
- package/dist/i18n/en/Payroll.PayrollConfiguration.json.js +38 -34
- package/dist/i18n/en/Payroll.PayrollConfiguration.json.js.map +1 -1
- package/dist/i18n/en/Payroll.PayrollOverview.json.js +62 -58
- package/dist/i18n/en/Payroll.PayrollOverview.json.js.map +1 -1
- package/dist/types/i18next.d.ts +4 -0
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sources":["../../../src/components/Payroll/helpers.ts"],"sourcesContent":["import type { Employee } from '@gusto/embedded-api/models/components/employee'\nimport type { PayrollShowFixedCompensations } from '@gusto/embedded-api/models/components/payroll'\nimport type { PayrollEmployeeCompensationsTypeFixedCompensations as FixedCompensations } from '@gusto/embedded-api/models/components/payrollemployeecompensationstype'\nimport type { PayrollFixedCompensationTypesType } from '@gusto/embedded-api/models/components/payrollfixedcompensationtypestype'\nimport { useCallback } from 'react'\nimport type { TFunction } from 'i18next'\nimport { useTranslation } from 'react-i18next'\nimport type { PayScheduleObject } from '@gusto/embedded-api/models/components/payscheduleobject'\nimport type { Compensation, MinimumWages } from '@gusto/embedded-api/models/components/compensation'\nimport type { PayrollEmployeeCompensationsType } from '@gusto/embedded-api/models/components/payrollemployeecompensationstype'\nimport type { Payroll } from '@gusto/embedded-api/models/components/payroll'\nimport type { PayrollType } from './PayrollList/types'\nimport { PayrollCategory, isOffCyclePayroll } from './payrollTypes'\nimport { formatPayRate } from '@/helpers/formattedStrings'\nimport { useLocale } from '@/contexts/LocaleProvider/useLocale'\nimport { COMPENSATION_NAME_REIMBURSEMENT, FlsaStatus } from '@/shared/constants'\nimport { MS_PER_HOUR } from '@/helpers/dateFormatting'\nconst REGULAR_HOURS_NAME = 'regular hours'\n\n// Utility to get the primary job from an employee\nexport const getPrimaryJob = (employee: Employee) => {\n return employee.jobs?.find(job => job.primary) || employee.jobs?.[0] || null\n}\n\nconst roundToSixDecimals = (value: number): number => {\n return Math.round(value * 1_000_000) / 1_000_000\n}\n\nconst roundToTwoDecimals = (value: number): number => {\n return Math.round(value * 100) / 100\n}\n\nconst isRegularHours = (compensationName: string): boolean => {\n return compensationName.toLowerCase() === REGULAR_HOURS_NAME\n}\n\nconst PAY_PERIOD_HOURS_MAPPINGS: Record<string, number> = {\n Daily: 8.0,\n 'Every week': 40.0,\n 'Every other week': 80.0,\n 'Twice per month': 86.666667,\n Monthly: 173.333333,\n Quarterly: 520.0,\n Semiannually: 1040.0,\n Annually: 2080.0,\n}\n\nexport const formatEmployeePayRate = ({\n employee,\n t,\n locale = 'en-US',\n}: {\n employee?: Employee\n t: TFunction\n locale?: string\n}) => {\n if (!employee?.jobs) {\n return null\n }\n\n const primaryJob = getPrimaryJob(employee)\n if (!primaryJob?.compensations) {\n return null\n }\n\n const jobCompensation = primaryJob.compensations[0]\n if (!jobCompensation) {\n return null\n }\n if (!jobCompensation.rate || parseFloat(jobCompensation.rate) === 0) {\n return null\n }\n\n const rate = parseFloat(jobCompensation.rate)\n const paymentUnit = jobCompensation.paymentUnit || 'Hour'\n\n return formatPayRate({ rate, paymentUnit, t, locale })\n}\n\nexport const useFormatEmployeePayRate = () => {\n const { t } = useTranslation('common')\n const { locale } = useLocale()\n\n return useCallback(\n (employee?: Employee) => {\n return formatEmployeePayRate({ employee, t, locale })\n },\n [t, locale],\n )\n}\n\nexport const getEmployeePayRateInfo = (employee: Employee | undefined) => {\n if (!employee?.jobs) {\n return null\n }\n\n const primaryJob = getPrimaryJob(employee)\n if (!primaryJob?.compensations) {\n return null\n }\n\n const jobCompensation = primaryJob.compensations[0]\n if (!jobCompensation) {\n return null\n }\n if (!jobCompensation.rate || parseFloat(jobCompensation.rate) === 0) {\n return null\n }\n\n const rate = parseFloat(jobCompensation.rate)\n const paymentUnit = jobCompensation.paymentUnit || 'Hour'\n\n return { rate, paymentUnit }\n}\n\nexport const getRegularHours = (compensation: PayrollEmployeeCompensationsType) => {\n if (!compensation.hourlyCompensations) return 0\n\n return compensation.hourlyCompensations\n .filter(hourlyCompensation => hourlyCompensation.name?.toLowerCase() === 'regular hours')\n .reduce((sum, hourlyCompensation) => sum + parseFloat(hourlyCompensation.hours || '0'), 0)\n}\n\nexport function getOvertimeHours(compensation: PayrollEmployeeCompensationsType) {\n if (!compensation.hourlyCompensations || compensation.excluded) {\n return 0\n }\n\n return compensation.hourlyCompensations\n .filter(hourlyCompensation => Number(hourlyCompensation.compensationMultiplier) > 1)\n .reduce((sum, hourlyCompensation) => sum + parseFloat(hourlyCompensation.hours || '0'), 0)\n}\n\nexport const getTotalPtoHours = (compensation: PayrollEmployeeCompensationsType) => {\n if (!compensation.paidTimeOff) {\n return 0\n }\n return compensation.paidTimeOff.reduce((sum, pto) => sum + parseFloat(pto.hours || '0'), 0)\n}\n\nexport const getAdditionalEarnings = (compensation: PayrollEmployeeCompensationsType) => {\n if (!compensation.fixedCompensations) {\n return 0\n }\n\n return compensation.fixedCompensations\n .filter(fixedCompensation => {\n const name = fixedCompensation.name?.toLowerCase() || ''\n const amount = parseFloat(fixedCompensation.amount || '0')\n return name !== 'reimbursement' && name !== 'minimum wage adjustment' && amount > 0\n })\n .reduce((sum, fixedCompensation) => sum + parseFloat(fixedCompensation.amount || '0'), 0)\n}\n\nexport const getReimbursements = (compensation: PayrollEmployeeCompensationsType) => {\n if (!compensation.fixedCompensations) {\n return 0\n }\n\n const reimbursementComp = compensation.fixedCompensations.find(\n fixedCompensation => fixedCompensation.name?.toLowerCase() === 'reimbursement',\n )\n return reimbursementComp ? parseFloat(reimbursementComp.amount || '0') : 0\n}\n\nexport const formatHoursDisplay = (hours: number): string => {\n const rounded = roundToTwoDecimals(hours)\n\n if (rounded % 1 === 0) {\n return `${rounded}.0`\n }\n\n return rounded.toString()\n}\n\nconst getHoursInPayPeriod = (paySchedule: PayScheduleObject): number => {\n if (!paySchedule.frequency) {\n return 0\n }\n\n return PAY_PERIOD_HOURS_MAPPINGS[paySchedule.frequency] || 0\n}\n\nconst getEffectiveCompensation = (\n compensations: Compensation[],\n effectiveDate: Date,\n): Compensation | null => {\n if (!compensations.length) return null\n\n const sorted = [...compensations].sort(\n (a, b) =>\n (a.effectiveDate ? new Date(a.effectiveDate).getTime() : 0) -\n (b.effectiveDate ? new Date(b.effectiveDate).getTime() : 0),\n )\n\n for (let i = sorted.length - 1; i >= 0; i--) {\n const currentDateString = sorted[i]?.effectiveDate\n const currentDate = currentDateString ? new Date(currentDateString) : null\n if (currentDate && currentDate <= effectiveDate) {\n return sorted[i] || null\n }\n }\n\n return sorted[0] || null\n}\n\nconst getEffectiveMinimumWage = (\n minimumWages: MinimumWages[],\n effectiveDate: Date,\n): MinimumWages | null => {\n if (!minimumWages.length) return null\n\n const sorted = [...minimumWages].sort(\n (a, b) =>\n (a.effectiveDate ? new Date(a.effectiveDate).getTime() : 0) -\n (b.effectiveDate ? new Date(b.effectiveDate).getTime() : 0),\n )\n\n for (let i = sorted.length - 1; i >= 0; i--) {\n const currentDateString = sorted[i]?.effectiveDate\n const currentDate = currentDateString ? new Date(currentDateString) : null\n if (currentDate && currentDate <= effectiveDate) {\n return sorted[i] || null\n }\n }\n\n return sorted[0] || null\n}\n\nconst isSalaried = (compensation: Compensation): boolean => {\n return compensation.flsaStatus === 'Exempt' || compensation.flsaStatus === 'Salaried Nonexempt'\n}\n\nconst getTotalTipCompensations = (fixedCompensations: PayrollShowFixedCompensations[]): number => {\n if (!fixedCompensations.length) return 0\n\n return fixedCompensations\n .filter(fixedCompensation => {\n const name = fixedCompensation.name?.toLowerCase()\n const amount = parseFloat(fixedCompensation.amount || '0')\n return (name === 'paycheck tips' || name === 'cash tips') && amount > 0\n })\n .reduce((sum, fixedCompensation) => sum + parseFloat(fixedCompensation.amount || '0'), 0)\n}\n\nconst calculateHourlyRate = (compensation: Compensation): number => {\n const rate = parseFloat(compensation.rate || '0')\n const paymentUnit = compensation.paymentUnit || 'Hour'\n\n switch (paymentUnit) {\n case 'Hour':\n return rate\n case 'Year':\n return rate / 2080 // 52 weeks * 40 hours\n case 'Month':\n return rate / 173.333333\n case 'Week':\n return rate / 40\n case 'Paycheck':\n return 0 // Paycheck rate is 0 for hourly calculation\n default:\n return rate\n }\n}\n\nconst getHourlyRateForJob = (employee: Employee, jobUuid: string, effectiveDate: Date): number => {\n const job = employee.jobs?.find(j => j.uuid === jobUuid)\n if (!job?.compensations) {\n return 0\n }\n\n const compensation = getEffectiveCompensation(job.compensations, effectiveDate)\n return compensation ? calculateHourlyRate(compensation) : 0\n}\n\nconst getPrimaryHourlyRate = (employee: Employee, effectiveDate: Date): number => {\n const primaryJob = getPrimaryJob(employee)\n if (!primaryJob?.compensations) {\n return 0\n }\n\n const compensation = getEffectiveCompensation(primaryJob.compensations, effectiveDate)\n return compensation ? calculateHourlyRate(compensation) : 0\n}\n\nconst getTotalOutstandingPtoHours = (compensation: PayrollEmployeeCompensationsType): number => {\n if (!compensation.paidTimeOff) {\n return 0\n }\n\n return compensation.paidTimeOff.reduce(\n (sum, paidTimeOff) => sum + parseFloat(paidTimeOff.finalPayoutUnusedHoursInput || '0'),\n 0,\n )\n}\n\nconst getPtoHours = (\n compensation: PayrollEmployeeCompensationsType,\n isSalariedWithExpectedHours: boolean,\n hoursInPayPeriod: number,\n offCycle: boolean,\n): number => {\n const regularPtoHours = getTotalPtoHours(compensation)\n\n if (offCycle) {\n const outstandingPtoHours = getTotalOutstandingPtoHours(compensation)\n return regularPtoHours + outstandingPtoHours\n }\n\n if (isSalariedWithExpectedHours) {\n return Math.min(hoursInPayPeriod, regularPtoHours)\n }\n\n return regularPtoHours\n}\n\nconst calculateMinimumWageAdjustment = (\n primaryCompensation: Compensation,\n compensation: PayrollEmployeeCompensationsType,\n effectiveDate: Date,\n): number => {\n if (!primaryCompensation.adjustForMinimumWage) return 0\n\n const effectiveMinWage = getEffectiveMinimumWage(\n primaryCompensation.minimumWages || [],\n effectiveDate,\n )\n if (!effectiveMinWage) {\n return 0\n }\n\n const totalHours =\n compensation.hourlyCompensations?.reduce(\n (sum, hourlyCompensation) => sum + parseFloat(hourlyCompensation.hours || '0'),\n 0,\n ) || 0\n\n const hourlyRate = calculateHourlyRate(primaryCompensation)\n\n const totalTipCredit = (parseFloat(effectiveMinWage.wage || '0') - hourlyRate) * totalHours\n const totalTips = getTotalTipCompensations(compensation.fixedCompensations || [])\n\n return Math.max(0, totalTipCredit - totalTips)\n}\n\nconst calculateRegularPlusOvertimePay = (\n compensation: PayrollEmployeeCompensationsType,\n employee: Employee,\n effectiveDate: Date,\n isSalariedWithExpectedHours: boolean,\n hoursInPayPeriod: number,\n ptoHours: number,\n isOffCycle: boolean,\n): number => {\n if (!isOffCycle && isSalariedWithExpectedHours) {\n const primaryHourlyRate = getPrimaryHourlyRate(employee, effectiveDate)\n return primaryHourlyRate * (hoursInPayPeriod - ptoHours)\n }\n\n if (!compensation.hourlyCompensations || !employee.jobs) {\n return 0\n }\n\n const regularRatePay = compensation.hourlyCompensations.reduce((sum, hc) => {\n const hours = parseFloat(hc.hours || '0')\n const hourlyRate = getHourlyRateForJob(employee, hc.jobUuid || '', effectiveDate)\n return sum + hours * hourlyRate\n }, 0)\n\n const totalHours = compensation.hourlyCompensations.reduce((sum, hc) => {\n return sum + parseFloat(hc.hours || '0')\n }, 0)\n\n if (totalHours === 0) return regularRatePay\n\n const overtimeWeightedRate = roundToSixDecimals(regularRatePay / totalHours)\n\n // Calculate overtime pay for non-regular hours\n const overtimePay = compensation.hourlyCompensations\n .filter(hc => !isRegularHours(hc.name || ''))\n .reduce((sum, hc) => {\n const hours = parseFloat(hc.hours || '0')\n const multiplier = hc.compensationMultiplier || 1\n return sum + hours * overtimeWeightedRate * (multiplier - 1)\n }, 0)\n\n return regularRatePay + overtimePay\n}\n\nconst calculatePtoPay = (\n compensation: PayrollEmployeeCompensationsType,\n employee: Employee,\n effectiveDate: Date,\n isSalariedWithExpectedHours: boolean,\n hoursInPayPeriod: number,\n offCycle: boolean,\n): number => {\n const ptoHours = getPtoHours(\n compensation,\n isSalariedWithExpectedHours,\n hoursInPayPeriod,\n offCycle,\n )\n const primaryHourlyRate = getPrimaryHourlyRate(employee, effectiveDate)\n return ptoHours * primaryHourlyRate\n}\n\nconst isSalariedWithPayPeriodExpectedHours = (\n compensation: PayrollEmployeeCompensationsType,\n isSalaried: boolean,\n hoursInPayPeriod: number,\n): boolean => {\n if (!isSalaried) return false\n\n const regularHourlyCompensation = compensation.hourlyCompensations?.find(hourlyCompensation =>\n isRegularHours(hourlyCompensation.name || ''),\n )\n\n if (!regularHourlyCompensation) return false\n\n const regularHours = parseFloat(regularHourlyCompensation.hours || '0')\n return regularHours === hoursInPayPeriod\n}\n\nexport const calculateGrossPay = (\n compensation: PayrollEmployeeCompensationsType,\n employee: Employee,\n compensationEffectiveDateString?: string,\n paySchedule?: PayScheduleObject,\n payrollCategory: PayrollCategory = PayrollCategory.Regular,\n): number => {\n if (compensation.excluded) {\n return 0\n }\n\n const compensationEffectiveDate = compensationEffectiveDateString\n ? new Date(compensationEffectiveDateString)\n : new Date()\n\n const primaryJob = getPrimaryJob(employee)\n if (!primaryJob?.compensations) {\n return 0\n }\n\n const primaryCompensation = getEffectiveCompensation(\n primaryJob.compensations,\n compensationEffectiveDate,\n )\n\n if (!primaryCompensation) {\n return 0\n }\n\n const salaried = isSalaried(primaryCompensation)\n const hoursInPayPeriod = paySchedule ? getHoursInPayPeriod(paySchedule) : 0\n\n const isSalariedWithExpectedHours = isSalariedWithPayPeriodExpectedHours(\n compensation,\n salaried,\n hoursInPayPeriod,\n )\n\n const offCycle = isOffCyclePayroll(payrollCategory)\n\n const ptoHours = getPtoHours(\n compensation,\n isSalariedWithExpectedHours,\n hoursInPayPeriod,\n offCycle,\n )\n\n const regularPlusOvertimePay = calculateRegularPlusOvertimePay(\n compensation,\n employee,\n compensationEffectiveDate,\n isSalariedWithExpectedHours,\n hoursInPayPeriod,\n ptoHours,\n offCycle,\n )\n\n const fixedPay = getAdditionalEarnings(compensation)\n const ptoPay = calculatePtoPay(\n compensation,\n employee,\n compensationEffectiveDate,\n isSalariedWithExpectedHours,\n hoursInPayPeriod,\n offCycle,\n )\n const minimumWageAdjustment = calculateMinimumWageAdjustment(\n primaryCompensation,\n compensation,\n compensationEffectiveDate,\n )\n\n const total = regularPlusOvertimePay + fixedPay + ptoPay + minimumWageAdjustment\n return roundToTwoDecimals(total)\n}\n\n// Payroll type and status utilities\nexport const getPayrollType = (payroll: {\n external?: boolean\n offCycle?: boolean\n}): PayrollType => {\n if (payroll.external) return 'External'\n if (payroll.offCycle) return 'Off-Cycle'\n return 'Regular'\n}\n\nconst OFF_CYCLE_REASON_LABELS: Record<string, string> = {\n Bonus: 'Bonus',\n Correction: 'Correction',\n 'Transition from old pay schedule': 'Transition',\n 'Dismissed employee': 'Dismissal',\n 'Hired employee': 'New Hire',\n 'Benefit reversal': 'Benefit Reversal',\n 'Wage correction': 'Wage Correction',\n 'Tax reconciliation': 'Tax Reconciliation',\n Reversal: 'Reversal',\n 'Disability insurance distribution': 'Disability Insurance',\n}\n\nexport const getPayrollTypeLabel = (payroll: {\n external?: boolean\n offCycle?: boolean\n offCycleReason?: string | null\n}): string => {\n if (payroll.external) return 'External'\n if (payroll.offCycle && payroll.offCycleReason) {\n return OFF_CYCLE_REASON_LABELS[payroll.offCycleReason] ?? payroll.offCycleReason\n }\n if (payroll.offCycle) return 'Off-Cycle'\n return 'Regular'\n}\n\nexport const getAdditionalEarningsCompensations = ({\n flsaStatus,\n existingFixedCompensations = [],\n primaryJobUuid,\n fixedCompensationTypes = [],\n excludedTypes = [],\n}: {\n flsaStatus: string | undefined\n existingFixedCompensations?: FixedCompensations[]\n primaryJobUuid?: string\n fixedCompensationTypes?: PayrollFixedCompensationTypesType[]\n excludedTypes?: string[]\n}): FixedCompensations[] => {\n const allFixedCompensations = [...existingFixedCompensations]\n\n if (flsaStatus !== FlsaStatus.OWNER && primaryJobUuid && fixedCompensationTypes.length > 0) {\n const compensationTypeNames = fixedCompensationTypes\n .map(type => type.name)\n .filter(Boolean) as string[]\n\n compensationTypeNames.forEach(compensationName => {\n const exists = allFixedCompensations.some(\n comp => comp.name?.toLowerCase() === compensationName.toLowerCase(),\n )\n\n if (!exists) {\n allFixedCompensations.push({\n name: compensationName,\n amount: '0.00',\n jobUuid: primaryJobUuid,\n })\n }\n })\n }\n\n // Filter and sort additional earnings (exclude specified types)\n return allFixedCompensations\n .filter(comp => comp.name && !excludedTypes.includes(comp.name))\n .sort((a, b) => (a.name || '').localeCompare(b.name || ''))\n}\n\nexport const getReimbursementCompensation = (\n fixedCompensations: FixedCompensations[],\n fixedCompensationTypes: PayrollFixedCompensationTypesType[],\n primaryJobUuid?: string,\n) => {\n const reimbursementCompensation = fixedCompensations.find(\n comp => comp.name?.toLowerCase() === COMPENSATION_NAME_REIMBURSEMENT.toLowerCase(),\n )\n\n if (reimbursementCompensation) {\n return reimbursementCompensation\n }\n\n if (\n primaryJobUuid &&\n fixedCompensationTypes.some(\n type => type.name?.toLowerCase() === COMPENSATION_NAME_REIMBURSEMENT.toLowerCase(),\n )\n ) {\n return {\n name: COMPENSATION_NAME_REIMBURSEMENT,\n amount: '0.00',\n jobUuid: primaryJobUuid,\n }\n }\n\n return null\n}\n\nexport const hasDirectDepositEmployees = (\n employeeCompensations?: Array<{ paymentMethod?: string | null; excluded?: boolean }>,\n): boolean => {\n if (!employeeCompensations || employeeCompensations.length === 0) return true\n const activeCompensations = employeeCompensations.filter(comp => !comp.excluded)\n if (activeCompensations.length === 0) return true\n return activeCompensations.some(comp => comp.paymentMethod === 'Direct Deposit')\n}\n\n// Total Payroll = Gross Pay + Employer Taxes + Reimbursements + Benefits\nexport const calculateTotalPayroll = (payrollData: Payroll) => {\n const totalPayroll = payrollData.totals\n ? Number(payrollData.totals.grossPay ?? 0) +\n Number(payrollData.totals.employerTaxes ?? 0) +\n Number(payrollData.totals.reimbursements ?? 0) +\n Number(payrollData.totals.benefits ?? 0)\n : 0\n\n return totalPayroll\n}\n\n/**\n * Converts a Date to Pacific Time considering Daylight Saving Time.\n * Returns the UTC offset in hours (e.g., -7 for PDT, -8 for PST).\n *\n * DST rules for Pacific Time:\n * - Starts: Second Sunday in March at 2:00 AM\n * - Ends: First Sunday in November at 2:00 AM\n */\nconst getPacificTimeOffset = (date: Date): number => {\n const year = date.getFullYear()\n\n const secondSundayMarch = new Date(year, 2, 1)\n secondSundayMarch.setDate(1 + (7 - secondSundayMarch.getDay()) + 7)\n\n const firstSundayNovember = new Date(year, 10, 1)\n firstSundayNovember.setDate(1 + ((7 - firstSundayNovember.getDay()) % 7))\n\n const isDST = date >= secondSundayMarch && date < firstSundayNovember\n return isDST ? -7 : -8\n}\n\n/**\n * Determines if a payroll can be cancelled based on business rules.\n *\n * A payroll can be cancelled if all of the following conditions are met:\n * - The payroll has been processed (processed === true)\n * - Current time is before 4:00 PM PT on the payroll deadline\n * - The payrollStatusMeta.cancellable flag is not explicitly false\n *\n * This check enforces the business rule that payrolls can only be cancelled\n * before the 4:00 PM PT cutoff time on their deadline date.\n */\nexport const canCancelPayroll = (payroll: Payroll): boolean => {\n if (payroll.payrollStatusMeta?.cancellable === false) {\n return false\n }\n\n if (!payroll.processed) {\n return false\n }\n\n if (!payroll.payrollDeadline) {\n return false\n }\n\n const now = new Date()\n const deadline = new Date(payroll.payrollDeadline)\n\n const nowInPT = new Date(now.getTime() + getPacificTimeOffset(now) * MS_PER_HOUR)\n const deadlineInPT = new Date(deadline.getTime() + getPacificTimeOffset(deadline) * MS_PER_HOUR)\n\n const cutoffTime = new Date(deadlineInPT)\n cutoffTime.setUTCHours(16, 0, 0, 0)\n\n if (nowInPT >= cutoffTime) {\n return false\n }\n\n return true\n}\n"],"names":["REGULAR_HOURS_NAME","getPrimaryJob","employee","job","roundToSixDecimals","value","roundToTwoDecimals","isRegularHours","compensationName","PAY_PERIOD_HOURS_MAPPINGS","formatEmployeePayRate","locale","primaryJob","jobCompensation","rate","paymentUnit","formatPayRate","useFormatEmployeePayRate","t","useTranslation","useLocale","useCallback","getRegularHours","compensation","hourlyCompensation","sum","getOvertimeHours","getTotalPtoHours","pto","getAdditionalEarnings","fixedCompensation","name","amount","getReimbursements","reimbursementComp","formatHoursDisplay","hours","rounded","getHoursInPayPeriod","paySchedule","getEffectiveCompensation","compensations","effectiveDate","sorted","a","b","i","currentDateString","currentDate","getEffectiveMinimumWage","minimumWages","isSalaried","getTotalTipCompensations","fixedCompensations","calculateHourlyRate","getHourlyRateForJob","jobUuid","j","getPrimaryHourlyRate","getTotalOutstandingPtoHours","paidTimeOff","getPtoHours","isSalariedWithExpectedHours","hoursInPayPeriod","offCycle","regularPtoHours","outstandingPtoHours","calculateMinimumWageAdjustment","primaryCompensation","effectiveMinWage","totalHours","hourlyRate","totalTipCredit","totalTips","calculateRegularPlusOvertimePay","ptoHours","isOffCycle","regularRatePay","hc","overtimeWeightedRate","overtimePay","multiplier","calculatePtoPay","primaryHourlyRate","isSalariedWithPayPeriodExpectedHours","regularHourlyCompensation","calculateGrossPay","compensationEffectiveDateString","payrollCategory","PayrollCategory","compensationEffectiveDate","salaried","isOffCyclePayroll","regularPlusOvertimePay","fixedPay","ptoPay","minimumWageAdjustment","total","OFF_CYCLE_REASON_LABELS","getPayrollTypeLabel","payroll","getAdditionalEarningsCompensations","flsaStatus","existingFixedCompensations","primaryJobUuid","fixedCompensationTypes","excludedTypes","allFixedCompensations","FlsaStatus","type","comp","getReimbursementCompensation","reimbursementCompensation","COMPENSATION_NAME_REIMBURSEMENT","hasDirectDepositEmployees","employeeCompensations","activeCompensations","calculateTotalPayroll","payrollData","getPacificTimeOffset","date","year","secondSundayMarch","firstSundayNovember","canCancelPayroll","now","deadline","nowInPT","MS_PER_HOUR","deadlineInPT","cutoffTime"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"helpers.js","sources":["../../../src/components/Payroll/helpers.ts"],"sourcesContent":["import type { Employee } from '@gusto/embedded-api/models/components/employee'\nimport {\n type PayrollShowFixedCompensations,\n OffCycleReasonType,\n} from '@gusto/embedded-api/models/components/payroll'\nimport type { PayrollEmployeeCompensationsTypeFixedCompensations as FixedCompensations } from '@gusto/embedded-api/models/components/payrollemployeecompensationstype'\nimport type { PayrollFixedCompensationTypesType } from '@gusto/embedded-api/models/components/payrollfixedcompensationtypestype'\nimport { useCallback } from 'react'\nimport type { TFunction } from 'i18next'\nimport { useTranslation } from 'react-i18next'\nimport type { PayScheduleObject } from '@gusto/embedded-api/models/components/payscheduleobject'\nimport type { Compensation, MinimumWages } from '@gusto/embedded-api/models/components/compensation'\nimport type { PayrollEmployeeCompensationsType } from '@gusto/embedded-api/models/components/payrollemployeecompensationstype'\nimport type { Payroll } from '@gusto/embedded-api/models/components/payroll'\nimport type { PayrollType } from './PayrollList/types'\nimport { PayrollCategory, isOffCyclePayroll } from './payrollTypes'\nimport { formatPayRate } from '@/helpers/formattedStrings'\nimport { useLocale } from '@/contexts/LocaleProvider/useLocale'\nimport { COMPENSATION_NAME_REIMBURSEMENT, FlsaStatus } from '@/shared/constants'\nimport { MS_PER_HOUR } from '@/helpers/dateFormatting'\nconst REGULAR_HOURS_NAME = 'regular hours'\n\n// Utility to get the primary job from an employee\nexport const getPrimaryJob = (employee: Employee) => {\n return employee.jobs?.find(job => job.primary) || employee.jobs?.[0] || null\n}\n\nconst roundToSixDecimals = (value: number): number => {\n return Math.round(value * 1_000_000) / 1_000_000\n}\n\nconst roundToTwoDecimals = (value: number): number => {\n return Math.round(value * 100) / 100\n}\n\nconst isRegularHours = (compensationName: string): boolean => {\n return compensationName.toLowerCase() === REGULAR_HOURS_NAME\n}\n\nconst PAY_PERIOD_HOURS_MAPPINGS: Record<string, number> = {\n Daily: 8.0,\n 'Every week': 40.0,\n 'Every other week': 80.0,\n 'Twice per month': 86.666667,\n Monthly: 173.333333,\n Quarterly: 520.0,\n Semiannually: 1040.0,\n Annually: 2080.0,\n}\n\nexport const formatEmployeePayRate = ({\n employee,\n t,\n locale = 'en-US',\n}: {\n employee?: Employee\n t: TFunction\n locale?: string\n}) => {\n if (!employee?.jobs) {\n return null\n }\n\n const primaryJob = getPrimaryJob(employee)\n if (!primaryJob?.compensations) {\n return null\n }\n\n const jobCompensation = primaryJob.compensations[0]\n if (!jobCompensation) {\n return null\n }\n if (!jobCompensation.rate || parseFloat(jobCompensation.rate) === 0) {\n return null\n }\n\n const rate = parseFloat(jobCompensation.rate)\n const paymentUnit = jobCompensation.paymentUnit || 'Hour'\n\n return formatPayRate({ rate, paymentUnit, t, locale })\n}\n\nexport const useFormatEmployeePayRate = () => {\n const { t } = useTranslation('common')\n const { locale } = useLocale()\n\n return useCallback(\n (employee?: Employee) => {\n return formatEmployeePayRate({ employee, t, locale })\n },\n [t, locale],\n )\n}\n\nexport const getEmployeePayRateInfo = (employee: Employee | undefined) => {\n if (!employee?.jobs) {\n return null\n }\n\n const primaryJob = getPrimaryJob(employee)\n if (!primaryJob?.compensations) {\n return null\n }\n\n const jobCompensation = primaryJob.compensations[0]\n if (!jobCompensation) {\n return null\n }\n if (!jobCompensation.rate || parseFloat(jobCompensation.rate) === 0) {\n return null\n }\n\n const rate = parseFloat(jobCompensation.rate)\n const paymentUnit = jobCompensation.paymentUnit || 'Hour'\n\n return { rate, paymentUnit }\n}\n\nexport const getRegularHours = (compensation: PayrollEmployeeCompensationsType) => {\n if (!compensation.hourlyCompensations) return 0\n\n return compensation.hourlyCompensations\n .filter(hourlyCompensation => hourlyCompensation.name?.toLowerCase() === 'regular hours')\n .reduce((sum, hourlyCompensation) => sum + parseFloat(hourlyCompensation.hours || '0'), 0)\n}\n\nexport function getOvertimeHours(compensation: PayrollEmployeeCompensationsType) {\n if (!compensation.hourlyCompensations || compensation.excluded) {\n return 0\n }\n\n return compensation.hourlyCompensations\n .filter(hourlyCompensation => Number(hourlyCompensation.compensationMultiplier) > 1)\n .reduce((sum, hourlyCompensation) => sum + parseFloat(hourlyCompensation.hours || '0'), 0)\n}\n\nexport const getTotalPtoHours = (compensation: PayrollEmployeeCompensationsType) => {\n if (!compensation.paidTimeOff) {\n return 0\n }\n return compensation.paidTimeOff.reduce((sum, pto) => sum + parseFloat(pto.hours || '0'), 0)\n}\n\nexport const getAdditionalEarnings = (compensation: PayrollEmployeeCompensationsType) => {\n if (!compensation.fixedCompensations) {\n return 0\n }\n\n return compensation.fixedCompensations\n .filter(fixedCompensation => {\n const name = fixedCompensation.name?.toLowerCase() || ''\n const amount = parseFloat(fixedCompensation.amount || '0')\n return name !== 'reimbursement' && name !== 'minimum wage adjustment' && amount > 0\n })\n .reduce((sum, fixedCompensation) => sum + parseFloat(fixedCompensation.amount || '0'), 0)\n}\n\nexport const getReimbursements = (compensation: PayrollEmployeeCompensationsType) => {\n if (!compensation.fixedCompensations) {\n return 0\n }\n\n const reimbursementComp = compensation.fixedCompensations.find(\n fixedCompensation => fixedCompensation.name?.toLowerCase() === 'reimbursement',\n )\n return reimbursementComp ? parseFloat(reimbursementComp.amount || '0') : 0\n}\n\nexport const formatHoursDisplay = (hours: number): string => {\n const rounded = roundToTwoDecimals(hours)\n\n if (rounded % 1 === 0) {\n return `${rounded}.0`\n }\n\n return rounded.toString()\n}\n\nconst getHoursInPayPeriod = (paySchedule: PayScheduleObject): number => {\n if (!paySchedule.frequency) {\n return 0\n }\n\n return PAY_PERIOD_HOURS_MAPPINGS[paySchedule.frequency] || 0\n}\n\nconst getEffectiveCompensation = (\n compensations: Compensation[],\n effectiveDate: Date,\n): Compensation | null => {\n if (!compensations.length) return null\n\n const sorted = [...compensations].sort(\n (a, b) =>\n (a.effectiveDate ? new Date(a.effectiveDate).getTime() : 0) -\n (b.effectiveDate ? new Date(b.effectiveDate).getTime() : 0),\n )\n\n for (let i = sorted.length - 1; i >= 0; i--) {\n const currentDateString = sorted[i]?.effectiveDate\n const currentDate = currentDateString ? new Date(currentDateString) : null\n if (currentDate && currentDate <= effectiveDate) {\n return sorted[i] || null\n }\n }\n\n return sorted[0] || null\n}\n\nconst getEffectiveMinimumWage = (\n minimumWages: MinimumWages[],\n effectiveDate: Date,\n): MinimumWages | null => {\n if (!minimumWages.length) return null\n\n const sorted = [...minimumWages].sort(\n (a, b) =>\n (a.effectiveDate ? new Date(a.effectiveDate).getTime() : 0) -\n (b.effectiveDate ? new Date(b.effectiveDate).getTime() : 0),\n )\n\n for (let i = sorted.length - 1; i >= 0; i--) {\n const currentDateString = sorted[i]?.effectiveDate\n const currentDate = currentDateString ? new Date(currentDateString) : null\n if (currentDate && currentDate <= effectiveDate) {\n return sorted[i] || null\n }\n }\n\n return sorted[0] || null\n}\n\nconst isSalaried = (compensation: Compensation): boolean => {\n return compensation.flsaStatus === 'Exempt' || compensation.flsaStatus === 'Salaried Nonexempt'\n}\n\nconst getTotalTipCompensations = (fixedCompensations: PayrollShowFixedCompensations[]): number => {\n if (!fixedCompensations.length) return 0\n\n return fixedCompensations\n .filter(fixedCompensation => {\n const name = fixedCompensation.name?.toLowerCase()\n const amount = parseFloat(fixedCompensation.amount || '0')\n return (name === 'paycheck tips' || name === 'cash tips') && amount > 0\n })\n .reduce((sum, fixedCompensation) => sum + parseFloat(fixedCompensation.amount || '0'), 0)\n}\n\nconst calculateHourlyRate = (compensation: Compensation): number => {\n const rate = parseFloat(compensation.rate || '0')\n const paymentUnit = compensation.paymentUnit || 'Hour'\n\n switch (paymentUnit) {\n case 'Hour':\n return rate\n case 'Year':\n return rate / 2080 // 52 weeks * 40 hours\n case 'Month':\n return rate / 173.333333\n case 'Week':\n return rate / 40\n case 'Paycheck':\n return 0 // Paycheck rate is 0 for hourly calculation\n default:\n return rate\n }\n}\n\nconst getHourlyRateForJob = (employee: Employee, jobUuid: string, effectiveDate: Date): number => {\n const job = employee.jobs?.find(j => j.uuid === jobUuid)\n if (!job?.compensations) {\n return 0\n }\n\n const compensation = getEffectiveCompensation(job.compensations, effectiveDate)\n return compensation ? calculateHourlyRate(compensation) : 0\n}\n\nconst getPrimaryHourlyRate = (employee: Employee, effectiveDate: Date): number => {\n const primaryJob = getPrimaryJob(employee)\n if (!primaryJob?.compensations) {\n return 0\n }\n\n const compensation = getEffectiveCompensation(primaryJob.compensations, effectiveDate)\n return compensation ? calculateHourlyRate(compensation) : 0\n}\n\nconst getTotalOutstandingPtoHours = (compensation: PayrollEmployeeCompensationsType): number => {\n if (!compensation.paidTimeOff) {\n return 0\n }\n\n return compensation.paidTimeOff.reduce(\n (sum, paidTimeOff) => sum + parseFloat(paidTimeOff.finalPayoutUnusedHoursInput || '0'),\n 0,\n )\n}\n\nconst getPtoHours = (\n compensation: PayrollEmployeeCompensationsType,\n isSalariedWithExpectedHours: boolean,\n hoursInPayPeriod: number,\n offCycle: boolean,\n): number => {\n const regularPtoHours = getTotalPtoHours(compensation)\n\n if (offCycle) {\n const outstandingPtoHours = getTotalOutstandingPtoHours(compensation)\n return regularPtoHours + outstandingPtoHours\n }\n\n if (isSalariedWithExpectedHours) {\n return Math.min(hoursInPayPeriod, regularPtoHours)\n }\n\n return regularPtoHours\n}\n\nconst calculateMinimumWageAdjustment = (\n primaryCompensation: Compensation,\n compensation: PayrollEmployeeCompensationsType,\n effectiveDate: Date,\n): number => {\n if (!primaryCompensation.adjustForMinimumWage) return 0\n\n const effectiveMinWage = getEffectiveMinimumWage(\n primaryCompensation.minimumWages || [],\n effectiveDate,\n )\n if (!effectiveMinWage) {\n return 0\n }\n\n const totalHours =\n compensation.hourlyCompensations?.reduce(\n (sum, hourlyCompensation) => sum + parseFloat(hourlyCompensation.hours || '0'),\n 0,\n ) || 0\n\n const hourlyRate = calculateHourlyRate(primaryCompensation)\n\n const totalTipCredit = (parseFloat(effectiveMinWage.wage || '0') - hourlyRate) * totalHours\n const totalTips = getTotalTipCompensations(compensation.fixedCompensations || [])\n\n return Math.max(0, totalTipCredit - totalTips)\n}\n\nconst calculateRegularPlusOvertimePay = (\n compensation: PayrollEmployeeCompensationsType,\n employee: Employee,\n effectiveDate: Date,\n isSalariedWithExpectedHours: boolean,\n hoursInPayPeriod: number,\n ptoHours: number,\n isOffCycle: boolean,\n): number => {\n if (!isOffCycle && isSalariedWithExpectedHours) {\n const primaryHourlyRate = getPrimaryHourlyRate(employee, effectiveDate)\n return primaryHourlyRate * (hoursInPayPeriod - ptoHours)\n }\n\n if (!compensation.hourlyCompensations || !employee.jobs) {\n return 0\n }\n\n const regularRatePay = compensation.hourlyCompensations.reduce((sum, hc) => {\n const hours = parseFloat(hc.hours || '0')\n const hourlyRate = getHourlyRateForJob(employee, hc.jobUuid || '', effectiveDate)\n return sum + hours * hourlyRate\n }, 0)\n\n const totalHours = compensation.hourlyCompensations.reduce((sum, hc) => {\n return sum + parseFloat(hc.hours || '0')\n }, 0)\n\n if (totalHours === 0) return regularRatePay\n\n const overtimeWeightedRate = roundToSixDecimals(regularRatePay / totalHours)\n\n // Calculate overtime pay for non-regular hours\n const overtimePay = compensation.hourlyCompensations\n .filter(hc => !isRegularHours(hc.name || ''))\n .reduce((sum, hc) => {\n const hours = parseFloat(hc.hours || '0')\n const multiplier = hc.compensationMultiplier || 1\n return sum + hours * overtimeWeightedRate * (multiplier - 1)\n }, 0)\n\n return regularRatePay + overtimePay\n}\n\nconst calculatePtoPay = (\n compensation: PayrollEmployeeCompensationsType,\n employee: Employee,\n effectiveDate: Date,\n isSalariedWithExpectedHours: boolean,\n hoursInPayPeriod: number,\n offCycle: boolean,\n): number => {\n const ptoHours = getPtoHours(\n compensation,\n isSalariedWithExpectedHours,\n hoursInPayPeriod,\n offCycle,\n )\n const primaryHourlyRate = getPrimaryHourlyRate(employee, effectiveDate)\n return ptoHours * primaryHourlyRate\n}\n\nconst isSalariedWithPayPeriodExpectedHours = (\n compensation: PayrollEmployeeCompensationsType,\n isSalaried: boolean,\n hoursInPayPeriod: number,\n): boolean => {\n if (!isSalaried) return false\n\n const regularHourlyCompensation = compensation.hourlyCompensations?.find(hourlyCompensation =>\n isRegularHours(hourlyCompensation.name || ''),\n )\n\n if (!regularHourlyCompensation) return false\n\n const regularHours = parseFloat(regularHourlyCompensation.hours || '0')\n return regularHours === hoursInPayPeriod\n}\n\nexport const calculateGrossPay = (\n compensation: PayrollEmployeeCompensationsType,\n employee: Employee,\n compensationEffectiveDateString?: string,\n paySchedule?: PayScheduleObject,\n payrollCategory: PayrollCategory = PayrollCategory.Regular,\n): number => {\n if (compensation.excluded) {\n return 0\n }\n\n const compensationEffectiveDate = compensationEffectiveDateString\n ? new Date(compensationEffectiveDateString)\n : new Date()\n\n const primaryJob = getPrimaryJob(employee)\n if (!primaryJob?.compensations) {\n return 0\n }\n\n const primaryCompensation = getEffectiveCompensation(\n primaryJob.compensations,\n compensationEffectiveDate,\n )\n\n if (!primaryCompensation) {\n return 0\n }\n\n const salaried = isSalaried(primaryCompensation)\n const hoursInPayPeriod = paySchedule ? getHoursInPayPeriod(paySchedule) : 0\n\n const isSalariedWithExpectedHours = isSalariedWithPayPeriodExpectedHours(\n compensation,\n salaried,\n hoursInPayPeriod,\n )\n\n const offCycle = isOffCyclePayroll(payrollCategory)\n\n const ptoHours = getPtoHours(\n compensation,\n isSalariedWithExpectedHours,\n hoursInPayPeriod,\n offCycle,\n )\n\n const regularPlusOvertimePay = calculateRegularPlusOvertimePay(\n compensation,\n employee,\n compensationEffectiveDate,\n isSalariedWithExpectedHours,\n hoursInPayPeriod,\n ptoHours,\n offCycle,\n )\n\n const fixedPay = getAdditionalEarnings(compensation)\n const ptoPay = calculatePtoPay(\n compensation,\n employee,\n compensationEffectiveDate,\n isSalariedWithExpectedHours,\n hoursInPayPeriod,\n offCycle,\n )\n const minimumWageAdjustment = calculateMinimumWageAdjustment(\n primaryCompensation,\n compensation,\n compensationEffectiveDate,\n )\n\n const total = regularPlusOvertimePay + fixedPay + ptoPay + minimumWageAdjustment\n return roundToTwoDecimals(total)\n}\n\n// Payroll type and status utilities\nexport const getPayrollType = (payroll: {\n external?: boolean\n offCycle?: boolean\n}): PayrollType => {\n if (payroll.external) return 'External'\n if (payroll.offCycle) return 'Off-Cycle'\n return 'Regular'\n}\n\nexport const isDismissalPayroll = (offCycleReason?: string | null): boolean =>\n offCycleReason === OffCycleReasonType.DismissedEmployee\n\nconst OFF_CYCLE_REASON_LABELS: Record<string, string> = {\n Bonus: 'Bonus',\n Correction: 'Correction',\n 'Transition from old pay schedule': 'Transition',\n 'Dismissed employee': 'Dismissal',\n 'Hired employee': 'New Hire',\n 'Benefit reversal': 'Benefit Reversal',\n 'Wage correction': 'Wage Correction',\n 'Tax reconciliation': 'Tax Reconciliation',\n Reversal: 'Reversal',\n 'Disability insurance distribution': 'Disability Insurance',\n}\n\nexport const getPayrollTypeLabel = (payroll: {\n external?: boolean\n offCycle?: boolean\n offCycleReason?: string | null\n}): string => {\n if (payroll.external) return 'External'\n if (payroll.offCycle && payroll.offCycleReason) {\n return OFF_CYCLE_REASON_LABELS[payroll.offCycleReason] ?? payroll.offCycleReason\n }\n if (payroll.offCycle) return 'Off-Cycle'\n return 'Regular'\n}\n\nexport const getAdditionalEarningsCompensations = ({\n flsaStatus,\n existingFixedCompensations = [],\n primaryJobUuid,\n fixedCompensationTypes = [],\n excludedTypes = [],\n}: {\n flsaStatus: string | undefined\n existingFixedCompensations?: FixedCompensations[]\n primaryJobUuid?: string\n fixedCompensationTypes?: PayrollFixedCompensationTypesType[]\n excludedTypes?: string[]\n}): FixedCompensations[] => {\n const allFixedCompensations = [...existingFixedCompensations]\n\n if (flsaStatus !== FlsaStatus.OWNER && primaryJobUuid && fixedCompensationTypes.length > 0) {\n const compensationTypeNames = fixedCompensationTypes\n .map(type => type.name)\n .filter(Boolean) as string[]\n\n compensationTypeNames.forEach(compensationName => {\n const exists = allFixedCompensations.some(\n comp => comp.name?.toLowerCase() === compensationName.toLowerCase(),\n )\n\n if (!exists) {\n allFixedCompensations.push({\n name: compensationName,\n amount: '0.00',\n jobUuid: primaryJobUuid,\n })\n }\n })\n }\n\n // Filter and sort additional earnings (exclude specified types)\n return allFixedCompensations\n .filter(comp => comp.name && !excludedTypes.includes(comp.name))\n .sort((a, b) => (a.name || '').localeCompare(b.name || ''))\n}\n\nexport const getReimbursementCompensation = (\n fixedCompensations: FixedCompensations[],\n fixedCompensationTypes: PayrollFixedCompensationTypesType[],\n primaryJobUuid?: string,\n) => {\n const reimbursementCompensation = fixedCompensations.find(\n comp => comp.name?.toLowerCase() === COMPENSATION_NAME_REIMBURSEMENT.toLowerCase(),\n )\n\n if (reimbursementCompensation) {\n return reimbursementCompensation\n }\n\n if (\n primaryJobUuid &&\n fixedCompensationTypes.some(\n type => type.name?.toLowerCase() === COMPENSATION_NAME_REIMBURSEMENT.toLowerCase(),\n )\n ) {\n return {\n name: COMPENSATION_NAME_REIMBURSEMENT,\n amount: '0.00',\n jobUuid: primaryJobUuid,\n }\n }\n\n return null\n}\n\nexport const hasDirectDepositEmployees = (\n employeeCompensations?: Array<{ paymentMethod?: string | null; excluded?: boolean }>,\n): boolean => {\n if (!employeeCompensations || employeeCompensations.length === 0) return true\n const activeCompensations = employeeCompensations.filter(comp => !comp.excluded)\n if (activeCompensations.length === 0) return true\n return activeCompensations.some(comp => comp.paymentMethod === 'Direct Deposit')\n}\n\n// Total Payroll = Gross Pay + Employer Taxes + Reimbursements + Benefits\nexport const calculateTotalPayroll = (payrollData: Payroll) => {\n const totalPayroll = payrollData.totals\n ? Number(payrollData.totals.grossPay ?? 0) +\n Number(payrollData.totals.employerTaxes ?? 0) +\n Number(payrollData.totals.reimbursements ?? 0) +\n Number(payrollData.totals.benefits ?? 0)\n : 0\n\n return totalPayroll\n}\n\n/**\n * Converts a Date to Pacific Time considering Daylight Saving Time.\n * Returns the UTC offset in hours (e.g., -7 for PDT, -8 for PST).\n *\n * DST rules for Pacific Time:\n * - Starts: Second Sunday in March at 2:00 AM\n * - Ends: First Sunday in November at 2:00 AM\n */\nconst getPacificTimeOffset = (date: Date): number => {\n const year = date.getFullYear()\n\n const secondSundayMarch = new Date(year, 2, 1)\n secondSundayMarch.setDate(1 + (7 - secondSundayMarch.getDay()) + 7)\n\n const firstSundayNovember = new Date(year, 10, 1)\n firstSundayNovember.setDate(1 + ((7 - firstSundayNovember.getDay()) % 7))\n\n const isDST = date >= secondSundayMarch && date < firstSundayNovember\n return isDST ? -7 : -8\n}\n\n/**\n * Determines if a payroll can be cancelled based on business rules.\n *\n * A payroll can be cancelled if all of the following conditions are met:\n * - The payroll has been processed (processed === true)\n * - Current time is before 4:00 PM PT on the payroll deadline\n * - The payrollStatusMeta.cancellable flag is not explicitly false\n *\n * This check enforces the business rule that payrolls can only be cancelled\n * before the 4:00 PM PT cutoff time on their deadline date.\n */\nexport const canCancelPayroll = (payroll: Payroll): boolean => {\n if (payroll.payrollStatusMeta?.cancellable === false) {\n return false\n }\n\n if (!payroll.processed) {\n return false\n }\n\n if (!payroll.payrollDeadline) {\n return false\n }\n\n const now = new Date()\n const deadline = new Date(payroll.payrollDeadline)\n\n const nowInPT = new Date(now.getTime() + getPacificTimeOffset(now) * MS_PER_HOUR)\n const deadlineInPT = new Date(deadline.getTime() + getPacificTimeOffset(deadline) * MS_PER_HOUR)\n\n const cutoffTime = new Date(deadlineInPT)\n cutoffTime.setUTCHours(16, 0, 0, 0)\n\n if (nowInPT >= cutoffTime) {\n return false\n }\n\n return true\n}\n"],"names":["REGULAR_HOURS_NAME","getPrimaryJob","employee","job","roundToSixDecimals","value","roundToTwoDecimals","isRegularHours","compensationName","PAY_PERIOD_HOURS_MAPPINGS","formatEmployeePayRate","locale","primaryJob","jobCompensation","rate","paymentUnit","formatPayRate","useFormatEmployeePayRate","t","useTranslation","useLocale","useCallback","getRegularHours","compensation","hourlyCompensation","sum","getOvertimeHours","getTotalPtoHours","pto","getAdditionalEarnings","fixedCompensation","name","amount","getReimbursements","reimbursementComp","formatHoursDisplay","hours","rounded","getHoursInPayPeriod","paySchedule","getEffectiveCompensation","compensations","effectiveDate","sorted","a","b","i","currentDateString","currentDate","getEffectiveMinimumWage","minimumWages","isSalaried","getTotalTipCompensations","fixedCompensations","calculateHourlyRate","getHourlyRateForJob","jobUuid","j","getPrimaryHourlyRate","getTotalOutstandingPtoHours","paidTimeOff","getPtoHours","isSalariedWithExpectedHours","hoursInPayPeriod","offCycle","regularPtoHours","outstandingPtoHours","calculateMinimumWageAdjustment","primaryCompensation","effectiveMinWage","totalHours","hourlyRate","totalTipCredit","totalTips","calculateRegularPlusOvertimePay","ptoHours","isOffCycle","regularRatePay","hc","overtimeWeightedRate","overtimePay","multiplier","calculatePtoPay","primaryHourlyRate","isSalariedWithPayPeriodExpectedHours","regularHourlyCompensation","calculateGrossPay","compensationEffectiveDateString","payrollCategory","PayrollCategory","compensationEffectiveDate","salaried","isOffCyclePayroll","regularPlusOvertimePay","fixedPay","ptoPay","minimumWageAdjustment","total","isDismissalPayroll","offCycleReason","OffCycleReasonType","OFF_CYCLE_REASON_LABELS","getPayrollTypeLabel","payroll","getAdditionalEarningsCompensations","flsaStatus","existingFixedCompensations","primaryJobUuid","fixedCompensationTypes","excludedTypes","allFixedCompensations","FlsaStatus","type","comp","getReimbursementCompensation","reimbursementCompensation","COMPENSATION_NAME_REIMBURSEMENT","hasDirectDepositEmployees","employeeCompensations","activeCompensations","calculateTotalPayroll","payrollData","getPacificTimeOffset","date","year","secondSundayMarch","firstSundayNovember","canCancelPayroll","now","deadline","nowInPT","MS_PER_HOUR","deadlineInPT","cutoffTime"],"mappings":"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"}
|
|
@@ -45,8 +45,8 @@ interface CompensationSchemaOptions {
|
|
|
45
45
|
withStartDateField?: boolean;
|
|
46
46
|
}
|
|
47
47
|
export declare function createCompensationSchema(options?: CompensationSchemaOptions): z.ZodObject<{
|
|
48
|
-
rate: z.ZodPipe<z.ZodTransform<
|
|
49
|
-
startDate: z.ZodPipe<z.ZodTransform<{} | undefined, unknown>, z.ZodISODate
|
|
48
|
+
rate: z.ZodPipe<z.ZodTransform<{}, unknown>, z.ZodNumber>;
|
|
49
|
+
startDate: z.ZodPipe<z.ZodTransform<{} | null | undefined, unknown>, z.ZodNullable<z.ZodISODate>>;
|
|
50
50
|
stateWcCovered: z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodBoolean>>;
|
|
51
51
|
jobTitle: z.ZodString;
|
|
52
52
|
flsaStatus: z.ZodEnum<{
|
|
@@ -70,8 +70,8 @@ export declare function createCompensationSchema(options?: CompensationSchemaOpt
|
|
|
70
70
|
twoPercentShareholder: z.ZodOptional<z.ZodBoolean>;
|
|
71
71
|
}, z.core.$strip>;
|
|
72
72
|
export declare const CompensationSchema: z.ZodObject<{
|
|
73
|
-
rate: z.ZodPipe<z.ZodTransform<
|
|
74
|
-
startDate: z.ZodPipe<z.ZodTransform<{} | undefined, unknown>, z.ZodISODate
|
|
73
|
+
rate: z.ZodPipe<z.ZodTransform<{}, unknown>, z.ZodNumber>;
|
|
74
|
+
startDate: z.ZodPipe<z.ZodTransform<{} | null | undefined, unknown>, z.ZodNullable<z.ZodISODate>>;
|
|
75
75
|
stateWcCovered: z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodBoolean>>;
|
|
76
76
|
jobTitle: z.ZodString;
|
|
77
77
|
flsaStatus: z.ZodEnum<{
|
|
@@ -1,31 +1,31 @@
|
|
|
1
1
|
import { z as e } from "zod";
|
|
2
|
-
import { composeFormSchema as
|
|
3
|
-
import { filterRequiredFields as
|
|
4
|
-
import { FlsaStatus as
|
|
5
|
-
import { yearlyRate as
|
|
6
|
-
const
|
|
2
|
+
import { composeFormSchema as T } from "../../form/composeFormSchema.js";
|
|
3
|
+
import { filterRequiredFields as _, resolveRequiredFields as C } from "../../form/resolveRequiredFields.js";
|
|
4
|
+
import { FlsaStatus as s, FLSA_OVERTIME_SALARY_LIMIT as p, PAY_PERIODS as i } from "../../../../shared/constants.js";
|
|
5
|
+
import { yearlyRate as f } from "../../../../helpers/payRateCalculator.js";
|
|
6
|
+
const o = {
|
|
7
7
|
REQUIRED: "REQUIRED",
|
|
8
8
|
RATE_MINIMUM: "RATE_MINIMUM",
|
|
9
9
|
RATE_EXEMPT_THRESHOLD: "RATE_EXEMPT_THRESHOLD",
|
|
10
10
|
PAYMENT_UNIT_OWNER: "PAYMENT_UNIT_OWNER",
|
|
11
11
|
PAYMENT_UNIT_COMMISSION: "PAYMENT_UNIT_COMMISSION",
|
|
12
12
|
RATE_COMMISSION_ZERO: "RATE_COMMISSION_ZERO"
|
|
13
|
-
},
|
|
14
|
-
jobTitle: e.string().min(1, { message:
|
|
13
|
+
}, D = {
|
|
14
|
+
jobTitle: e.string().min(1, { message: o.REQUIRED }),
|
|
15
15
|
flsaStatus: e.enum([
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
s.EXEMPT,
|
|
17
|
+
s.SALARIED_NONEXEMPT,
|
|
18
|
+
s.NONEXEMPT,
|
|
19
|
+
s.OWNER,
|
|
20
|
+
s.COMMISSION_ONLY_EXEMPT,
|
|
21
|
+
s.COMMISSION_ONLY_NONEXEMPT
|
|
22
22
|
]),
|
|
23
23
|
paymentUnit: e.enum([
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
i.HOUR,
|
|
25
|
+
i.WEEK,
|
|
26
|
+
i.MONTH,
|
|
27
|
+
i.YEAR,
|
|
28
|
+
i.PAYCHECK
|
|
29
29
|
]),
|
|
30
30
|
rate: e.number().optional(),
|
|
31
31
|
startDate: e.iso.date().nullable().optional(),
|
|
@@ -34,88 +34,85 @@ const a = {
|
|
|
34
34
|
stateWcCovered: e.boolean().optional(),
|
|
35
35
|
stateWcClassCode: e.string().optional(),
|
|
36
36
|
twoPercentShareholder: e.boolean().optional()
|
|
37
|
-
},
|
|
37
|
+
}, A = /* @__PURE__ */ new Set([
|
|
38
38
|
"adjustForMinimumWage",
|
|
39
39
|
"minimumWageId",
|
|
40
40
|
"stateWcCovered",
|
|
41
41
|
"stateWcClassCode",
|
|
42
42
|
"twoPercentShareholder"
|
|
43
|
-
]),
|
|
44
|
-
...
|
|
45
|
-
rate: e.preprocess(
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
43
|
+
]), U = {
|
|
44
|
+
...D,
|
|
45
|
+
rate: e.preprocess(
|
|
46
|
+
(t) => t == null || Number.isNaN(t) ? 0 : t,
|
|
47
|
+
e.number({ error: () => o.REQUIRED })
|
|
48
|
+
),
|
|
49
|
+
startDate: e.preprocess(
|
|
50
|
+
(t) => t instanceof Date ? t.toISOString().split("T")[0] : t === null || t === "" || t === void 0 ? null : t,
|
|
51
|
+
e.iso.date({ error: () => o.REQUIRED }).nullable()
|
|
52
|
+
),
|
|
53
|
+
stateWcCovered: e.preprocess((t) => typeof t == "string" ? t === "true" : t, e.boolean()).optional()
|
|
54
|
+
}, P = /* @__PURE__ */ new Set([
|
|
53
55
|
"jobTitle",
|
|
54
56
|
"flsaStatus",
|
|
55
57
|
"rate",
|
|
56
58
|
"paymentUnit"
|
|
57
|
-
]),
|
|
58
|
-
function
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
59
|
+
]), N = /* @__PURE__ */ new Set([]);
|
|
60
|
+
function g(t = {}) {
|
|
61
|
+
const { mode: n = "create", requiredFields: m, withStartDateField: M = !0 } = t, R = M ? m : _(m, "startDate"), u = new Set(P);
|
|
62
|
+
M && u.add("startDate");
|
|
63
|
+
const c = T({
|
|
64
|
+
fieldValidators: U,
|
|
65
|
+
fixedFields: A,
|
|
66
|
+
requiredOnCreate: u,
|
|
67
|
+
requiredOnUpdate: N,
|
|
68
|
+
mode: n,
|
|
69
|
+
requiredFields: R
|
|
70
|
+
}), O = n === "create" ? u : N, l = new Set(C(R, n)), S = O.has("startDate") || l.has("startDate");
|
|
71
|
+
return c.superRefine((a, r) => {
|
|
72
|
+
S && a.startDate == null && r.addIssue({
|
|
73
|
+
code: e.ZodIssueCode.custom,
|
|
74
|
+
path: ["startDate"],
|
|
75
|
+
message: o.REQUIRED
|
|
76
|
+
}), a.adjustForMinimumWage && (!a.minimumWageId || a.minimumWageId.trim() === "") && r.addIssue({
|
|
77
|
+
code: e.ZodIssueCode.custom,
|
|
78
|
+
path: ["minimumWageId"],
|
|
79
|
+
message: o.REQUIRED
|
|
80
|
+
}), a.stateWcCovered === !0 && (!a.stateWcClassCode || a.stateWcClassCode.trim() === "") && r.addIssue({
|
|
81
|
+
code: e.ZodIssueCode.custom,
|
|
82
|
+
path: ["stateWcClassCode"],
|
|
83
|
+
message: o.REQUIRED
|
|
84
|
+
});
|
|
85
|
+
const { flsaStatus: E, paymentUnit: I } = a, d = a.rate;
|
|
86
|
+
E === s.EXEMPT || E === s.SALARIED_NONEXEMPT || E === s.NONEXEMPT ? d < 1 ? r.addIssue({
|
|
87
|
+
code: e.ZodIssueCode.custom,
|
|
88
|
+
path: ["rate"],
|
|
89
|
+
message: o.RATE_MINIMUM
|
|
90
|
+
}) : E === s.EXEMPT && f(d, I) < p && r.addIssue({
|
|
91
|
+
code: e.ZodIssueCode.custom,
|
|
92
|
+
path: ["rate"],
|
|
93
|
+
message: o.RATE_EXEMPT_THRESHOLD
|
|
94
|
+
}) : E === s.OWNER ? (I !== i.PAYCHECK && r.addIssue({
|
|
95
|
+
code: e.ZodIssueCode.custom,
|
|
96
|
+
path: ["paymentUnit"],
|
|
97
|
+
message: o.PAYMENT_UNIT_OWNER
|
|
98
|
+
}), d < 1 && r.addIssue({
|
|
99
|
+
code: e.ZodIssueCode.custom,
|
|
100
|
+
path: ["rate"],
|
|
101
|
+
message: o.RATE_MINIMUM
|
|
102
|
+
})) : [s.COMMISSION_ONLY_EXEMPT, s.COMMISSION_ONLY_NONEXEMPT].includes(E) && (I !== i.YEAR && r.addIssue({
|
|
103
|
+
code: e.ZodIssueCode.custom,
|
|
104
|
+
path: ["paymentUnit"],
|
|
105
|
+
message: o.PAYMENT_UNIT_COMMISSION
|
|
106
|
+
}), d !== 0 && r.addIssue({
|
|
107
|
+
code: e.ZodIssueCode.custom,
|
|
108
|
+
path: ["rate"],
|
|
109
|
+
message: o.RATE_COMMISSION_ZERO
|
|
110
|
+
}));
|
|
67
111
|
});
|
|
68
|
-
const { flsaStatus: i, paymentUnit: E, rate: d } = s;
|
|
69
|
-
i === t.EXEMPT || i === t.SALARIED_NONEXEMPT || i === t.NONEXEMPT ? (i === t.EXEMPT && d !== void 0 && N(d, E) < R && o.addIssue({
|
|
70
|
-
code: e.ZodIssueCode.custom,
|
|
71
|
-
path: ["rate"],
|
|
72
|
-
message: a.RATE_EXEMPT_THRESHOLD
|
|
73
|
-
}), d === void 0 ? o.addIssue({
|
|
74
|
-
code: e.ZodIssueCode.custom,
|
|
75
|
-
path: ["rate"],
|
|
76
|
-
message: a.REQUIRED
|
|
77
|
-
}) : d < 1 && o.addIssue({
|
|
78
|
-
code: e.ZodIssueCode.custom,
|
|
79
|
-
path: ["rate"],
|
|
80
|
-
message: a.RATE_MINIMUM
|
|
81
|
-
})) : i === t.OWNER ? (E !== r.PAYCHECK && o.addIssue({
|
|
82
|
-
code: e.ZodIssueCode.custom,
|
|
83
|
-
path: ["paymentUnit"],
|
|
84
|
-
message: a.PAYMENT_UNIT_OWNER
|
|
85
|
-
}), d === void 0 ? o.addIssue({
|
|
86
|
-
code: e.ZodIssueCode.custom,
|
|
87
|
-
path: ["rate"],
|
|
88
|
-
message: a.REQUIRED
|
|
89
|
-
}) : d < 1 && o.addIssue({
|
|
90
|
-
code: e.ZodIssueCode.custom,
|
|
91
|
-
path: ["rate"],
|
|
92
|
-
message: a.RATE_MINIMUM
|
|
93
|
-
})) : [t.COMMISSION_ONLY_EXEMPT, t.COMMISSION_ONLY_NONEXEMPT].includes(i) && (E !== r.YEAR && o.addIssue({
|
|
94
|
-
code: e.ZodIssueCode.custom,
|
|
95
|
-
path: ["paymentUnit"],
|
|
96
|
-
message: a.PAYMENT_UNIT_COMMISSION
|
|
97
|
-
}), d !== 0 && o.addIssue({
|
|
98
|
-
code: e.ZodIssueCode.custom,
|
|
99
|
-
path: ["rate"],
|
|
100
|
-
message: a.RATE_COMMISSION_ZERO
|
|
101
|
-
}));
|
|
102
112
|
}
|
|
103
|
-
|
|
104
|
-
const { mode: o = "create", requiredFields: i, withStartDateField: E = !0 } = s, d = E ? i : M(i, "startDate"), n = new Set(T);
|
|
105
|
-
return E && n.add("startDate"), u({
|
|
106
|
-
fieldValidators: S,
|
|
107
|
-
fixedFields: c,
|
|
108
|
-
requiredOnCreate: n,
|
|
109
|
-
requiredOnUpdate: _,
|
|
110
|
-
mode: o,
|
|
111
|
-
requiredFields: d
|
|
112
|
-
}).superRefine((I, m) => {
|
|
113
|
-
C(I, m);
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
p();
|
|
113
|
+
g();
|
|
117
114
|
export {
|
|
118
|
-
|
|
119
|
-
|
|
115
|
+
o as CompensationErrorCodes,
|
|
116
|
+
g as createCompensationSchema
|
|
120
117
|
};
|
|
121
118
|
//# sourceMappingURL=compensationSchema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compensationSchema.js","sources":["../../../../../src/components/UNSTABLE_Hooks/hooks/useCompensationForm/compensationSchema.ts"],"sourcesContent":["import { z } from 'zod'\nimport { composeFormSchema } from '../../form/composeFormSchema'\nimport { filterRequiredFields, type RequiredFields } from '../../form/resolveRequiredFields'\nimport { FLSA_OVERTIME_SALARY_LIMIT, FlsaStatus, PAY_PERIODS } from '@/shared/constants'\nimport { yearlyRate } from '@/helpers/payRateCalculator'\n\nexport const CompensationErrorCodes = {\n REQUIRED: 'REQUIRED',\n RATE_MINIMUM: 'RATE_MINIMUM',\n RATE_EXEMPT_THRESHOLD: 'RATE_EXEMPT_THRESHOLD',\n PAYMENT_UNIT_OWNER: 'PAYMENT_UNIT_OWNER',\n PAYMENT_UNIT_COMMISSION: 'PAYMENT_UNIT_COMMISSION',\n RATE_COMMISSION_ZERO: 'RATE_COMMISSION_ZERO',\n} as const\n\nexport type CompensationErrorCode =\n (typeof CompensationErrorCodes)[keyof typeof CompensationErrorCodes]\n\nconst fieldValidators = {\n jobTitle: z.string().min(1, { message: CompensationErrorCodes.REQUIRED }),\n flsaStatus: z.enum([\n FlsaStatus.EXEMPT,\n FlsaStatus.SALARIED_NONEXEMPT,\n FlsaStatus.NONEXEMPT,\n FlsaStatus.OWNER,\n FlsaStatus.COMMISSION_ONLY_EXEMPT,\n FlsaStatus.COMMISSION_ONLY_NONEXEMPT,\n ]),\n paymentUnit: z.enum([\n PAY_PERIODS.HOUR,\n PAY_PERIODS.WEEK,\n PAY_PERIODS.MONTH,\n PAY_PERIODS.YEAR,\n PAY_PERIODS.PAYCHECK,\n ]),\n rate: z.number().optional(),\n startDate: z.iso.date().nullable().optional(),\n adjustForMinimumWage: z.boolean(),\n minimumWageId: z.string().optional(),\n stateWcCovered: z.boolean().optional(),\n stateWcClassCode: z.string().optional(),\n twoPercentShareholder: z.boolean().optional(),\n}\n\nconst FIXED_FIELDS = new Set([\n 'adjustForMinimumWage',\n 'minimumWageId',\n 'stateWcCovered',\n 'stateWcClassCode',\n 'twoPercentShareholder',\n])\n\nexport type CompensationField = Exclude<\n keyof typeof fieldValidators,\n | 'adjustForMinimumWage'\n | 'minimumWageId'\n | 'stateWcCovered'\n | 'stateWcClassCode'\n | 'twoPercentShareholder'\n>\n\nexport type CompensationFormData = {\n [K in keyof typeof fieldValidators]: z.infer<(typeof fieldValidators)[K]>\n}\nexport type CompensationFormOutputs = CompensationFormData\n\nconst runtimeFieldValidators = {\n ...fieldValidators,\n rate: z.preprocess(val => (Number.isNaN(val) ? undefined : val), z.number()),\n startDate: z.preprocess(val => {\n if (val instanceof Date) return val.toISOString().split('T')[0]\n if (val === null || val === '') return undefined\n return val\n }, z.iso.date()),\n stateWcCovered: z\n .preprocess(val => (typeof val === 'string' ? val === 'true' : val), z.boolean())\n .optional(),\n}\n\nconst REQUIRED_ON_CREATE = new Set<CompensationField>([\n 'jobTitle',\n 'flsaStatus',\n 'rate',\n 'paymentUnit',\n])\nconst REQUIRED_ON_UPDATE = new Set<CompensationField>([])\n\ninterface CompensationSchemaOptions {\n mode?: 'create' | 'update'\n requiredFields?: RequiredFields<CompensationField>\n withStartDateField?: boolean\n}\n\nfunction compensationSuperRefine(data: CompensationFormData, ctx: z.RefinementCtx) {\n if (data.adjustForMinimumWage && (!data.minimumWageId || data.minimumWageId.trim() === '')) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['minimumWageId'],\n message: CompensationErrorCodes.REQUIRED,\n })\n }\n\n if (\n data.stateWcCovered === true &&\n (!data.stateWcClassCode || data.stateWcClassCode.trim() === '')\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['stateWcClassCode'],\n message: CompensationErrorCodes.REQUIRED,\n })\n }\n\n const { flsaStatus, paymentUnit, rate } = data\n\n if (\n flsaStatus === FlsaStatus.EXEMPT ||\n flsaStatus === FlsaStatus.SALARIED_NONEXEMPT ||\n flsaStatus === FlsaStatus.NONEXEMPT\n ) {\n if (\n flsaStatus === FlsaStatus.EXEMPT &&\n rate !== undefined &&\n yearlyRate(rate, paymentUnit) < FLSA_OVERTIME_SALARY_LIMIT\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['rate'],\n message: CompensationErrorCodes.RATE_EXEMPT_THRESHOLD,\n })\n }\n\n if (rate === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['rate'],\n message: CompensationErrorCodes.REQUIRED,\n })\n } else if (rate < 1) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['rate'],\n message: CompensationErrorCodes.RATE_MINIMUM,\n })\n }\n } else if (flsaStatus === FlsaStatus.OWNER) {\n if (paymentUnit !== PAY_PERIODS.PAYCHECK) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['paymentUnit'],\n message: CompensationErrorCodes.PAYMENT_UNIT_OWNER,\n })\n }\n if (rate === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['rate'],\n message: CompensationErrorCodes.REQUIRED,\n })\n } else if (rate < 1) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['rate'],\n message: CompensationErrorCodes.RATE_MINIMUM,\n })\n }\n } else if (\n [FlsaStatus.COMMISSION_ONLY_EXEMPT, FlsaStatus.COMMISSION_ONLY_NONEXEMPT].includes(flsaStatus)\n ) {\n if (paymentUnit !== PAY_PERIODS.YEAR) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['paymentUnit'],\n message: CompensationErrorCodes.PAYMENT_UNIT_COMMISSION,\n })\n }\n if (rate !== 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['rate'],\n message: CompensationErrorCodes.RATE_COMMISSION_ZERO,\n })\n }\n }\n}\n\nexport function createCompensationSchema(options: CompensationSchemaOptions = {}) {\n const { mode = 'create', requiredFields, withStartDateField = true } = options\n\n const effectiveRequiredFields = withStartDateField\n ? requiredFields\n : filterRequiredFields(requiredFields, 'startDate')\n\n const effectiveRequiredOnCreate = new Set(REQUIRED_ON_CREATE)\n if (withStartDateField) {\n effectiveRequiredOnCreate.add('startDate')\n }\n\n const baseSchema = composeFormSchema({\n fieldValidators: runtimeFieldValidators,\n fixedFields: FIXED_FIELDS,\n requiredOnCreate: effectiveRequiredOnCreate,\n requiredOnUpdate: REQUIRED_ON_UPDATE,\n mode,\n requiredFields: effectiveRequiredFields,\n })\n\n return baseSchema.superRefine((data, ctx) => {\n compensationSuperRefine(data as CompensationFormData, ctx)\n })\n}\n\nexport const CompensationSchema = createCompensationSchema()\n"],"names":["CompensationErrorCodes","fieldValidators","z","FlsaStatus","PAY_PERIODS","FIXED_FIELDS","runtimeFieldValidators","val","REQUIRED_ON_CREATE","REQUIRED_ON_UPDATE","compensationSuperRefine","data","ctx","flsaStatus","paymentUnit","rate","yearlyRate","FLSA_OVERTIME_SALARY_LIMIT","createCompensationSchema","options","mode","requiredFields","withStartDateField","effectiveRequiredFields","filterRequiredFields","effectiveRequiredOnCreate","composeFormSchema"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"compensationSchema.js","sources":["../../../../../src/components/UNSTABLE_Hooks/hooks/useCompensationForm/compensationSchema.ts"],"sourcesContent":["import { z } from 'zod'\nimport { composeFormSchema } from '../../form/composeFormSchema'\nimport {\n filterRequiredFields,\n resolveRequiredFields,\n type RequiredFields,\n} from '../../form/resolveRequiredFields'\nimport { FLSA_OVERTIME_SALARY_LIMIT, FlsaStatus, PAY_PERIODS } from '@/shared/constants'\nimport { yearlyRate } from '@/helpers/payRateCalculator'\n\nexport const CompensationErrorCodes = {\n REQUIRED: 'REQUIRED',\n RATE_MINIMUM: 'RATE_MINIMUM',\n RATE_EXEMPT_THRESHOLD: 'RATE_EXEMPT_THRESHOLD',\n PAYMENT_UNIT_OWNER: 'PAYMENT_UNIT_OWNER',\n PAYMENT_UNIT_COMMISSION: 'PAYMENT_UNIT_COMMISSION',\n RATE_COMMISSION_ZERO: 'RATE_COMMISSION_ZERO',\n} as const\n\nexport type CompensationErrorCode =\n (typeof CompensationErrorCodes)[keyof typeof CompensationErrorCodes]\n\nconst fieldValidators = {\n jobTitle: z.string().min(1, { message: CompensationErrorCodes.REQUIRED }),\n flsaStatus: z.enum([\n FlsaStatus.EXEMPT,\n FlsaStatus.SALARIED_NONEXEMPT,\n FlsaStatus.NONEXEMPT,\n FlsaStatus.OWNER,\n FlsaStatus.COMMISSION_ONLY_EXEMPT,\n FlsaStatus.COMMISSION_ONLY_NONEXEMPT,\n ]),\n paymentUnit: z.enum([\n PAY_PERIODS.HOUR,\n PAY_PERIODS.WEEK,\n PAY_PERIODS.MONTH,\n PAY_PERIODS.YEAR,\n PAY_PERIODS.PAYCHECK,\n ]),\n rate: z.number().optional(),\n startDate: z.iso.date().nullable().optional(),\n adjustForMinimumWage: z.boolean(),\n minimumWageId: z.string().optional(),\n stateWcCovered: z.boolean().optional(),\n stateWcClassCode: z.string().optional(),\n twoPercentShareholder: z.boolean().optional(),\n}\n\nconst FIXED_FIELDS = new Set([\n 'adjustForMinimumWage',\n 'minimumWageId',\n 'stateWcCovered',\n 'stateWcClassCode',\n 'twoPercentShareholder',\n])\n\nexport type CompensationField = Exclude<\n keyof typeof fieldValidators,\n | 'adjustForMinimumWage'\n | 'minimumWageId'\n | 'stateWcCovered'\n | 'stateWcClassCode'\n | 'twoPercentShareholder'\n>\n\nexport type CompensationFormData = {\n [K in keyof typeof fieldValidators]: z.infer<(typeof fieldValidators)[K]>\n}\nexport type CompensationFormOutputs = CompensationFormData\n\nconst runtimeFieldValidators = {\n ...fieldValidators,\n rate: z.preprocess(\n val => {\n if (val === undefined || val === null || Number.isNaN(val)) return 0\n return val\n },\n z.number({ error: () => CompensationErrorCodes.REQUIRED }),\n ),\n startDate: z.preprocess(\n val => {\n if (val instanceof Date) return val.toISOString().split('T')[0]\n if (val === null || val === '' || val === undefined) return null\n return val\n },\n z.iso.date({ error: () => CompensationErrorCodes.REQUIRED }).nullable(),\n ),\n stateWcCovered: z\n .preprocess(val => (typeof val === 'string' ? val === 'true' : val), z.boolean())\n .optional(),\n}\n\nconst REQUIRED_ON_CREATE = new Set<CompensationField>([\n 'jobTitle',\n 'flsaStatus',\n 'rate',\n 'paymentUnit',\n])\nconst REQUIRED_ON_UPDATE = new Set<CompensationField>([])\n\ninterface CompensationSchemaOptions {\n mode?: 'create' | 'update'\n requiredFields?: RequiredFields<CompensationField>\n withStartDateField?: boolean\n}\n\nexport function createCompensationSchema(options: CompensationSchemaOptions = {}) {\n const { mode = 'create', requiredFields, withStartDateField = true } = options\n\n const effectiveRequiredFields = withStartDateField\n ? requiredFields\n : filterRequiredFields(requiredFields, 'startDate')\n\n const effectiveRequiredOnCreate = new Set(REQUIRED_ON_CREATE)\n if (withStartDateField) {\n effectiveRequiredOnCreate.add('startDate')\n }\n\n const baseSchema = composeFormSchema({\n fieldValidators: runtimeFieldValidators,\n fixedFields: FIXED_FIELDS,\n requiredOnCreate: effectiveRequiredOnCreate,\n requiredOnUpdate: REQUIRED_ON_UPDATE,\n mode,\n requiredFields: effectiveRequiredFields,\n })\n\n const modeDefaults = mode === 'create' ? effectiveRequiredOnCreate : REQUIRED_ON_UPDATE\n const partnerRequired = new Set(resolveRequiredFields(effectiveRequiredFields, mode))\n const isStartDateRequired = modeDefaults.has('startDate') || partnerRequired.has('startDate')\n\n return baseSchema.superRefine((data, ctx) => {\n if (isStartDateRequired && data.startDate == null) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['startDate'],\n message: CompensationErrorCodes.REQUIRED,\n })\n }\n\n if (data.adjustForMinimumWage && (!data.minimumWageId || data.minimumWageId.trim() === '')) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['minimumWageId'],\n message: CompensationErrorCodes.REQUIRED,\n })\n }\n\n if (\n data.stateWcCovered === true &&\n (!data.stateWcClassCode || data.stateWcClassCode.trim() === '')\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['stateWcClassCode'],\n message: CompensationErrorCodes.REQUIRED,\n })\n }\n\n const { flsaStatus, paymentUnit } = data\n const rate = data.rate\n\n if (\n flsaStatus === FlsaStatus.EXEMPT ||\n flsaStatus === FlsaStatus.SALARIED_NONEXEMPT ||\n flsaStatus === FlsaStatus.NONEXEMPT\n ) {\n if (rate < 1) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['rate'],\n message: CompensationErrorCodes.RATE_MINIMUM,\n })\n } else if (\n flsaStatus === FlsaStatus.EXEMPT &&\n yearlyRate(rate, paymentUnit) < FLSA_OVERTIME_SALARY_LIMIT\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['rate'],\n message: CompensationErrorCodes.RATE_EXEMPT_THRESHOLD,\n })\n }\n } else if (flsaStatus === FlsaStatus.OWNER) {\n if (paymentUnit !== PAY_PERIODS.PAYCHECK) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['paymentUnit'],\n message: CompensationErrorCodes.PAYMENT_UNIT_OWNER,\n })\n }\n if (rate < 1) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['rate'],\n message: CompensationErrorCodes.RATE_MINIMUM,\n })\n }\n } else if (\n [FlsaStatus.COMMISSION_ONLY_EXEMPT, FlsaStatus.COMMISSION_ONLY_NONEXEMPT].includes(flsaStatus)\n ) {\n if (paymentUnit !== PAY_PERIODS.YEAR) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['paymentUnit'],\n message: CompensationErrorCodes.PAYMENT_UNIT_COMMISSION,\n })\n }\n if (rate !== 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['rate'],\n message: CompensationErrorCodes.RATE_COMMISSION_ZERO,\n })\n }\n }\n })\n}\n\nexport const CompensationSchema = createCompensationSchema()\n"],"names":["CompensationErrorCodes","fieldValidators","z","FlsaStatus","PAY_PERIODS","FIXED_FIELDS","runtimeFieldValidators","val","REQUIRED_ON_CREATE","REQUIRED_ON_UPDATE","createCompensationSchema","options","mode","requiredFields","withStartDateField","effectiveRequiredFields","filterRequiredFields","effectiveRequiredOnCreate","baseSchema","composeFormSchema","modeDefaults","partnerRequired","resolveRequiredFields","isStartDateRequired","data","ctx","flsaStatus","paymentUnit","rate","yearlyRate","FLSA_OVERTIME_SALARY_LIMIT"],"mappings":"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"}
|
|
@@ -1,42 +1,46 @@
|
|
|
1
|
-
const e = "Edit Payroll", a = "{{payrollType}} payroll for <dateWrapper>{{startDate}} - {{endDate}}</dateWrapper>", t = "Edit Payroll for {{startDate}} - {{endDate}}",
|
|
1
|
+
const e = "Edit Payroll", a = "{{payrollType}} payroll for <dateWrapper>{{startDate}} - {{endDate}}</dateWrapper>", t = "{{payrollType}} payroll", o = "Edit Payroll for {{startDate}} - {{endDate}}", l = "Edit Payroll", i = "Save and exit", n = "Calculate and review", s = "Calculate and review", r = "Hours and additional earnings", p = "Review and update your employee's hours, reimbursements, and additional earnings below.", d = "Employee compensations", y = { employees: "Employees", hours: "Hours", timeOff: "Time off", additionalEarnings: "Additional earnings", reimbursements: "Reimbursements", totalPay: "Total pay" }, c = "Skipped", u = { edit: "Edit", skip: "Skip employee", unskip: "Unskip employee", setNetEarnings: "Set employee net earnings" }, m = { progressSaved: "Your progress has been saved", directDepositDeadline: "To pay your employees with direct deposit by {{payDate}}, you'll need to run payroll by {{time}} on {{date}}.", directDepositDeadlineText: "Make sure to submit before the deadline to ensure timely payments.", payrollLate: "Your original pay date was {{initialCheckDate}}", payrollLateText: "Run payroll before {{time}} on {{date}} to pay your employees on {{newCheckDate}}.", payrollDeadline: { label: "Payroll Deadline", message: "To pay your employees with direct deposit by the check date, you'll need to run payroll by the deadline." }, skippedEmployees: { label: "Skipped Employees", employeeAddressNotVerified: "Employee address not verified" }, employeeUpdated: { label: "{{employeeName}} updated successfully" } }, g = "Preparing payroll...", b = "This may take a minute or two. You can navigate away while this happens.", h = "Calculating payroll...", D = "This may take a minute or two. You can navigate away while this happens.", T = "Calculating payroll...", w = {
|
|
2
2
|
pageTitle: e,
|
|
3
3
|
description: a,
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
4
|
+
descriptionDismissal: t,
|
|
5
|
+
breadcrumbLabel: o,
|
|
6
|
+
breadcrumbLabelDismissal: l,
|
|
7
|
+
exitFlowCta: i,
|
|
8
|
+
calculatePayroll: n,
|
|
9
|
+
calculatePayrollTitle: s,
|
|
10
|
+
hoursAndEarningsTitle: r,
|
|
11
|
+
hoursAndEarningsDescription: p,
|
|
12
|
+
employeeCompensationsTitle: d,
|
|
13
|
+
tableColumns: y,
|
|
14
|
+
skippedBadge: c,
|
|
15
|
+
editMenu: u,
|
|
16
|
+
alerts: m,
|
|
17
|
+
loadingTitle: g,
|
|
18
|
+
loadingDescription: b,
|
|
19
|
+
calculatingTitle: h,
|
|
20
|
+
calculatingDescription: D,
|
|
21
|
+
calculatingPayroll: T
|
|
20
22
|
};
|
|
21
23
|
export {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
l as
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
m as alerts,
|
|
25
|
+
o as breadcrumbLabel,
|
|
26
|
+
l as breadcrumbLabelDismissal,
|
|
27
|
+
n as calculatePayroll,
|
|
28
|
+
s as calculatePayrollTitle,
|
|
29
|
+
D as calculatingDescription,
|
|
30
|
+
T as calculatingPayroll,
|
|
31
|
+
h as calculatingTitle,
|
|
32
|
+
w as default,
|
|
30
33
|
a as description,
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
t as descriptionDismissal,
|
|
35
|
+
u as editMenu,
|
|
36
|
+
d as employeeCompensationsTitle,
|
|
37
|
+
i as exitFlowCta,
|
|
38
|
+
p as hoursAndEarningsDescription,
|
|
39
|
+
r as hoursAndEarningsTitle,
|
|
40
|
+
b as loadingDescription,
|
|
41
|
+
g as loadingTitle,
|
|
38
42
|
e as pageTitle,
|
|
39
|
-
|
|
40
|
-
|
|
43
|
+
c as skippedBadge,
|
|
44
|
+
y as tableColumns
|
|
41
45
|
};
|
|
42
46
|
//# sourceMappingURL=Payroll.PayrollConfiguration.json.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Payroll.PayrollConfiguration.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Payroll.PayrollConfiguration.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;"}
|