>((acc, schedule) => {
+ acc[schedule.uuid] = schedule.name || schedule.customName || ''
+ return acc
+ }, {})
+ }, [paySchedules])
+
+ const getPayScheduleDisplayName = (payScheduleUuid: string | null | undefined) => {
+ if (!payScheduleUuid) return ''
+ return payScheduleNames[payScheduleUuid] || ''
+ }
+
return (
@@ -133,37 +145,24 @@ export const PayrollListPresentation = ({
payPeriod?.endDate,
)
- return (
-
-
- {startDate} - {endDate}
-
-
- {paySchedules.find(schedule => schedule.uuid === payPeriod?.payScheduleUuid)
- ?.name ||
- paySchedules.find(schedule => schedule.uuid === payPeriod?.payScheduleUuid)
- ?.customName}
-
-
- )
+ return `${startDate} - ${endDate}`
},
title: t('tableHeaders.0'),
+ secondaryRender: ({ payPeriod }) =>
+ getPayScheduleDisplayName(payPeriod?.payScheduleUuid),
},
{
- render: ({ payrollType }) => {t(`type.${payrollType}`)},
+ render: ({ payrollType }) => t(`type.${payrollType}`),
title: t('tableHeaders.1'),
},
{
- render: ({ checkDate }) => (
- {dateFormatter.formatShortWithWeekdayAndYear(checkDate)}
- ),
+ render: ({ checkDate }) => dateFormatter.formatShortWithWeekdayAndYear(checkDate),
title: t('tableHeaders.2'),
},
{
title: t('tableHeaders.3'),
- render: ({ payrollDeadline }) => (
- {dateFormatter.formatShortWithWeekdayAndYear(payrollDeadline)}
- ),
+ render: ({ payrollDeadline }) =>
+ dateFormatter.formatShortWithWeekdayAndYear(payrollDeadline),
},
{
title: t('tableHeaders.4'),
@@ -173,6 +172,7 @@ export const PayrollListPresentation = ({
},
{
title: '',
+ align: 'right',
render: ({ payrollUuid, calculatedAt, processed, payPeriod }) => {
if (processed) {
return null
diff --git a/src/components/Payroll/PayrollOverview/PayrollOverviewPresentation.tsx b/src/components/Payroll/PayrollOverview/PayrollOverviewPresentation.tsx
index 376ceff82..9736bcc43 100644
--- a/src/components/Payroll/PayrollOverview/PayrollOverviewPresentation.tsx
+++ b/src/components/Payroll/PayrollOverview/PayrollOverviewPresentation.tsx
@@ -5,7 +5,7 @@ import type {
} from '@gusto/embedded-api/models/components/payrollshow'
import type { PayrollPayPeriodType } from '@gusto/embedded-api/models/components/payrollpayperiodtype'
import type { CompanyBankAccount } from '@gusto/embedded-api/models/components/companybankaccount'
-import { useState, useRef } from 'react'
+import { useMemo, useState, useRef } from 'react'
import type { Employee } from '@gusto/embedded-api/models/components/employee'
import type { PayrollSubmissionBlockersType } from '@gusto/embedded-api/models/components/payrollsubmissionblockerstype'
import type { PayrollFlowAlert } from '../PayrollFlow/PayrollFlowComponents'
@@ -13,6 +13,7 @@ import { calculateTotalPayroll } from '../helpers'
import { FastAchThresholdExceeded, GenericBlocker } from './SubmissionBlockers'
import styles from './PayrollOverviewPresentation.module.scss'
import { DataView, Flex, FlexItem } from '@/components/Common'
+import type { DataViewColumn } from '@/components/Common/DataView/useDataView'
import { useContainerBreakpoints } from '@/hooks/useContainerBreakpoints/useContainerBreakpoints'
import { useComponentContext } from '@/contexts/ComponentAdapter/useComponentContext'
import { useI18n } from '@/i18n'
@@ -128,7 +129,23 @@ export const PayrollOverviewPresentation = ({
)
}
- const employeeMap = new Map(employeeDetails.map(employee => [employee.uuid, employee]))
+ const employeeMap = useMemo(() => {
+ return new Map(employeeDetails.map(employee => [employee.uuid, employee]))
+ }, [employeeDetails])
+
+ const getEmployeeName = (employeeUuid?: string | null) => {
+ if (!employeeUuid) {
+ return ''
+ }
+ const employee = employeeMap.get(employeeUuid)
+ if (!employee) {
+ return ''
+ }
+ return firstLastName({
+ first_name: employee.firstName,
+ last_name: employee.lastName,
+ })
+ }
const getEmployeeHours = (
employeeCompensations: EmployeeCompensations,
@@ -162,53 +179,47 @@ export const PayrollOverviewPresentation = ({
!comp.excluded && comp.paymentMethod === PAYMENT_METHODS.check ? acc + 1 : acc,
0,
) ?? 0
- const companyPaysColumns = [
+ const companyPaysColumns: DataViewColumn[] = [
{
key: 'employeeName',
title: t('tableHeaders.employees'),
- render: (employeeCompensations: EmployeeCompensations) => (
-
- {firstLastName({
- first_name: employeeMap.get(employeeCompensations.employeeUuid!)?.firstName,
- last_name: employeeMap.get(employeeCompensations.employeeUuid!)?.lastName,
- })}
-
- ),
+ render: (employeeCompensations: EmployeeCompensations) =>
+ getEmployeeName(employeeCompensations.employeeUuid),
},
{
key: 'grossPay',
title: t('tableHeaders.grossPay'),
- render: (employeeCompensations: EmployeeCompensations) => (
- {formatCurrency(employeeCompensations.grossPay!)}
- ),
+ align: 'right',
+ render: (employeeCompensations: EmployeeCompensations) =>
+ formatCurrency(employeeCompensations.grossPay ?? 0),
},
{
key: 'reimbursements',
title: t('tableHeaders.reimbursements'),
- render: (employeeCompensation: EmployeeCompensations) => (
- {formatCurrency(getReimbursements(employeeCompensation))}
- ),
+ align: 'right',
+ render: (employeeCompensation: EmployeeCompensations) =>
+ formatCurrency(getReimbursements(employeeCompensation)),
},
{
key: 'companyTaxes',
title: t('tableHeaders.companyTaxes'),
- render: (employeeCompensation: EmployeeCompensations) => (
- {formatCurrency(getCompanyTaxes(employeeCompensation))}
- ),
+ align: 'right',
+ render: (employeeCompensation: EmployeeCompensations) =>
+ formatCurrency(getCompanyTaxes(employeeCompensation)),
},
{
key: 'companyBenefits',
title: t('tableHeaders.companyBenefits'),
- render: (employeeCompensation: EmployeeCompensations) => (
- {formatCurrency(getCompanyBenefits(employeeCompensation))}
- ),
+ align: 'right',
+ render: (employeeCompensation: EmployeeCompensations) =>
+ formatCurrency(getCompanyBenefits(employeeCompensation)),
},
{
key: 'companyPays',
+ align: 'right',
title: t('tableHeaders.companyPays'),
- render: (employeeCompensation: EmployeeCompensations) => (
- {formatCurrency(getCompanyCost(employeeCompensation))}
- ),
+ render: (employeeCompensation: EmployeeCompensations) =>
+ formatCurrency(getCompanyCost(employeeCompensation)),
},
]
if (isProcessed) {
@@ -240,23 +251,15 @@ export const PayrollOverviewPresentation = ({
columns={companyPaysColumns}
data={payrollData.employeeCompensations!}
footer={() => ({
- employeeName: (
- <>
- {t('tableHeaders.footerTotalsLabel')}
- {t('tableHeaders.footerTotalsDescription')}
- >
- ),
- grossPay: {formatCurrency(Number(payrollData.totals?.grossPay ?? 0))},
- reimbursements: (
- {formatCurrency(Number(payrollData.totals?.reimbursements ?? 0))}
- ),
- companyTaxes: (
- {formatCurrency(Number(payrollData.totals?.employerTaxes ?? 0))}
- ),
- companyBenefits: (
- {formatCurrency(Number(payrollData.totals?.benefits ?? 0))}
- ),
- companyPays: {formatCurrency(totalPayroll)},
+ employeeName: {
+ primary: t('tableHeaders.footerTotalsLabel'),
+ secondary: t('tableHeaders.footerTotalsDescription'),
+ },
+ grossPay: formatCurrency(Number(payrollData.totals?.grossPay ?? 0)),
+ reimbursements: formatCurrency(Number(payrollData.totals?.reimbursements ?? 0)),
+ companyTaxes: formatCurrency(Number(payrollData.totals?.employerTaxes ?? 0)),
+ companyBenefits: formatCurrency(Number(payrollData.totals?.benefits ?? 0)),
+ companyPays: formatCurrency(totalPayroll),
})}
/>
),
@@ -270,86 +273,73 @@ export const PayrollOverviewPresentation = ({
columns={[
{
title: t('tableHeaders.employees'),
- render: (employeeCompensations: EmployeeCompensations) => (
-
- {firstLastName({
- first_name: employeeMap.get(employeeCompensations.employeeUuid!)?.firstName,
- last_name: employeeMap.get(employeeCompensations.employeeUuid!)?.lastName,
- })}
-
- ),
+ render: (employeeCompensations: EmployeeCompensations) =>
+ getEmployeeName(employeeCompensations.employeeUuid),
},
{
title: t('tableHeaders.compensationType'),
- render: (employeeCompensations: EmployeeCompensations) => (
-
- {employeeMap
- .get(employeeCompensations.employeeUuid!)
- ?.jobs?.reduce((acc, job) => {
- if (job.primary) {
- const flsaStatus = job.compensations?.find(
- comp => comp.uuid === job.currentCompensationUuid,
- )?.flsaStatus
+ render: (employeeCompensations: EmployeeCompensations) => {
+ const employee = employeeCompensations.employeeUuid
+ ? employeeMap.get(employeeCompensations.employeeUuid)
+ : undefined
- switch (flsaStatus) {
- case FlsaStatus.EXEMPT:
- return t('compensationTypeLabels.exempt')
- case FlsaStatus.NONEXEMPT:
- return t('compensationTypeLabels.nonexempt')
- default:
- return flsaStatus ?? ''
- }
+ return (
+ employee?.jobs?.reduce((acc, job) => {
+ if (job.primary) {
+ const flsaStatus = job.compensations?.find(
+ comp => comp.uuid === job.currentCompensationUuid,
+ )?.flsaStatus
+
+ switch (flsaStatus) {
+ case FlsaStatus.EXEMPT:
+ return t('compensationTypeLabels.exempt')
+ case FlsaStatus.NONEXEMPT:
+ return t('compensationTypeLabels.nonexempt')
+ default:
+ return flsaStatus ?? ''
}
- return acc
- }, '')}
-
- ),
+ }
+ return acc
+ }, '') ?? ''
+ )
+ },
},
{
title: t('tableHeaders.regular'),
- render: (employeeCompensations: EmployeeCompensations) => (
-
- {getEmployeeHours(employeeCompensations)[
- compensationTypeLabels.REGULAR_HOURS_NAME
- ] || 0}
-
- ),
+ align: 'right',
+ render: (employeeCompensations: EmployeeCompensations) =>
+ getEmployeeHours(employeeCompensations)[
+ compensationTypeLabels.REGULAR_HOURS_NAME
+ ] || 0,
},
{
title: t('tableHeaders.overtime'),
- render: (employeeCompensations: EmployeeCompensations) => (
-
- {getEmployeeHours(employeeCompensations)[compensationTypeLabels.OVERTIME_NAME] ||
- 0}
-
- ),
+ align: 'right',
+ render: (employeeCompensations: EmployeeCompensations) =>
+ getEmployeeHours(employeeCompensations)[compensationTypeLabels.OVERTIME_NAME] || 0,
},
{
title: t('tableHeaders.doubleOT'),
- render: (employeeCompensations: EmployeeCompensations) => (
-
- {getEmployeeHours(employeeCompensations)[
- compensationTypeLabels.DOUBLE_OVERTIME_NAME
- ] || 0}
-
- ),
+ align: 'right',
+ render: (employeeCompensations: EmployeeCompensations) =>
+ getEmployeeHours(employeeCompensations)[
+ compensationTypeLabels.DOUBLE_OVERTIME_NAME
+ ] || 0,
},
{
title: t('tableHeaders.timeOff'),
- render: (employeeCompensations: EmployeeCompensations) => (
- {getEmployeePtoHours(employeeCompensations)}
- ),
+ align: 'right',
+ render: (employeeCompensations: EmployeeCompensations) =>
+ getEmployeePtoHours(employeeCompensations),
},
{
title: t('tableHeaders.totalHours'),
- render: (employeeCompensations: EmployeeCompensations) => (
-
- {Object.values(getEmployeeHours(employeeCompensations)).reduce(
- (acc, hours) => acc + hours,
- 0,
- ) + getEmployeePtoHours(employeeCompensations)}
-
- ),
+ align: 'right',
+ render: (employeeCompensations: EmployeeCompensations) =>
+ Object.values(getEmployeeHours(employeeCompensations)).reduce(
+ (acc, hours) => acc + hours,
+ 0,
+ ) + getEmployeePtoHours(employeeCompensations),
},
]}
data={payrollData.employeeCompensations!}
@@ -365,77 +355,64 @@ export const PayrollOverviewPresentation = ({
columns={[
{
title: t('tableHeaders.employees'),
- render: (employeeCompensations: EmployeeCompensations) => (
-
- {firstLastName({
- first_name: employeeMap.get(employeeCompensations.employeeUuid!)?.firstName,
- last_name: employeeMap.get(employeeCompensations.employeeUuid!)?.lastName,
- })}
-
- ),
+ render: (employeeCompensations: EmployeeCompensations) =>
+ getEmployeeName(employeeCompensations.employeeUuid),
},
{
title: t('tableHeaders.paymentType'),
- render: (employeeCompensations: EmployeeCompensations) => (
- {employeeCompensations.paymentMethod ?? ''}
- ),
+ render: (employeeCompensations: EmployeeCompensations) =>
+ employeeCompensations.paymentMethod,
},
{
title: t('tableHeaders.grossPay'),
- render: (employeeCompensations: EmployeeCompensations) => (
- {formatCurrency(employeeCompensations.grossPay ?? 0)}
- ),
+ align: 'right',
+ render: (employeeCompensations: EmployeeCompensations) =>
+ formatCurrency(employeeCompensations.grossPay ?? 0),
},
{
title: t('tableHeaders.deductions'),
- render: (employeeCompensations: EmployeeCompensations) => (
-
- {formatCurrency(
- employeeCompensations.deductions?.reduce(
- (acc, deduction) => acc + deduction.amount!,
- 0,
- ) ?? 0,
- )}
-
- ),
+ align: 'right',
+ render: (employeeCompensations: EmployeeCompensations) =>
+ formatCurrency(
+ employeeCompensations.deductions?.reduce(
+ (acc, deduction) => acc + (deduction.amount ?? 0),
+ 0,
+ ) ?? 0,
+ ),
},
{
title: t('tableHeaders.reimbursements'),
- render: (employeeCompensations: EmployeeCompensations) => (
- {formatCurrency(getReimbursements(employeeCompensations))}
- ),
+ align: 'right',
+ render: (employeeCompensations: EmployeeCompensations) =>
+ formatCurrency(getReimbursements(employeeCompensations)),
},
{
title: t('tableHeaders.employeeTaxes'),
- render: (employeeCompensations: EmployeeCompensations) => (
-
- {formatCurrency(
- employeeCompensations.taxes?.reduce(
- (acc, tax) => (tax.employer ? acc : acc + tax.amount),
- 0,
- ) ?? 0,
- )}
-
- ),
+ align: 'right',
+ render: (employeeCompensations: EmployeeCompensations) =>
+ formatCurrency(
+ employeeCompensations.taxes?.reduce(
+ (acc, tax) => (tax.employer ? acc : acc + tax.amount),
+ 0,
+ ) ?? 0,
+ ),
},
{
title: t('tableHeaders.employeeBenefits'),
- render: (employeeCompensations: EmployeeCompensations) => (
-
- {formatCurrency(
- employeeCompensations.benefits?.reduce(
- (acc, benefit) => acc + (benefit.employeeDeduction ?? 0),
- 0,
- ) ?? 0,
- )}
-
- ),
+ align: 'right',
+ render: (employeeCompensations: EmployeeCompensations) =>
+ formatCurrency(
+ employeeCompensations.benefits?.reduce(
+ (acc, benefit) => acc + (benefit.employeeDeduction ?? 0),
+ 0,
+ ) ?? 0,
+ ),
},
{
title: t('tableHeaders.payment'),
- render: (employeeCompensations: EmployeeCompensations) => (
- {formatCurrency(employeeCompensations.netPay ?? 0)}
- ),
+ align: 'right',
+ render: (employeeCompensations: EmployeeCompensations) =>
+ formatCurrency(employeeCompensations.netPay ?? 0),
},
]}
data={payrollData.employeeCompensations!}
@@ -453,27 +430,25 @@ export const PayrollOverviewPresentation = ({
{
key: 'taxDescription',
title: t('tableHeaders.taxDescription'),
- render: taxKey => {taxKey},
+ render: taxKey => taxKey,
},
{
key: 'byYourEmployees',
title: t('tableHeaders.byYourEmployees'),
- render: taxKey => {formatCurrency(taxes[taxKey]?.employee ?? 0)},
+ align: 'right',
+ render: taxKey => formatCurrency(taxes[taxKey]?.employee ?? 0),
},
{
key: 'byYourCompany',
title: t('tableHeaders.byYourCompany'),
- render: taxKey => {formatCurrency(taxes[taxKey]?.employer ?? 0)},
+ align: 'right',
+ render: taxKey => formatCurrency(taxes[taxKey]?.employer ?? 0),
},
]}
footer={() => ({
- taxDescription: {t('totalsLabel')},
- byYourEmployees: (
- {formatCurrency(Number(payrollData.totals?.employeeTaxes ?? 0))}
- ),
- byYourCompany: (
- {formatCurrency(Number(payrollData.totals?.employerTaxes ?? 0))}
- ),
+ taxDescription: t('totalsLabel'),
+ byYourEmployees: formatCurrency(Number(payrollData.totals?.employeeTaxes ?? 0)),
+ byYourCompany: formatCurrency(Number(payrollData.totals?.employerTaxes ?? 0)),
})}
data={Object.keys(taxes)}
/>
@@ -483,11 +458,12 @@ export const PayrollOverviewPresentation = ({
columns={[
{
title: t('tableHeaders.debitedByGusto'),
- render: ({ label }) => {label},
+ render: ({ label }) => label,
},
{
title: t('tableHeaders.taxesTotal'),
- render: ({ value }) => {formatCurrency(Number(value))},
+ align: 'right',
+ render: ({ value }) => formatCurrency(Number(value)),
},
]}
data={[
@@ -626,27 +602,23 @@ export const PayrollOverviewPresentation = ({
columns={[
{
title: t('tableHeaders.totalPayroll'),
- render: () => {formatCurrency(totalPayroll)},
+ render: () => formatCurrency(totalPayroll),
},
{
title: t('tableHeaders.debitAmount'),
- render: () => (
- {formatCurrency(Number(payrollData.totals?.companyDebit ?? 0))}
- ),
+ render: () => formatCurrency(Number(payrollData.totals?.companyDebit ?? 0)),
},
{
title: t('tableHeaders.debitAccount'),
- render: () => {bankAccount?.hiddenAccountNumber ?? ''},
+ render: () => bankAccount?.hiddenAccountNumber ?? '',
},
{
title: t('tableHeaders.debitDate'),
- render: () => {dateFormatter.formatShortWithYear(expectedDebitDate)},
+ render: () => dateFormatter.formatShortWithYear(expectedDebitDate),
},
{
title: t('tableHeaders.employeesPayDate'),
- render: () => (
- {dateFormatter.formatShortWithYear(payrollData.checkDate)}
- ),
+ render: () => dateFormatter.formatShortWithYear(payrollData.checkDate),
},
]}
data={[{}]}