@gusto/embedded-react-sdk 0.55.5 → 0.55.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/components/Common/DataView/DataTable/DataTable.js +44 -41
  3. package/dist/components/Common/DataView/DataTable/DataTable.js.map +1 -1
  4. package/dist/components/Common/RequirementsList/RequirementsList.js +21 -12
  5. package/dist/components/Common/RequirementsList/RequirementsList.js.map +1 -1
  6. package/dist/components/Common/UI/Table/Table.module.scss.js +1 -1
  7. package/dist/components/Company/AssignSignatory/CreateSignatory/useCreateSignatory.js +3 -6
  8. package/dist/components/Company/AssignSignatory/CreateSignatory/useCreateSignatory.js.map +1 -1
  9. package/dist/components/Company/AssignSignatory/InviteSignatory/useInviteSignatory.js +3 -6
  10. package/dist/components/Company/AssignSignatory/InviteSignatory/useInviteSignatory.js.map +1 -1
  11. package/dist/components/Company/AssignSignatory/useAssignSignatory.js +5 -8
  12. package/dist/components/Company/AssignSignatory/useAssignSignatory.js.map +1 -1
  13. package/dist/components/Company/BankAccount/BankAccountForm/context.js +3 -6
  14. package/dist/components/Company/BankAccount/BankAccountForm/context.js.map +1 -1
  15. package/dist/components/Company/DocumentSigner/DocumentList/useDocumentList.js +3 -6
  16. package/dist/components/Company/DocumentSigner/DocumentList/useDocumentList.js.map +1 -1
  17. package/dist/components/Company/FederalTaxes/useFederalTaxes.js +8 -11
  18. package/dist/components/Company/FederalTaxes/useFederalTaxes.js.map +1 -1
  19. package/dist/components/Company/Industry/Context.js +6 -9
  20. package/dist/components/Company/Industry/Context.js.map +1 -1
  21. package/dist/components/Company/Locations/LocationForm/useLocationForm.js +3 -6
  22. package/dist/components/Company/Locations/LocationForm/useLocationForm.js.map +1 -1
  23. package/dist/components/Company/Locations/LocationsList/useLocationsList.js +3 -6
  24. package/dist/components/Company/Locations/LocationsList/useLocationsList.js.map +1 -1
  25. package/dist/components/Company/OnboardingOverview/context.js +3 -6
  26. package/dist/components/Company/OnboardingOverview/context.js.map +1 -1
  27. package/dist/components/Company/PaySchedule/PaySchedule.js +21 -15
  28. package/dist/components/Company/PaySchedule/PaySchedule.js.map +1 -1
  29. package/dist/components/Company/StateTaxes/StateTaxesForm/context.js +3 -6
  30. package/dist/components/Company/StateTaxes/StateTaxesForm/context.js.map +1 -1
  31. package/dist/components/Company/StateTaxes/StateTaxesList/context.js +3 -6
  32. package/dist/components/Company/StateTaxes/StateTaxesList/context.js.map +1 -1
  33. package/dist/components/Company/StateTaxes/TaxRateManagement/TaxRateHistorySection.js +1 -0
  34. package/dist/components/Company/StateTaxes/TaxRateManagement/TaxRateHistorySection.js.map +1 -1
  35. package/dist/components/Company/StateTaxes/TaxRateManagement/context.js +3 -6
  36. package/dist/components/Company/StateTaxes/TaxRateManagement/context.js.map +1 -1
  37. package/dist/components/Contractor/Compensation/management/CompensationEditForm.js +20 -17
  38. package/dist/components/Contractor/Compensation/management/CompensationEditForm.js.map +1 -1
  39. package/dist/components/Contractor/Compensation/shared/useContractorPayForm/contractorPaySchema.d.ts +1 -0
  40. package/dist/components/Contractor/Compensation/shared/useContractorPayForm/contractorPaySchema.js +21 -17
  41. package/dist/components/Contractor/Compensation/shared/useContractorPayForm/contractorPaySchema.js.map +1 -1
  42. package/dist/components/Contractor/Compensation/shared/useContractorPayForm/fields.d.ts +7 -1
  43. package/dist/components/Contractor/Compensation/shared/useContractorPayForm/fields.js.map +1 -1
  44. package/dist/components/Contractor/Compensation/shared/useContractorPayForm/index.d.ts +1 -1
  45. package/dist/components/Contractor/ContractorList/management/ManagementContractorListView.js +112 -100
  46. package/dist/components/Contractor/ContractorList/management/ManagementContractorListView.js.map +1 -1
  47. package/dist/components/Contractor/ContractorList/onboarding/ContractorListView.js +46 -40
  48. package/dist/components/Contractor/ContractorList/onboarding/ContractorListView.js.map +1 -1
  49. package/dist/components/Contractor/Payments/PaymentStatement/PaymentStatementPresentation.js +10 -9
  50. package/dist/components/Contractor/Payments/PaymentStatement/PaymentStatementPresentation.js.map +1 -1
  51. package/dist/components/Contractor/Profile/onboarding/ContractorProfile.js +22 -19
  52. package/dist/components/Contractor/Profile/onboarding/ContractorProfile.js.map +1 -1
  53. package/dist/components/Contractor/Profile/shared/useContractorDetailsForm/contractorDetailsSchema.d.ts +1 -0
  54. package/dist/components/Contractor/Profile/shared/useContractorDetailsForm/contractorDetailsSchema.js +34 -30
  55. package/dist/components/Contractor/Profile/shared/useContractorDetailsForm/contractorDetailsSchema.js.map +1 -1
  56. package/dist/components/Contractor/Profile/shared/useContractorDetailsForm/fields.d.ts +7 -1
  57. package/dist/components/Contractor/Profile/shared/useContractorDetailsForm/fields.js.map +1 -1
  58. package/dist/components/Contractor/Profile/shared/useContractorDetailsForm/index.d.ts +1 -1
  59. package/dist/components/Contractor/Profile/shared/useContractorDetailsForm/useContractorDetailsForm.js +32 -32
  60. package/dist/components/Contractor/Profile/shared/useContractorDetailsForm/useContractorDetailsForm.js.map +1 -1
  61. package/dist/components/Employee/Compensation/onboarding/JobsList/JobsListPresentation.js +1 -0
  62. package/dist/components/Employee/Compensation/onboarding/JobsList/JobsListPresentation.js.map +1 -1
  63. package/dist/components/Employee/Deductions/management/DeductionsCard/DeductionsCard.js +11 -10
  64. package/dist/components/Employee/Deductions/management/DeductionsCard/DeductionsCard.js.map +1 -1
  65. package/dist/components/Employee/Deductions/onboarding/DeductionsList/DeductionsList.js +7 -6
  66. package/dist/components/Employee/Deductions/onboarding/DeductionsList/DeductionsList.js.map +1 -1
  67. package/dist/components/Employee/Documents/onboarding/DocumentSigner/DocumentList/useDocumentList.js +3 -6
  68. package/dist/components/Employee/Documents/onboarding/DocumentSigner/DocumentList/useDocumentList.js.map +1 -1
  69. package/dist/components/Employee/PaymentMethod/onboarding/ListView.js +20 -19
  70. package/dist/components/Employee/PaymentMethod/onboarding/ListView.js.map +1 -1
  71. package/dist/components/Employee/Paystubs/management/PaystubsCard/PaystubsCard.js +12 -10
  72. package/dist/components/Employee/Paystubs/management/PaystubsCard/PaystubsCard.js.map +1 -1
  73. package/dist/components/Payroll/GrossUpModal/GrossUpModal.js +2 -3
  74. package/dist/components/Payroll/GrossUpModal/GrossUpModal.js.map +1 -1
  75. package/dist/components/Payroll/OffCyclePayPeriodDateForm/OffCyclePayPeriodDateFormPresentation.js +13 -12
  76. package/dist/components/Payroll/OffCyclePayPeriodDateForm/OffCyclePayPeriodDateFormPresentation.js.map +1 -1
  77. package/dist/components/Payroll/OffCycleTaxWithholdingTable/OffCycleTaxWithholdingTable.module.scss.js +1 -1
  78. package/dist/components/Payroll/PayrollConfiguration/PayrollConfiguration.js +200 -195
  79. package/dist/components/Payroll/PayrollConfiguration/PayrollConfiguration.js.map +1 -1
  80. package/dist/components/Payroll/PayrollConfiguration/PayrollConfigurationPresentation.js +93 -85
  81. package/dist/components/Payroll/PayrollConfiguration/PayrollConfigurationPresentation.js.map +1 -1
  82. package/dist/components/Payroll/PayrollConfiguration/useCalculationPoll.d.ts +50 -0
  83. package/dist/components/Payroll/PayrollConfiguration/useCalculationPoll.js +52 -0
  84. package/dist/components/Payroll/PayrollConfiguration/useCalculationPoll.js.map +1 -0
  85. package/dist/components/Payroll/PayrollEditEmployee/PayrollEditEmployee.js +52 -50
  86. package/dist/components/Payroll/PayrollEditEmployee/PayrollEditEmployee.js.map +1 -1
  87. package/dist/components/Payroll/PayrollEditEmployee/PayrollEditEmployeePresentation.js +259 -255
  88. package/dist/components/Payroll/PayrollEditEmployee/PayrollEditEmployeePresentation.js.map +1 -1
  89. package/dist/components/Payroll/PayrollEditEmployee/shared/usePayrollEditEmployeeForm/fields.d.ts +278 -0
  90. package/dist/components/Payroll/PayrollEditEmployee/shared/usePayrollEditEmployeeForm/index.d.ts +1 -0
  91. package/dist/components/Payroll/PayrollEditEmployee/shared/usePayrollEditEmployeeForm/payrollEditEmployeeHelpers.d.ts +108 -0
  92. package/dist/components/Payroll/PayrollEditEmployee/shared/usePayrollEditEmployeeForm/payrollEditEmployeeHelpers.test.d.ts +1 -0
  93. package/dist/components/Payroll/PayrollEditEmployee/shared/usePayrollEditEmployeeForm/payrollEditEmployeeSchema.d.ts +95 -0
  94. package/dist/components/Payroll/PayrollEditEmployee/shared/usePayrollEditEmployeeForm/payrollEditEmployeeSchema.test.d.ts +1 -0
  95. package/dist/components/Payroll/PayrollEditEmployee/shared/usePayrollEditEmployeeForm/usePayrollEditEmployeeForm.d.ts +126 -0
  96. package/dist/components/Payroll/PayrollHistory/PayrollHistoryPresentation.js +1 -0
  97. package/dist/components/Payroll/PayrollHistory/PayrollHistoryPresentation.js.map +1 -1
  98. package/dist/components/Payroll/PayrollOverview/PayrollOverview.js +191 -183
  99. package/dist/components/Payroll/PayrollOverview/PayrollOverview.js.map +1 -1
  100. package/dist/components/Payroll/PayrollOverview/PayrollOverviewPresentation.js +117 -107
  101. package/dist/components/Payroll/PayrollOverview/PayrollOverviewPresentation.js.map +1 -1
  102. package/dist/components/Payroll/PayrollOverview/useSubmissionPoll.d.ts +39 -0
  103. package/dist/components/Payroll/PayrollOverview/useSubmissionPoll.js +46 -0
  104. package/dist/components/Payroll/PayrollOverview/useSubmissionPoll.js.map +1 -0
  105. package/dist/components/Payroll/PayrollReceipts/PayrollReceiptsPresentation.js +40 -34
  106. package/dist/components/Payroll/PayrollReceipts/PayrollReceiptsPresentation.js.map +1 -1
  107. package/dist/components/Payroll/PrintChecks/PrintChecksForm/PrintChecksForm.js +72 -87
  108. package/dist/components/Payroll/PrintChecks/PrintChecksForm/PrintChecksForm.js.map +1 -1
  109. package/dist/components/Payroll/PrintChecks/PrintChecksForm/useGenerationPoll.d.ts +17 -0
  110. package/dist/components/Payroll/PrintChecks/PrintChecksForm/useGenerationPoll.js +55 -0
  111. package/dist/components/Payroll/PrintChecks/PrintChecksForm/useGenerationPoll.js.map +1 -0
  112. package/dist/components/Payroll/RecoveryCases/RecoveryCasesList/RecoveryCasesList.js +2 -0
  113. package/dist/components/Payroll/RecoveryCases/RecoveryCasesList/RecoveryCasesList.js.map +1 -1
  114. package/dist/components/Payroll/UNSTABLE_PayrollEditEmployee/UNSTABLE_PayrollEditEmployee.d.ts +13 -0
  115. package/dist/components/Payroll/UNSTABLE_PayrollEditEmployee/UNSTABLE_PayrollEditEmployee.js +58 -0
  116. package/dist/components/Payroll/UNSTABLE_PayrollEditEmployee/UNSTABLE_PayrollEditEmployee.js.map +1 -0
  117. package/dist/components/Payroll/UNSTABLE_PayrollEditEmployee/UNSTABLE_PayrollEditEmployee.module.scss.js +8 -0
  118. package/dist/components/Payroll/UNSTABLE_PayrollEditEmployee/UNSTABLE_PayrollEditEmployee.module.scss.js.map +1 -0
  119. package/dist/components/Payroll/helpers.d.ts +15 -0
  120. package/dist/components/Payroll/helpers.js.map +1 -1
  121. package/dist/components/Payroll/usePreparedPayrollData.js +12 -15
  122. package/dist/components/Payroll/usePreparedPayrollData.js.map +1 -1
  123. package/dist/components/TimeOff/shared/EmployeeTable/EmployeeTable.js +35 -35
  124. package/dist/components/TimeOff/shared/EmployeeTable/EmployeeTable.js.map +1 -1
  125. package/dist/components/TimeOff/shared/EmployeeTable/EmployeeTable.module.scss.js +4 -4
  126. package/dist/contexts/UnstableFeaturesProvider/useUnstableFeature.d.ts +2 -0
  127. package/dist/contexts/UnstableFeaturesProvider/useUnstableFeature.js.map +1 -1
  128. package/dist/hooks/usePollingTask/usePollingTask.d.ts +101 -0
  129. package/dist/hooks/usePollingTask/usePollingTask.js +50 -0
  130. package/dist/hooks/usePollingTask/usePollingTask.js.map +1 -0
  131. package/dist/hooks/usePollingTask/usePollingTask.test.d.ts +1 -0
  132. package/dist/i18n/I18n.js +147 -30
  133. package/dist/i18n/I18n.js.map +1 -1
  134. package/dist/i18n/en/Contractor.ContractorList.json.js +14 -12
  135. package/dist/i18n/en/Contractor.ContractorList.json.js.map +1 -1
  136. package/dist/i18n/en/Contractor.Management.Compensation.json.js +6 -6
  137. package/dist/i18n/en/Contractor.ManagementContractorList.json.js +8 -8
  138. package/dist/i18n/en/Contractor.Profile.json.js +5 -5
  139. package/dist/i18n/en/Payroll.OffCyclePayPeriodDateForm.json.js +7 -5
  140. package/dist/i18n/en/Payroll.OffCyclePayPeriodDateForm.json.js.map +1 -1
  141. package/dist/i18n/en/Payroll.PayrollHistory.json.js +8 -8
  142. package/dist/i18n/en/Payroll.PayrollOverview.json.js +16 -16
  143. package/dist/i18n/en/Payroll.UNSTABLE_PayrollEditEmployee.json.js +98 -0
  144. package/dist/i18n/en/Payroll.UNSTABLE_PayrollEditEmployee.json.js.map +1 -0
  145. package/dist/i18n/en/common.json.d.ts +1 -0
  146. package/dist/i18n/en/common.json.js +1 -1
  147. package/dist/i18n/es_US/Company.Addresses.json.js +8 -0
  148. package/dist/i18n/es_US/Company.Addresses.json.js.map +1 -0
  149. package/dist/i18n/es_US/Company.AssignSignatory.json.js +22 -0
  150. package/dist/i18n/es_US/Company.AssignSignatory.json.js.map +1 -0
  151. package/dist/i18n/es_US/Company.BankAccount.json.js +20 -0
  152. package/dist/i18n/es_US/Company.BankAccount.json.js.map +1 -0
  153. package/dist/i18n/es_US/Company.DocumentList.json.js +28 -0
  154. package/dist/i18n/es_US/Company.DocumentList.json.js.map +1 -0
  155. package/dist/i18n/es_US/Company.FederalTaxes.json.js +28 -0
  156. package/dist/i18n/es_US/Company.FederalTaxes.json.js.map +1 -0
  157. package/dist/i18n/es_US/Company.Industry.json.js +12 -0
  158. package/dist/i18n/es_US/Company.Industry.json.js.map +1 -0
  159. package/dist/i18n/es_US/Company.Locations.json.js +44 -0
  160. package/dist/i18n/es_US/Company.Locations.json.js.map +1 -0
  161. package/dist/i18n/es_US/Company.OnboardingOverview.json.js +24 -0
  162. package/dist/i18n/es_US/Company.OnboardingOverview.json.js.map +1 -0
  163. package/dist/i18n/es_US/Company.PaySchedule.json.js +36 -0
  164. package/dist/i18n/es_US/Company.PaySchedule.json.js.map +1 -0
  165. package/dist/i18n/es_US/Company.SignatureForm.json.js +20 -0
  166. package/dist/i18n/es_US/Company.SignatureForm.json.js.map +1 -0
  167. package/dist/i18n/es_US/Company.StateTaxes.json.js +12 -0
  168. package/dist/i18n/es_US/Company.StateTaxes.json.js.map +1 -0
  169. package/dist/i18n/es_US/Company.TimeOff.CreateTimeOffPolicy.json.js +18 -0
  170. package/dist/i18n/es_US/Company.TimeOff.CreateTimeOffPolicy.json.js.map +1 -0
  171. package/dist/i18n/es_US/Company.TimeOff.EmployeeTable.json.js +26 -0
  172. package/dist/i18n/es_US/Company.TimeOff.EmployeeTable.json.js.map +1 -0
  173. package/dist/i18n/es_US/Company.TimeOff.HolidayPolicy.json.js +26 -0
  174. package/dist/i18n/es_US/Company.TimeOff.HolidayPolicy.json.js.map +1 -0
  175. package/dist/i18n/es_US/Company.TimeOff.PolicyDetail.json.js +14 -0
  176. package/dist/i18n/es_US/Company.TimeOff.PolicyDetail.json.js.map +1 -0
  177. package/dist/i18n/es_US/Company.TimeOff.SelectEmployees.json.js +22 -0
  178. package/dist/i18n/es_US/Company.TimeOff.SelectEmployees.json.js.map +1 -0
  179. package/dist/i18n/es_US/Company.TimeOff.SelectPolicyType.json.js +26 -0
  180. package/dist/i18n/es_US/Company.TimeOff.SelectPolicyType.json.js.map +1 -0
  181. package/dist/i18n/es_US/Company.TimeOff.TimeOffPolicies.json.js +40 -0
  182. package/dist/i18n/es_US/Company.TimeOff.TimeOffPolicies.json.js.map +1 -0
  183. package/dist/i18n/es_US/Company.TimeOff.TimeOffPolicyDetails.json.js +52 -0
  184. package/dist/i18n/es_US/Company.TimeOff.TimeOffPolicyDetails.json.js.map +1 -0
  185. package/dist/i18n/es_US/Company.TimeOff.TimeOffRequests.json.js +21 -0
  186. package/dist/i18n/es_US/Company.TimeOff.TimeOffRequests.json.js.map +1 -0
  187. package/dist/i18n/es_US/Contractor.Address.json.js +22 -0
  188. package/dist/i18n/es_US/Contractor.Address.json.js.map +1 -0
  189. package/dist/i18n/es_US/Contractor.BankAccountFields.json.js +12 -0
  190. package/dist/i18n/es_US/Contractor.BankAccountFields.json.js.map +1 -0
  191. package/dist/i18n/es_US/Contractor.ContractorList.json.js +24 -0
  192. package/dist/i18n/es_US/Contractor.ContractorList.json.js.map +1 -0
  193. package/dist/i18n/es_US/Contractor.Dashboard.json.js +14 -0
  194. package/dist/i18n/es_US/Contractor.Dashboard.json.js.map +1 -0
  195. package/dist/i18n/es_US/Contractor.DocumentsList.json.js +18 -0
  196. package/dist/i18n/es_US/Contractor.DocumentsList.json.js.map +1 -0
  197. package/dist/i18n/es_US/Contractor.Landing.json.js +18 -0
  198. package/dist/i18n/es_US/Contractor.Landing.json.js.map +1 -0
  199. package/dist/i18n/es_US/Contractor.Management.Address.json.js +14 -0
  200. package/dist/i18n/es_US/Contractor.Management.Address.json.js.map +1 -0
  201. package/dist/i18n/es_US/Contractor.Management.Compensation.json.js +22 -0
  202. package/dist/i18n/es_US/Contractor.Management.Compensation.json.js.map +1 -0
  203. package/dist/i18n/es_US/Contractor.Management.Documents.json.js +16 -0
  204. package/dist/i18n/es_US/Contractor.Management.Documents.json.js.map +1 -0
  205. package/dist/i18n/es_US/Contractor.Management.PaymentMethod.json.js +24 -0
  206. package/dist/i18n/es_US/Contractor.Management.PaymentMethod.json.js.map +1 -0
  207. package/dist/i18n/es_US/Contractor.Management.Profile.json.js +20 -0
  208. package/dist/i18n/es_US/Contractor.Management.Profile.json.js.map +1 -0
  209. package/dist/i18n/es_US/Contractor.ManagementContractorList.json.js +48 -0
  210. package/dist/i18n/es_US/Contractor.ManagementContractorList.json.js.map +1 -0
  211. package/dist/i18n/es_US/Contractor.NewHireReport.json.js +22 -0
  212. package/dist/i18n/es_US/Contractor.NewHireReport.json.js.map +1 -0
  213. package/dist/i18n/es_US/Contractor.OnboardingSummary.json.js +10 -0
  214. package/dist/i18n/es_US/Contractor.OnboardingSummary.json.js.map +1 -0
  215. package/dist/i18n/es_US/Contractor.PaymentMethod.json.js +20 -0
  216. package/dist/i18n/es_US/Contractor.PaymentMethod.json.js.map +1 -0
  217. package/dist/i18n/es_US/Contractor.Payments.CreateHistoricalPayment.json.js +34 -0
  218. package/dist/i18n/es_US/Contractor.Payments.CreateHistoricalPayment.json.js.map +1 -0
  219. package/dist/i18n/es_US/Contractor.Payments.CreatePayment.json.js +42 -0
  220. package/dist/i18n/es_US/Contractor.Payments.CreatePayment.json.js.map +1 -0
  221. package/dist/i18n/es_US/Contractor.Payments.HistoricalPaymentSummary.json.js +42 -0
  222. package/dist/i18n/es_US/Contractor.Payments.HistoricalPaymentSummary.json.js.map +1 -0
  223. package/dist/i18n/es_US/Contractor.Payments.PaymentHistory.json.js +26 -0
  224. package/dist/i18n/es_US/Contractor.Payments.PaymentHistory.json.js.map +1 -0
  225. package/dist/i18n/es_US/Contractor.Payments.PaymentStatement.json.js +22 -0
  226. package/dist/i18n/es_US/Contractor.Payments.PaymentStatement.json.js.map +1 -0
  227. package/dist/i18n/es_US/Contractor.Payments.PaymentSummary.json.js +54 -0
  228. package/dist/i18n/es_US/Contractor.Payments.PaymentSummary.json.js.map +1 -0
  229. package/dist/i18n/es_US/Contractor.Payments.PaymentsList.json.js +32 -0
  230. package/dist/i18n/es_US/Contractor.Payments.PaymentsList.json.js.map +1 -0
  231. package/dist/i18n/es_US/Contractor.Profile.json.js +18 -0
  232. package/dist/i18n/es_US/Contractor.Profile.json.js.map +1 -0
  233. package/dist/i18n/es_US/Contractor.SelectContractors.json.js +18 -0
  234. package/dist/i18n/es_US/Contractor.SelectContractors.json.js.map +1 -0
  235. package/dist/i18n/es_US/Contractor.SignatureForm.json.js +34 -0
  236. package/dist/i18n/es_US/Contractor.SignatureForm.json.js.map +1 -0
  237. package/dist/i18n/es_US/Contractor.Submit.json.js +26 -0
  238. package/dist/i18n/es_US/Contractor.Submit.json.js.map +1 -0
  239. package/dist/i18n/es_US/Employee.BankAccount.json.js +14 -0
  240. package/dist/i18n/es_US/Employee.BankAccount.json.js.map +1 -0
  241. package/dist/i18n/es_US/Employee.BankFormBody.json.js +12 -0
  242. package/dist/i18n/es_US/Employee.BankFormBody.json.js.map +1 -0
  243. package/dist/i18n/es_US/Employee.Compensation.json.js +68 -0
  244. package/dist/i18n/es_US/Employee.Compensation.json.js.map +1 -0
  245. package/dist/i18n/es_US/Employee.Dashboard.json.js +12 -0
  246. package/dist/i18n/es_US/Employee.Dashboard.json.js.map +1 -0
  247. package/dist/i18n/es_US/Employee.Deductions.json.js +142 -0
  248. package/dist/i18n/es_US/Employee.Deductions.json.js.map +1 -0
  249. package/dist/i18n/es_US/Employee.DeductionsForm.json.js +24 -0
  250. package/dist/i18n/es_US/Employee.DeductionsForm.json.js.map +1 -0
  251. package/dist/i18n/es_US/Employee.DocumentManager.json.js +10 -0
  252. package/dist/i18n/es_US/Employee.DocumentManager.json.js.map +1 -0
  253. package/dist/i18n/es_US/Employee.DocumentSigner.json.js +28 -0
  254. package/dist/i18n/es_US/Employee.DocumentSigner.json.js.map +1 -0
  255. package/dist/i18n/es_US/Employee.EmployeeDocuments.json.js +10 -0
  256. package/dist/i18n/es_US/Employee.EmployeeDocuments.json.js.map +1 -0
  257. package/dist/i18n/es_US/Employee.EmployeeList.json.js +30 -0
  258. package/dist/i18n/es_US/Employee.EmployeeList.json.js.map +1 -0
  259. package/dist/i18n/es_US/Employee.EmploymentEligibility.json.js +22 -0
  260. package/dist/i18n/es_US/Employee.EmploymentEligibility.json.js.map +1 -0
  261. package/dist/i18n/es_US/Employee.FederalTaxes.json.js +46 -0
  262. package/dist/i18n/es_US/Employee.FederalTaxes.json.js.map +1 -0
  263. package/dist/i18n/es_US/Employee.FederalTaxesView.json.js +38 -0
  264. package/dist/i18n/es_US/Employee.FederalTaxesView.json.js.map +1 -0
  265. package/dist/i18n/es_US/Employee.HomeAddress.json.js +24 -0
  266. package/dist/i18n/es_US/Employee.HomeAddress.json.js.map +1 -0
  267. package/dist/i18n/es_US/Employee.I9SignatureForm.json.js +64 -0
  268. package/dist/i18n/es_US/Employee.I9SignatureForm.json.js.map +1 -0
  269. package/dist/i18n/es_US/Employee.Landing.json.js +16 -0
  270. package/dist/i18n/es_US/Employee.Landing.json.js.map +1 -0
  271. package/dist/i18n/es_US/Employee.Management.Compensation.json.js +66 -0
  272. package/dist/i18n/es_US/Employee.Management.Compensation.json.js.map +1 -0
  273. package/dist/i18n/es_US/Employee.Management.Deductions.json.js +26 -0
  274. package/dist/i18n/es_US/Employee.Management.Deductions.json.js.map +1 -0
  275. package/dist/i18n/es_US/Employee.Management.Documents.json.js +18 -0
  276. package/dist/i18n/es_US/Employee.Management.Documents.json.js.map +1 -0
  277. package/dist/i18n/es_US/Employee.Management.FederalTaxes.json.js +42 -0
  278. package/dist/i18n/es_US/Employee.Management.FederalTaxes.json.js.map +1 -0
  279. package/dist/i18n/es_US/Employee.Management.HomeAddress.json.js +56 -0
  280. package/dist/i18n/es_US/Employee.Management.HomeAddress.json.js.map +1 -0
  281. package/dist/i18n/es_US/Employee.Management.PaymentMethod.json.js +24 -0
  282. package/dist/i18n/es_US/Employee.Management.PaymentMethod.json.js.map +1 -0
  283. package/dist/i18n/es_US/Employee.Management.PaymentMethodBankForm.json.js +12 -0
  284. package/dist/i18n/es_US/Employee.Management.PaymentMethodBankForm.json.js.map +1 -0
  285. package/dist/i18n/es_US/Employee.Management.PaymentMethodSplitForm.json.js +22 -0
  286. package/dist/i18n/es_US/Employee.Management.PaymentMethodSplitForm.json.js.map +1 -0
  287. package/dist/i18n/es_US/Employee.Management.Paystubs.json.js +28 -0
  288. package/dist/i18n/es_US/Employee.Management.Paystubs.json.js.map +1 -0
  289. package/dist/i18n/es_US/Employee.Management.Profile.json.js +16 -0
  290. package/dist/i18n/es_US/Employee.Management.Profile.json.js.map +1 -0
  291. package/dist/i18n/es_US/Employee.Management.StateTaxes.json.js +16 -0
  292. package/dist/i18n/es_US/Employee.Management.StateTaxes.json.js.map +1 -0
  293. package/dist/i18n/es_US/Employee.Management.WorkAddress.json.js +52 -0
  294. package/dist/i18n/es_US/Employee.Management.WorkAddress.json.js.map +1 -0
  295. package/dist/i18n/es_US/Employee.ManagementEmployeeList.json.js +26 -0
  296. package/dist/i18n/es_US/Employee.ManagementEmployeeList.json.js.map +1 -0
  297. package/dist/i18n/es_US/Employee.OnboardingSummary.json.js +22 -0
  298. package/dist/i18n/es_US/Employee.OnboardingSummary.json.js.map +1 -0
  299. package/dist/i18n/es_US/Employee.PaySchedules.json.js +12 -0
  300. package/dist/i18n/es_US/Employee.PaySchedules.json.js.map +1 -0
  301. package/dist/i18n/es_US/Employee.PaymentMethod.json.js +68 -0
  302. package/dist/i18n/es_US/Employee.PaymentMethod.json.js.map +1 -0
  303. package/dist/i18n/es_US/Employee.Profile.json.js +32 -0
  304. package/dist/i18n/es_US/Employee.Profile.json.js.map +1 -0
  305. package/dist/i18n/es_US/Employee.SplitPaycheck.json.js +26 -0
  306. package/dist/i18n/es_US/Employee.SplitPaycheck.json.js.map +1 -0
  307. package/dist/i18n/es_US/Employee.SplitPaymentsFormBody.json.js +22 -0
  308. package/dist/i18n/es_US/Employee.SplitPaymentsFormBody.json.js.map +1 -0
  309. package/dist/i18n/es_US/Employee.StateTaxes.json.js +14 -0
  310. package/dist/i18n/es_US/Employee.StateTaxes.json.js.map +1 -0
  311. package/dist/i18n/es_US/Employee.StateTaxesView.json.js +12 -0
  312. package/dist/i18n/es_US/Employee.StateTaxesView.json.js.map +1 -0
  313. package/dist/i18n/es_US/Employee.Terminations.TerminateEmployee.json.js +18 -0
  314. package/dist/i18n/es_US/Employee.Terminations.TerminateEmployee.json.js.map +1 -0
  315. package/dist/i18n/es_US/Employee.Terminations.TerminationFlow.json.js +12 -0
  316. package/dist/i18n/es_US/Employee.Terminations.TerminationFlow.json.js.map +1 -0
  317. package/dist/i18n/es_US/Employee.Terminations.TerminationSummary.json.js +20 -0
  318. package/dist/i18n/es_US/Employee.Terminations.TerminationSummary.json.js.map +1 -0
  319. package/dist/i18n/es_US/InformationRequests.InformationRequestForm.json.js +20 -0
  320. package/dist/i18n/es_US/InformationRequests.InformationRequestForm.json.js.map +1 -0
  321. package/dist/i18n/es_US/InformationRequests.InformationRequestList.json.js +18 -0
  322. package/dist/i18n/es_US/InformationRequests.InformationRequestList.json.js.map +1 -0
  323. package/dist/i18n/es_US/InformationRequests.json.js +8 -0
  324. package/dist/i18n/es_US/InformationRequests.json.js.map +1 -0
  325. package/dist/i18n/es_US/Payroll.Common.json.js +8 -0
  326. package/dist/i18n/es_US/Payroll.Common.json.js.map +1 -0
  327. package/dist/i18n/es_US/Payroll.ConfirmWireDetailsBanner.json.js +14 -0
  328. package/dist/i18n/es_US/Payroll.ConfirmWireDetailsBanner.json.js.map +1 -0
  329. package/dist/i18n/es_US/Payroll.ConfirmWireDetailsForm.json.js +26 -0
  330. package/dist/i18n/es_US/Payroll.ConfirmWireDetailsForm.json.js.map +1 -0
  331. package/dist/i18n/es_US/Payroll.Dismissal.json.js +16 -0
  332. package/dist/i18n/es_US/Payroll.Dismissal.json.js.map +1 -0
  333. package/dist/i18n/es_US/Payroll.EmployeeSelection.json.js +8 -0
  334. package/dist/i18n/es_US/Payroll.EmployeeSelection.json.js.map +1 -0
  335. package/dist/i18n/es_US/Payroll.GrossUpModal.json.js +26 -0
  336. package/dist/i18n/es_US/Payroll.GrossUpModal.json.js.map +1 -0
  337. package/dist/i18n/es_US/Payroll.OffCycle.json.js +8 -0
  338. package/dist/i18n/es_US/Payroll.OffCycle.json.js.map +1 -0
  339. package/dist/i18n/es_US/Payroll.OffCycleCreation.json.js +16 -0
  340. package/dist/i18n/es_US/Payroll.OffCycleCreation.json.js.map +1 -0
  341. package/dist/i18n/es_US/Payroll.OffCycleDeductionsSetting.json.js +8 -0
  342. package/dist/i18n/es_US/Payroll.OffCycleDeductionsSetting.json.js.map +1 -0
  343. package/dist/i18n/es_US/Payroll.OffCyclePayPeriodDateForm.json.js +14 -0
  344. package/dist/i18n/es_US/Payroll.OffCyclePayPeriodDateForm.json.js.map +1 -0
  345. package/dist/i18n/es_US/Payroll.OffCycleReasonSelection.json.js +12 -0
  346. package/dist/i18n/es_US/Payroll.OffCycleReasonSelection.json.js.map +1 -0
  347. package/dist/i18n/es_US/Payroll.OffCycleTaxWithholding.json.js +16 -0
  348. package/dist/i18n/es_US/Payroll.OffCycleTaxWithholding.json.js.map +1 -0
  349. package/dist/i18n/es_US/Payroll.PayrollBlocker.json.js +34 -0
  350. package/dist/i18n/es_US/Payroll.PayrollBlocker.json.js.map +1 -0
  351. package/dist/i18n/es_US/Payroll.PayrollConfiguration.json.js +44 -0
  352. package/dist/i18n/es_US/Payroll.PayrollConfiguration.json.js.map +1 -0
  353. package/dist/i18n/es_US/Payroll.PayrollEditEmployee.json.js +66 -0
  354. package/dist/i18n/es_US/Payroll.PayrollEditEmployee.json.js.map +1 -0
  355. package/dist/i18n/es_US/Payroll.PayrollHistory.json.js +22 -0
  356. package/dist/i18n/es_US/Payroll.PayrollHistory.json.js.map +1 -0
  357. package/dist/i18n/es_US/Payroll.PayrollLanding.json.js +16 -0
  358. package/dist/i18n/es_US/Payroll.PayrollLanding.json.js.map +1 -0
  359. package/dist/i18n/es_US/Payroll.PayrollList.json.js +38 -0
  360. package/dist/i18n/es_US/Payroll.PayrollList.json.js.map +1 -0
  361. package/dist/i18n/es_US/Payroll.PayrollOverview.json.js +70 -0
  362. package/dist/i18n/es_US/Payroll.PayrollOverview.json.js.map +1 -0
  363. package/dist/i18n/es_US/Payroll.PayrollReceipts.json.js +20 -0
  364. package/dist/i18n/es_US/Payroll.PayrollReceipts.json.js.map +1 -0
  365. package/dist/i18n/es_US/Payroll.RecoveryCasesList.json.js +20 -0
  366. package/dist/i18n/es_US/Payroll.RecoveryCasesList.json.js.map +1 -0
  367. package/dist/i18n/es_US/Payroll.RecoveryCasesResubmit.json.js +8 -0
  368. package/dist/i18n/es_US/Payroll.RecoveryCasesResubmit.json.js.map +1 -0
  369. package/dist/i18n/es_US/Payroll.Transition.json.js +8 -0
  370. package/dist/i18n/es_US/Payroll.Transition.json.js.map +1 -0
  371. package/dist/i18n/es_US/Payroll.TransitionCreation.json.js +20 -0
  372. package/dist/i18n/es_US/Payroll.TransitionCreation.json.js.map +1 -0
  373. package/dist/i18n/es_US/Payroll.TransitionPayrollAlert.json.js +18 -0
  374. package/dist/i18n/es_US/Payroll.TransitionPayrollAlert.json.js.map +1 -0
  375. package/dist/i18n/es_US/Payroll.WireInstructions.json.js +30 -0
  376. package/dist/i18n/es_US/Payroll.WireInstructions.json.js.map +1 -0
  377. package/dist/i18n/es_US/common.json.js +44 -0
  378. package/dist/i18n/es_US/common.json.js.map +1 -0
  379. package/dist/i18n/types.d.ts +262 -6
  380. package/dist/index.d.ts +2 -2
  381. package/dist/models/external.d.ts +23 -0
  382. package/dist/style.css +1 -1
  383. package/docs/guides/endpoint-inventory.json +5 -0
  384. package/package.json +10 -10
@@ -0,0 +1,58 @@
1
+ import { jsx as e, jsxs as n } from "react/jsx-runtime";
2
+ import { useEmployeesGetSuspense as _ } from "@gusto/embedded-api/react-query/employeesGet";
3
+ import { useMemo as A } from "react";
4
+ import { useTranslation as g } from "react-i18next";
5
+ import { usePreparedPayrollData as x } from "../usePreparedPayrollData.js";
6
+ import T from "./UNSTABLE_PayrollEditEmployee.module.scss.js";
7
+ import { componentEvents as m } from "../../../shared/constants.js";
8
+ import { BaseComponent as B } from "../../Base/Base.js";
9
+ import { useBase as D } from "../../Base/useBase.js";
10
+ import { useComponentDictionary as S, useI18n as U } from "../../../i18n/I18n.js";
11
+ import { useComponentContext as O } from "../../../contexts/ComponentAdapter/useComponentContext.js";
12
+ import { Flex as a } from "../../Common/Flex/Flex.js";
13
+ import { firstLastName as v } from "../../../helpers/formattedStrings.js";
14
+ function J(o) {
15
+ return /* @__PURE__ */ e(B, { ...o, children: /* @__PURE__ */ e(R, { ...o, children: o.children }) });
16
+ }
17
+ const R = ({
18
+ employeeId: o,
19
+ companyId: c,
20
+ payrollId: p,
21
+ onEvent: l,
22
+ dictionary: d
23
+ }) => {
24
+ S("Payroll.UNSTABLE_PayrollEditEmployee", d), U("Payroll.UNSTABLE_PayrollEditEmployee");
25
+ const { t } = g("Payroll.UNSTABLE_PayrollEditEmployee"), { LoadingIndicator: y } = D(), { Button: i, Heading: s, Text: f } = O(), { data: E } = _({ employeeId: o }), u = A(() => [o], [o]), { preparedPayroll: h, isLoading: L } = x({
26
+ companyId: c,
27
+ payrollId: p,
28
+ employeeUuids: u
29
+ }), r = E.employee, P = () => {
30
+ l(m.RUN_PAYROLL_EMPLOYEE_SAVED, {
31
+ payrollPrepared: h,
32
+ employee: r
33
+ });
34
+ }, C = () => {
35
+ l(m.RUN_PAYROLL_EMPLOYEE_CANCELLED);
36
+ };
37
+ if (L || !r)
38
+ return /* @__PURE__ */ e(y, {});
39
+ const N = v({
40
+ first_name: r.firstName,
41
+ last_name: r.lastName
42
+ });
43
+ return /* @__PURE__ */ e("div", { className: T.container, children: /* @__PURE__ */ n(a, { justifyContent: "space-between", alignItems: "flex-start", gap: 12, children: [
44
+ /* @__PURE__ */ n(a, { flexDirection: "column", gap: 8, children: [
45
+ /* @__PURE__ */ e(s, { as: "h1", styledAs: "h2", children: t("pageTitle", { employeeName: N }) }),
46
+ /* @__PURE__ */ e(s, { as: "h2", styledAs: "h3", children: "TODO: Gross pay calculation" }),
47
+ /* @__PURE__ */ e(f, { children: t("grossPayLabel") })
48
+ ] }),
49
+ /* @__PURE__ */ n(a, { justifyContent: "flex-end", gap: 12, children: [
50
+ /* @__PURE__ */ e(i, { variant: "secondary", onClick: C, title: t("cancelCta"), children: t("cancelCta") }),
51
+ /* @__PURE__ */ e(i, { onClick: P, title: t("saveCta"), children: t("saveCta") })
52
+ ] })
53
+ ] }) });
54
+ };
55
+ export {
56
+ J as UNSTABLE_PayrollEditEmployee
57
+ };
58
+ //# sourceMappingURL=UNSTABLE_PayrollEditEmployee.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UNSTABLE_PayrollEditEmployee.js","sources":["../../../../src/components/Payroll/UNSTABLE_PayrollEditEmployee/UNSTABLE_PayrollEditEmployee.tsx"],"sourcesContent":["import { useEmployeesGetSuspense } from '@gusto/embedded-api/react-query/employeesGet'\nimport { useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport type { PayrollEditEmployeeProps } from '../PayrollEditEmployee/PayrollEditEmployee'\nimport { usePreparedPayrollData } from '../usePreparedPayrollData'\nimport styles from './UNSTABLE_PayrollEditEmployee.module.scss'\nimport { componentEvents } from '@/shared/constants'\nimport { BaseComponent } from '@/components/Base/Base'\nimport { useBase } from '@/components/Base/useBase'\nimport { useComponentDictionary, useI18n } from '@/i18n'\nimport { useComponentContext } from '@/contexts/ComponentAdapter/useComponentContext'\nimport { Flex } from '@/components/Common'\nimport { firstLastName } from '@/helpers/formattedStrings'\n\n/**\n * In-development regular-rate-of-pay rebuild of {@link PayrollEditEmployee}.\n *\n * @remarks\n * Gated behind the `payrollRegularRateOfPay` unstable feature flag and not part of the public\n * SDK surface. `PayrollEditEmployee` renders this in place of the stable editor when the flag is\n * enabled. Currently a scaffold: the header, `Cancel`, and `Save` controls only. `Cancel` and\n * `Save` emit the same events as the stable component so the surrounding flow behaves identically.\n *\n * @internal\n */\nexport function UNSTABLE_PayrollEditEmployee(props: PayrollEditEmployeeProps) {\n return (\n <BaseComponent {...props}>\n <Root {...props}>{props.children}</Root>\n </BaseComponent>\n )\n}\n\nconst Root = ({\n employeeId,\n companyId,\n payrollId,\n onEvent,\n dictionary,\n}: PayrollEditEmployeeProps) => {\n useComponentDictionary('Payroll.UNSTABLE_PayrollEditEmployee', dictionary)\n useI18n('Payroll.UNSTABLE_PayrollEditEmployee')\n const { t } = useTranslation('Payroll.UNSTABLE_PayrollEditEmployee')\n\n const { LoadingIndicator } = useBase()\n const { Button, Heading, Text } = useComponentContext()\n\n const { data: employeeData } = useEmployeesGetSuspense({ employeeId })\n const memoizedEmployeeId = useMemo(() => [employeeId], [employeeId])\n const { preparedPayroll, isLoading } = usePreparedPayrollData({\n companyId,\n payrollId,\n employeeUuids: memoizedEmployeeId,\n })\n\n const employee = employeeData.employee\n\n const onSave = () => {\n // TODO: Once the save mutation is wired up, emit the updated payroll returned by the update\n // response here instead of the current prepared payroll from the query.\n onEvent(componentEvents.RUN_PAYROLL_EMPLOYEE_SAVED, {\n payrollPrepared: preparedPayroll,\n employee,\n })\n }\n\n const onCancel = () => {\n onEvent(componentEvents.RUN_PAYROLL_EMPLOYEE_CANCELLED)\n }\n\n if (isLoading || !employee) {\n return <LoadingIndicator />\n }\n\n const employeeName = firstLastName({\n first_name: employee.firstName,\n last_name: employee.lastName,\n })\n\n return (\n <div className={styles.container}>\n <Flex justifyContent=\"space-between\" alignItems=\"flex-start\" gap={12}>\n <Flex flexDirection=\"column\" gap={8}>\n <Heading as=\"h1\" styledAs=\"h2\">\n {t('pageTitle', { employeeName })}\n </Heading>\n <Heading as=\"h2\" styledAs=\"h3\">\n {/* TODO: Gross pay calculation pending decision on client-side RRoP calculation. */}\n TODO: Gross pay calculation\n </Heading>\n <Text>{t('grossPayLabel')}</Text>\n </Flex>\n <Flex justifyContent=\"flex-end\" gap={12}>\n <Button variant=\"secondary\" onClick={onCancel} title={t('cancelCta')}>\n {t('cancelCta')}\n </Button>\n <Button onClick={onSave} title={t('saveCta')}>\n {t('saveCta')}\n </Button>\n </Flex>\n </Flex>\n </div>\n )\n}\n"],"names":["UNSTABLE_PayrollEditEmployee","props","jsx","BaseComponent","Root","employeeId","companyId","payrollId","onEvent","dictionary","useComponentDictionary","useI18n","useTranslation","LoadingIndicator","useBase","Button","Heading","Text","useComponentContext","employeeData","useEmployeesGetSuspense","memoizedEmployeeId","useMemo","preparedPayroll","isLoading","usePreparedPayrollData","employee","onSave","componentEvents","onCancel","employeeName","firstLastName","styles","jsxs","Flex"],"mappings":";;;;;;;;;;;;;AAyBO,SAASA,EAA6BC,GAAiC;AAC5E,SACE,gBAAAC,EAACC,GAAA,EAAe,GAAGF,GACjB,UAAA,gBAAAC,EAACE,KAAM,GAAGH,GAAQ,UAAAA,EAAM,SAAA,CAAS,EAAA,CACnC;AAEJ;AAEA,MAAMG,IAAO,CAAC;AAAA,EACZ,YAAAC;AAAA,EACA,WAAAC;AAAA,EACA,WAAAC;AAAA,EACA,SAAAC;AAAA,EACA,YAAAC;AACF,MAAgC;AAC9B,EAAAC,EAAuB,wCAAwCD,CAAU,GACzEE,EAAQ,sCAAsC;AAC9C,QAAM,EAAE,EAAA,IAAMC,EAAe,sCAAsC,GAE7D,EAAE,kBAAAC,EAAA,IAAqBC,EAAA,GACvB,EAAE,QAAAC,GAAQ,SAAAC,GAAS,MAAAC,EAAA,IAASC,EAAA,GAE5B,EAAE,MAAMC,EAAA,IAAiBC,EAAwB,EAAE,YAAAf,GAAY,GAC/DgB,IAAqBC,EAAQ,MAAM,CAACjB,CAAU,GAAG,CAACA,CAAU,CAAC,GAC7D,EAAE,iBAAAkB,GAAiB,WAAAC,EAAA,IAAcC,EAAuB;AAAA,IAC5D,WAAAnB;AAAA,IACA,WAAAC;AAAA,IACA,eAAec;AAAA,EAAA,CAChB,GAEKK,IAAWP,EAAa,UAExBQ,IAAS,MAAM;AAGnB,IAAAnB,EAAQoB,EAAgB,4BAA4B;AAAA,MAClD,iBAAiBL;AAAA,MACjB,UAAAG;AAAA,IAAA,CACD;AAAA,EACH,GAEMG,IAAW,MAAM;AACrB,IAAArB,EAAQoB,EAAgB,8BAA8B;AAAA,EACxD;AAEA,MAAIJ,KAAa,CAACE;AAChB,6BAAQb,GAAA,EAAiB;AAG3B,QAAMiB,IAAeC,EAAc;AAAA,IACjC,YAAYL,EAAS;AAAA,IACrB,WAAWA,EAAS;AAAA,EAAA,CACrB;AAED,SACE,gBAAAxB,EAAC,OAAA,EAAI,WAAW8B,EAAO,WACrB,UAAA,gBAAAC,EAACC,GAAA,EAAK,gBAAe,iBAAgB,YAAW,cAAa,KAAK,IAChE,UAAA;AAAA,IAAA,gBAAAD,EAACC,GAAA,EAAK,eAAc,UAAS,KAAK,GAChC,UAAA;AAAA,MAAA,gBAAAhC,EAACc,GAAA,EAAQ,IAAG,MAAK,UAAS,MACvB,YAAE,aAAa,EAAE,cAAAc,EAAA,CAAc,EAAA,CAClC;AAAA,wBACCd,GAAA,EAAQ,IAAG,MAAK,UAAS,MAC6D,UAAA,+BAEvF;AAAA,MACA,gBAAAd,EAACe,GAAA,EAAM,UAAA,EAAE,eAAe,EAAA,CAAE;AAAA,IAAA,GAC5B;AAAA,IACA,gBAAAgB,EAACC,GAAA,EAAK,gBAAe,YAAW,KAAK,IACnC,UAAA;AAAA,MAAA,gBAAAhC,EAACa,GAAA,EAAO,SAAQ,aAAY,SAASc,GAAU,OAAO,EAAE,WAAW,GAChE,UAAA,EAAE,WAAW,EAAA,CAChB;AAAA,MACA,gBAAA3B,EAACa,GAAA,EAAO,SAASY,GAAQ,OAAO,EAAE,SAAS,GACxC,UAAA,EAAE,SAAS,EAAA,CACd;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;"}
@@ -0,0 +1,8 @@
1
+ const n = "_container_15e3y_1", t = {
2
+ container: n
3
+ };
4
+ export {
5
+ n as container,
6
+ t as default
7
+ };
8
+ //# sourceMappingURL=UNSTABLE_PayrollEditEmployee.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UNSTABLE_PayrollEditEmployee.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -117,6 +117,21 @@ export declare const cleanupReimbursements: (reimbursements: Reimbursement[]) =>
117
117
  * @internal
118
118
  */
119
119
  export declare const formatHoursDisplay: (hours: number) => string;
120
+ /**
121
+ * Whether an FLSA status is eligible for regular-rate-of-pay overtime.
122
+ *
123
+ * @remarks
124
+ * Only the nonexempt family (`Nonexempt`, `Salaried Nonexempt`,
125
+ * `Commission Only Nonexempt`) earns overtime premiums, so only those statuses
126
+ * warrant per-workweek breakdowns. `Exempt`, `Owner`, and
127
+ * `Commission Only Exempt` are never overtime-eligible. An unknown status
128
+ * returns `false` (treat as flat, never show meaningless workweek columns).
129
+ *
130
+ * @param flsaStatus - The employee's FLSA status, e.g. from `hourlyCompensations[].flsaStatus`.
131
+ * @returns `true` only for the three nonexempt statuses.
132
+ * @internal
133
+ */
134
+ export declare const isOvertimeEligibleFlsaStatus: (flsaStatus: string | undefined) => boolean;
120
135
  /**
121
136
  * Calculates an employee's gross pay for a payroll, combining regular and overtime pay,
122
137
  * additional earnings, PTO pay, and any minimum-wage adjustment.
@@ -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 {\n type PayrollShowFixedCompensations,\n OffCycleReasonType,\n} from '@gusto/embedded-api/models/components/payrollshow'\nimport type {\n FixedCompensations,\n Reimbursements as Reimbursement,\n} from '@gusto/embedded-api/models/components/payrollemployeecompensationstype'\nimport type { PayrollUpdateReimbursements } from '@gusto/embedded-api/models/components/payrollupdate'\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 { PayScheduleShow as PayScheduleObject } from '@gusto/embedded-api/models/components/payscheduleshow'\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/payrollshow'\nimport type { PayrollType } from './PayrollList/types'\nimport { PayrollCategory, isOffCyclePayroll } from './payrollTypes'\nimport { formatPayRate } from '@/helpers/formattedStrings'\nimport { useLocale } from '@/contexts/LocaleProvider/useLocale'\nimport { FlsaStatus } from '@/shared/constants'\nimport { MS_PER_HOUR } from '@/helpers/dateFormatting'\nconst REGULAR_HOURS_NAME = 'regular hours'\n\n/**\n * The compensation fields the payroll math helpers operate on.\n *\n * @remarks\n * These helpers run over both compensation representations the API returns: the\n * prepared (base) shape used when editing a payroll and the calculated (show)\n * shape rendered after calculation. The two are interchangeable for every field\n * read here and differ only on `deductions`, which no helper touches. Omitting\n * `deductions` lets a single input type accept either shape without a cast.\n *\n * @internal\n */\ntype EmployeeCompensationInput = Omit<PayrollEmployeeCompensationsType, 'deductions'>\n\n// Utility to get the primary job from an employee\nconst 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\n/**\n * Formats an employee's primary-job pay rate into a localized display string.\n *\n * @remarks\n * Returns `null` when the employee has no jobs, the primary job has no compensations, or the rate is missing\n * or zero.\n *\n * @param args - The employee, translation function, and locale to format against.\n * @returns The formatted pay-rate string, or `null` when no usable rate is available.\n * @internal\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\n/**\n * Returns a memoized formatter that produces a localized pay-rate string from an employee's primary job.\n *\n * @returns A callback that takes an `Employee` and returns the formatted pay-rate string, or `null` when the\n * employee has no usable primary-job compensation.\n * @internal\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\n/**\n * Sums hourly-compensation rows named `'regular hours'`.\n *\n * @param compensation - The employee compensation entry.\n * @returns The total regular hours worked, or `0` when none are recorded.\n * @internal\n */\nexport const getRegularHours = (compensation: EmployeeCompensationInput) => {\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\n/**\n * Sums the overtime hours (multiplier greater than `1`) from an employee compensation.\n *\n * @param compensation - The employee compensation entry.\n * @returns The total overtime hours, or `0` when the compensation is excluded or has none.\n * @internal\n */\nexport function getOvertimeHours(compensation: EmployeeCompensationInput) {\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\n/**\n * Sums the paid-time-off hours from an employee compensation.\n *\n * @param compensation - The employee compensation entry.\n * @returns The total PTO hours, or `0` when none are recorded.\n * @internal\n */\nexport const getTotalPtoHours = (compensation: EmployeeCompensationInput) => {\n if (!compensation.paidTimeOff) {\n return 0\n }\n return compensation.paidTimeOff.reduce((sum, pto) => sum + parseFloat(pto.hours || '0'), 0)\n}\n\n/**\n * Sums fixed-compensation amounts excluding reimbursements and minimum-wage adjustments.\n *\n * @param compensation - The employee compensation entry.\n * @returns The total additional earnings amount, or `0` when none qualify.\n * @internal\n */\nexport const getAdditionalEarnings = (compensation: EmployeeCompensationInput) => {\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\n/**\n * Returns the total reimbursement amount for an employee compensation.\n *\n * @remarks\n * Prefers the explicit `reimbursements` array when present; falls back to a fixed-compensation row named\n * `'Reimbursement'` for older payroll shapes.\n *\n * @param compensation - The employee compensation entry.\n * @returns The summed reimbursement amount, or `0` when none.\n * @internal\n */\nexport const getReimbursements = (compensation: EmployeeCompensationInput) => {\n if (compensation.reimbursements && compensation.reimbursements.length > 0) {\n return compensation.reimbursements.reduce(\n (sum, reimbursement) => sum + parseFloat(reimbursement.amount || '0'),\n 0,\n )\n }\n\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\n/**\n * Normalizes a reimbursement list for submission to the v2025-11-15 API.\n *\n * @remarks\n * - Drops named rows that would be no-ops on the server (zero amount with no existing uuid).\n * - Drops named rows with an existing uuid and zero amount — these are removals, and the backend's\n * `replace_itemized_reimbursements` deletes any persisted reimbursement whose uuid is omitted from the\n * incoming list.\n * - Consolidates multiple unnamed (description-less) rows into a single unnamed entry, since the API rejects\n * more than one unnamed reimbursement per employee.\n * - When the consolidated unnamed total is zero, sends no unnamed entry at all. The backend's full-replace\n * semantics then delete any persisted unnamed entry (unnamed entries never have uuids, so this is the only\n * way to remove them).\n * - Maps the read shape (`description: string | null`) to the write shape (`description?: string`), omitting\n * the field when there is no description.\n *\n * @param reimbursements - The reimbursements pulled from the prepared payroll.\n * @returns The normalized reimbursements ready to send on a payroll update.\n * @internal\n */\nexport const cleanupReimbursements = (\n reimbursements: Reimbursement[],\n): PayrollUpdateReimbursements[] => {\n const consolidated: PayrollUpdateReimbursements[] = []\n let unnamedTotal = 0\n\n reimbursements.forEach(reimbursement => {\n const amount = reimbursement.amount\n const numericAmount = parseFloat(amount || '0')\n const description = reimbursement.description?.trim() || ''\n const uuid = reimbursement.uuid ?? undefined\n\n if (description === '') {\n unnamedTotal += numericAmount\n return\n }\n\n if (numericAmount === 0 && !uuid) {\n return\n }\n\n consolidated.push({\n amount,\n description,\n ...(uuid ? { uuid } : {}),\n })\n })\n\n if (unnamedTotal > 0) {\n consolidated.push({\n amount: unnamedTotal.toFixed(2),\n })\n }\n\n return consolidated\n}\n\n/**\n * Formats an hours value for display, rounding to two decimals and ensuring whole numbers render with `.0`.\n *\n * @param hours - The hours value to format.\n * @returns A string like `'40.0'` or `'37.25'`.\n * @internal\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: EmployeeCompensationInput): 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: EmployeeCompensationInput,\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: EmployeeCompensationInput,\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: EmployeeCompensationInput,\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: EmployeeCompensationInput,\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: EmployeeCompensationInput,\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\n/**\n * Calculates an employee's gross pay for a payroll, combining regular and overtime pay,\n * additional earnings, PTO pay, and any minimum-wage adjustment.\n *\n * @remarks\n * Returns `0` when the compensation is excluded or the employee has no primary job compensation effective\n * on the given date. The result is rounded to two decimal places.\n *\n * @param compensation - The employee compensation entry from the payroll.\n * @param employee - The employee record (used to look up jobs and effective compensations).\n * @param compensationEffectiveDateString - ISO date used to resolve the effective compensation; defaults to now.\n * @param paySchedule - The pay schedule, used to derive expected hours per pay period.\n * @param payrollCategory - The payroll category; off-cycle categories change how PTO hours are summed.\n * @returns The gross pay amount.\n * @internal\n */\nexport const calculateGrossPay = (\n compensation: EmployeeCompensationInput,\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/**\n * Returns the high-level payroll type — `'External'`, `'Off-Cycle'`, or `'Regular'`.\n *\n * @param payroll - The payroll whose type to classify.\n * @returns The payroll type string.\n * @internal\n */\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\n/**\n * Returns whether an off-cycle reason indicates a dismissal payroll.\n *\n * @param offCycleReason - The payroll's off-cycle reason string.\n * @returns `true` when the reason matches the dismissed-employee reason.\n * @internal\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\n/**\n * Returns a human-readable label describing the payroll type, mapping off-cycle reasons to display strings.\n *\n * @param payroll - The payroll whose type to describe.\n * @returns `'External'`, `'Regular'`, `'Off-Cycle'`, or a label derived from the off-cycle reason\n * (e.g. `'Bonus'`, `'Dismissal'`).\n * @internal\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\n/**\n * Merges existing fixed compensations with placeholder entries for any compensation types the employee\n * doesn't yet have, then filters out excluded types and sorts the result alphabetically.\n *\n * @remarks\n * Owners (FLSA status `Owner`) never receive placeholder entries. Placeholders are added with `amount: '0.00'`\n * and the supplied `primaryJobUuid`.\n *\n * @param options - Inputs controlling which placeholder entries to add and which types to exclude.\n * @returns The merged, filtered, and sorted list of fixed compensations.\n * @internal\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\n/**\n * Sums gross pay, employer taxes, reimbursements, and benefits from a payroll's totals.\n *\n * @param payrollData - The payroll whose totals to sum.\n * @returns The total payroll cost, or `0` when `payrollData.totals` is missing.\n * @internal\n */\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 whether a payroll can be cancelled based on its status, deadline, and the 4:00 PM PT cutoff.\n *\n * @remarks\n * Returns `true` only when the payroll has been processed, `payrollStatusMeta.cancellable` is not explicitly `false`,\n * the payroll has a `payrollDeadline`, and the current time is before 4:00 PM Pacific Time on that deadline date.\n *\n * @param payroll - The payroll to evaluate.\n * @returns `true` if the payroll is still cancellable, `false` otherwise.\n * @internal\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","reimbursement","reimbursementComp","cleanupReimbursements","reimbursements","consolidated","unnamedTotal","numericAmount","description","uuid","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","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/payrollshow'\nimport type {\n FixedCompensations,\n Reimbursements as Reimbursement,\n} from '@gusto/embedded-api/models/components/payrollemployeecompensationstype'\nimport type { PayrollUpdateReimbursements } from '@gusto/embedded-api/models/components/payrollupdate'\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 { PayScheduleShow as PayScheduleObject } from '@gusto/embedded-api/models/components/payscheduleshow'\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/payrollshow'\nimport type { PayrollType } from './PayrollList/types'\nimport { PayrollCategory, isOffCyclePayroll } from './payrollTypes'\nimport { formatPayRate } from '@/helpers/formattedStrings'\nimport { useLocale } from '@/contexts/LocaleProvider/useLocale'\nimport { FlsaStatus } from '@/shared/constants'\nimport { MS_PER_HOUR } from '@/helpers/dateFormatting'\nconst REGULAR_HOURS_NAME = 'regular hours'\n\n/**\n * The compensation fields the payroll math helpers operate on.\n *\n * @remarks\n * These helpers run over both compensation representations the API returns: the\n * prepared (base) shape used when editing a payroll and the calculated (show)\n * shape rendered after calculation. The two are interchangeable for every field\n * read here and differ only on `deductions`, which no helper touches. Omitting\n * `deductions` lets a single input type accept either shape without a cast.\n *\n * @internal\n */\ntype EmployeeCompensationInput = Omit<PayrollEmployeeCompensationsType, 'deductions'>\n\n// Utility to get the primary job from an employee\nconst 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\n/**\n * Formats an employee's primary-job pay rate into a localized display string.\n *\n * @remarks\n * Returns `null` when the employee has no jobs, the primary job has no compensations, or the rate is missing\n * or zero.\n *\n * @param args - The employee, translation function, and locale to format against.\n * @returns The formatted pay-rate string, or `null` when no usable rate is available.\n * @internal\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\n/**\n * Returns a memoized formatter that produces a localized pay-rate string from an employee's primary job.\n *\n * @returns A callback that takes an `Employee` and returns the formatted pay-rate string, or `null` when the\n * employee has no usable primary-job compensation.\n * @internal\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\n/**\n * Sums hourly-compensation rows named `'regular hours'`.\n *\n * @param compensation - The employee compensation entry.\n * @returns The total regular hours worked, or `0` when none are recorded.\n * @internal\n */\nexport const getRegularHours = (compensation: EmployeeCompensationInput) => {\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\n/**\n * Sums the overtime hours (multiplier greater than `1`) from an employee compensation.\n *\n * @param compensation - The employee compensation entry.\n * @returns The total overtime hours, or `0` when the compensation is excluded or has none.\n * @internal\n */\nexport function getOvertimeHours(compensation: EmployeeCompensationInput) {\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\n/**\n * Sums the paid-time-off hours from an employee compensation.\n *\n * @param compensation - The employee compensation entry.\n * @returns The total PTO hours, or `0` when none are recorded.\n * @internal\n */\nexport const getTotalPtoHours = (compensation: EmployeeCompensationInput) => {\n if (!compensation.paidTimeOff) {\n return 0\n }\n return compensation.paidTimeOff.reduce((sum, pto) => sum + parseFloat(pto.hours || '0'), 0)\n}\n\n/**\n * Sums fixed-compensation amounts excluding reimbursements and minimum-wage adjustments.\n *\n * @param compensation - The employee compensation entry.\n * @returns The total additional earnings amount, or `0` when none qualify.\n * @internal\n */\nexport const getAdditionalEarnings = (compensation: EmployeeCompensationInput) => {\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\n/**\n * Returns the total reimbursement amount for an employee compensation.\n *\n * @remarks\n * Prefers the explicit `reimbursements` array when present; falls back to a fixed-compensation row named\n * `'Reimbursement'` for older payroll shapes.\n *\n * @param compensation - The employee compensation entry.\n * @returns The summed reimbursement amount, or `0` when none.\n * @internal\n */\nexport const getReimbursements = (compensation: EmployeeCompensationInput) => {\n if (compensation.reimbursements && compensation.reimbursements.length > 0) {\n return compensation.reimbursements.reduce(\n (sum, reimbursement) => sum + parseFloat(reimbursement.amount || '0'),\n 0,\n )\n }\n\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\n/**\n * Normalizes a reimbursement list for submission to the v2025-11-15 API.\n *\n * @remarks\n * - Drops named rows that would be no-ops on the server (zero amount with no existing uuid).\n * - Drops named rows with an existing uuid and zero amount — these are removals, and the backend's\n * `replace_itemized_reimbursements` deletes any persisted reimbursement whose uuid is omitted from the\n * incoming list.\n * - Consolidates multiple unnamed (description-less) rows into a single unnamed entry, since the API rejects\n * more than one unnamed reimbursement per employee.\n * - When the consolidated unnamed total is zero, sends no unnamed entry at all. The backend's full-replace\n * semantics then delete any persisted unnamed entry (unnamed entries never have uuids, so this is the only\n * way to remove them).\n * - Maps the read shape (`description: string | null`) to the write shape (`description?: string`), omitting\n * the field when there is no description.\n *\n * @param reimbursements - The reimbursements pulled from the prepared payroll.\n * @returns The normalized reimbursements ready to send on a payroll update.\n * @internal\n */\nexport const cleanupReimbursements = (\n reimbursements: Reimbursement[],\n): PayrollUpdateReimbursements[] => {\n const consolidated: PayrollUpdateReimbursements[] = []\n let unnamedTotal = 0\n\n reimbursements.forEach(reimbursement => {\n const amount = reimbursement.amount\n const numericAmount = parseFloat(amount || '0')\n const description = reimbursement.description?.trim() || ''\n const uuid = reimbursement.uuid ?? undefined\n\n if (description === '') {\n unnamedTotal += numericAmount\n return\n }\n\n if (numericAmount === 0 && !uuid) {\n return\n }\n\n consolidated.push({\n amount,\n description,\n ...(uuid ? { uuid } : {}),\n })\n })\n\n if (unnamedTotal > 0) {\n consolidated.push({\n amount: unnamedTotal.toFixed(2),\n })\n }\n\n return consolidated\n}\n\n/**\n * Formats an hours value for display, rounding to two decimals and ensuring whole numbers render with `.0`.\n *\n * @param hours - The hours value to format.\n * @returns A string like `'40.0'` or `'37.25'`.\n * @internal\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\n/**\n * Whether an FLSA status is eligible for regular-rate-of-pay overtime.\n *\n * @remarks\n * Only the nonexempt family (`Nonexempt`, `Salaried Nonexempt`,\n * `Commission Only Nonexempt`) earns overtime premiums, so only those statuses\n * warrant per-workweek breakdowns. `Exempt`, `Owner`, and\n * `Commission Only Exempt` are never overtime-eligible. An unknown status\n * returns `false` (treat as flat, never show meaningless workweek columns).\n *\n * @param flsaStatus - The employee's FLSA status, e.g. from `hourlyCompensations[].flsaStatus`.\n * @returns `true` only for the three nonexempt statuses.\n * @internal\n */\nexport const isOvertimeEligibleFlsaStatus = (flsaStatus: string | undefined): boolean =>\n flsaStatus === FlsaStatus.NONEXEMPT ||\n flsaStatus === FlsaStatus.SALARIED_NONEXEMPT ||\n flsaStatus === FlsaStatus.COMMISSION_ONLY_NONEXEMPT\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: EmployeeCompensationInput): 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: EmployeeCompensationInput,\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: EmployeeCompensationInput,\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: EmployeeCompensationInput,\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: EmployeeCompensationInput,\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: EmployeeCompensationInput,\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\n/**\n * Calculates an employee's gross pay for a payroll, combining regular and overtime pay,\n * additional earnings, PTO pay, and any minimum-wage adjustment.\n *\n * @remarks\n * Returns `0` when the compensation is excluded or the employee has no primary job compensation effective\n * on the given date. The result is rounded to two decimal places.\n *\n * @param compensation - The employee compensation entry from the payroll.\n * @param employee - The employee record (used to look up jobs and effective compensations).\n * @param compensationEffectiveDateString - ISO date used to resolve the effective compensation; defaults to now.\n * @param paySchedule - The pay schedule, used to derive expected hours per pay period.\n * @param payrollCategory - The payroll category; off-cycle categories change how PTO hours are summed.\n * @returns The gross pay amount.\n * @internal\n */\nexport const calculateGrossPay = (\n compensation: EmployeeCompensationInput,\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/**\n * Returns the high-level payroll type — `'External'`, `'Off-Cycle'`, or `'Regular'`.\n *\n * @param payroll - The payroll whose type to classify.\n * @returns The payroll type string.\n * @internal\n */\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\n/**\n * Returns whether an off-cycle reason indicates a dismissal payroll.\n *\n * @param offCycleReason - The payroll's off-cycle reason string.\n * @returns `true` when the reason matches the dismissed-employee reason.\n * @internal\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\n/**\n * Returns a human-readable label describing the payroll type, mapping off-cycle reasons to display strings.\n *\n * @param payroll - The payroll whose type to describe.\n * @returns `'External'`, `'Regular'`, `'Off-Cycle'`, or a label derived from the off-cycle reason\n * (e.g. `'Bonus'`, `'Dismissal'`).\n * @internal\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\n/**\n * Merges existing fixed compensations with placeholder entries for any compensation types the employee\n * doesn't yet have, then filters out excluded types and sorts the result alphabetically.\n *\n * @remarks\n * Owners (FLSA status `Owner`) never receive placeholder entries. Placeholders are added with `amount: '0.00'`\n * and the supplied `primaryJobUuid`.\n *\n * @param options - Inputs controlling which placeholder entries to add and which types to exclude.\n * @returns The merged, filtered, and sorted list of fixed compensations.\n * @internal\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\n/**\n * Sums gross pay, employer taxes, reimbursements, and benefits from a payroll's totals.\n *\n * @param payrollData - The payroll whose totals to sum.\n * @returns The total payroll cost, or `0` when `payrollData.totals` is missing.\n * @internal\n */\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 whether a payroll can be cancelled based on its status, deadline, and the 4:00 PM PT cutoff.\n *\n * @remarks\n * Returns `true` only when the payroll has been processed, `payrollStatusMeta.cancellable` is not explicitly `false`,\n * the payroll has a `payrollDeadline`, and the current time is before 4:00 PM Pacific Time on that deadline date.\n *\n * @param payroll - The payroll to evaluate.\n * @returns `true` if the payroll is still cancellable, `false` otherwise.\n * @internal\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","reimbursement","reimbursementComp","cleanupReimbursements","reimbursements","consolidated","unnamedTotal","numericAmount","description","uuid","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","calculateTotalPayroll","payrollData","getPacificTimeOffset","date","year","secondSundayMarch","firstSundayNovember","canCancelPayroll","now","deadline","nowInPT","MS_PER_HOUR","deadlineInPT","cutoffTime"],"mappings":";;;;;;;;AAwBA,MAAMA,IAAqB,iBAiBrBC,IAAgB,CAACC,MACdA,EAAS,MAAM,KAAK,CAAAC,MAAOA,EAAI,OAAO,KAAKD,EAAS,OAAO,CAAC,KAAK,MAGpEE,IAAqB,CAACC,MACnB,KAAK,MAAMA,IAAQ,GAAS,IAAI,KAGnCC,IAAqB,CAACD,MACnB,KAAK,MAAMA,IAAQ,GAAG,IAAI,KAG7BE,IAAiB,CAACC,MACfA,EAAiB,kBAAkBR,GAGtCS,IAAoD;AAAA,EACxD,OAAO;AAAA,EACP,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,cAAc;AAAA,EACd,UAAU;AACZ,GAaaC,IAAwB,CAAC;AAAA,EACpC,UAAAR;AAAA,EACA;AAAA,EACA,QAAAS,IAAS;AACX,MAIM;AACJ,MAAI,CAACT,GAAU;AACb,WAAO;AAGT,QAAMU,IAAaX,EAAcC,CAAQ;AACzC,MAAI,CAACU,GAAY;AACf,WAAO;AAGT,QAAMC,IAAkBD,EAAW,cAAc,CAAC;AAIlD,MAHI,CAACC,KAGD,CAACA,EAAgB,QAAQ,WAAWA,EAAgB,IAAI,MAAM;AAChE,WAAO;AAGT,QAAMC,IAAO,WAAWD,EAAgB,IAAI,GACtCE,IAAcF,EAAgB,eAAe;AAEnD,SAAOG,EAAc,EAAE,MAAAF,GAAM,aAAAC,GAAa,GAAG,QAAAJ,GAAQ;AACvD,GASaM,KAA2B,MAAM;AAC5C,QAAM,EAAE,GAAAC,EAAA,IAAMC,EAAe,QAAQ,GAC/B,EAAE,QAAAR,EAAA,IAAWS,EAAA;AAEnB,SAAOC;AAAA,IACL,CAACnB,MACQQ,EAAsB,EAAE,UAAAR,GAAU,GAAAgB,GAAG,QAAAP,GAAQ;AAAA,IAEtD,CAACO,GAAGP,CAAM;AAAA,EAAA;AAEd,GASaW,KAAkB,CAACC,MACzBA,EAAa,sBAEXA,EAAa,oBACjB,OAAO,CAAAC,MAAsBA,EAAmB,MAAM,YAAA,MAAkB,eAAe,EACvF,OAAO,CAACC,GAAKD,MAAuBC,IAAM,WAAWD,EAAmB,SAAS,GAAG,GAAG,CAAC,IAJ7C;AAczC,SAASE,GAAiBH,GAAyC;AACxE,SAAI,CAACA,EAAa,uBAAuBA,EAAa,WAC7C,IAGFA,EAAa,oBACjB,OAAO,CAAAC,MAAsB,OAAOA,EAAmB,sBAAsB,IAAI,CAAC,EAClF,OAAO,CAACC,GAAKD,MAAuBC,IAAM,WAAWD,EAAmB,SAAS,GAAG,GAAG,CAAC;AAC7F;AASO,MAAMG,IAAmB,CAACJ,MAC1BA,EAAa,cAGXA,EAAa,YAAY,OAAO,CAACE,GAAKG,MAAQH,IAAM,WAAWG,EAAI,SAAS,GAAG,GAAG,CAAC,IAFjF,GAYEC,IAAwB,CAACN,MAC/BA,EAAa,qBAIXA,EAAa,mBACjB,OAAO,CAAAO,MAAqB;AAC3B,QAAMC,IAAOD,EAAkB,MAAM,YAAA,KAAiB,IAChDE,IAAS,WAAWF,EAAkB,UAAU,GAAG;AACzD,SAAOC,MAAS,mBAAmBA,MAAS,6BAA6BC,IAAS;AACpF,CAAC,EACA,OAAO,CAACP,GAAKK,MAAsBL,IAAM,WAAWK,EAAkB,UAAU,GAAG,GAAG,CAAC,IATjF,GAuBEG,KAAoB,CAACV,MAA4C;AAC5E,MAAIA,EAAa,kBAAkBA,EAAa,eAAe,SAAS;AACtE,WAAOA,EAAa,eAAe;AAAA,MACjC,CAACE,GAAKS,MAAkBT,IAAM,WAAWS,EAAc,UAAU,GAAG;AAAA,MACpE;AAAA,IAAA;AAIJ,MAAI,CAACX,EAAa;AAChB,WAAO;AAGT,QAAMY,IAAoBZ,EAAa,mBAAmB;AAAA,IACxD,CAAAO,MAAqBA,EAAkB,MAAM,YAAA,MAAkB;AAAA,EAAA;AAEjE,SAAOK,IAAoB,WAAWA,EAAkB,UAAU,GAAG,IAAI;AAC3E,GAsBaC,KAAwB,CACnCC,MACkC;AAClC,QAAMC,IAA8C,CAAA;AACpD,MAAIC,IAAe;AAEnB,SAAAF,EAAe,QAAQ,CAAAH,MAAiB;AACtC,UAAMF,IAASE,EAAc,QACvBM,IAAgB,WAAWR,KAAU,GAAG,GACxCS,IAAcP,EAAc,aAAa,KAAA,KAAU,IACnDQ,IAAOR,EAAc,QAAQ;AAEnC,QAAIO,MAAgB,IAAI;AACtB,MAAAF,KAAgBC;AAChB;AAAA,IACF;AAEA,IAAIA,MAAkB,KAAK,CAACE,KAI5BJ,EAAa,KAAK;AAAA,MAChB,QAAAN;AAAA,MACA,aAAAS;AAAA,MACA,GAAIC,IAAO,EAAE,MAAAA,MAAS,CAAA;AAAA,IAAC,CACxB;AAAA,EACH,CAAC,GAEGH,IAAe,KACjBD,EAAa,KAAK;AAAA,IAChB,QAAQC,EAAa,QAAQ,CAAC;AAAA,EAAA,CAC/B,GAGID;AACT,GASaK,KAAqB,CAACC,MAA0B;AAC3D,QAAMC,IAAUvC,EAAmBsC,CAAK;AAExC,SAAIC,IAAU,MAAM,IACX,GAAGA,CAAO,OAGZA,EAAQ,SAAA;AACjB,GAEMC,IAAsB,CAACC,MACtBA,EAAY,aAIVtC,EAA0BsC,EAAY,SAAS,KAAK,GAGvDC,IAA2B,CAC/BC,GACAC,MACwB;AACxB,MAAI,CAACD,EAAc,OAAQ,QAAO;AAElC,QAAME,IAAS,CAAC,GAAGF,CAAa,EAAE;AAAA,IAChC,CAACG,GAAGC,OACDD,EAAE,gBAAgB,IAAI,KAAKA,EAAE,aAAa,EAAE,YAAY,MACxDC,EAAE,gBAAgB,IAAI,KAAKA,EAAE,aAAa,EAAE,QAAA,IAAY;AAAA,EAAA;AAG7D,WAASC,IAAIH,EAAO,SAAS,GAAGG,KAAK,GAAGA,KAAK;AAC3C,UAAMC,IAAoBJ,EAAOG,CAAC,GAAG,eAC/BE,IAAcD,IAAoB,IAAI,KAAKA,CAAiB,IAAI;AACtE,QAAIC,KAAeA,KAAeN;AAChC,aAAOC,EAAOG,CAAC,KAAK;AAAA,EAExB;AAEA,SAAOH,EAAO,CAAC,KAAK;AACtB,GAEMM,IAA0B,CAC9BC,GACAR,MACwB;AACxB,MAAI,CAACQ,EAAa,OAAQ,QAAO;AAEjC,QAAMP,IAAS,CAAC,GAAGO,CAAY,EAAE;AAAA,IAC/B,CAACN,GAAGC,OACDD,EAAE,gBAAgB,IAAI,KAAKA,EAAE,aAAa,EAAE,YAAY,MACxDC,EAAE,gBAAgB,IAAI,KAAKA,EAAE,aAAa,EAAE,QAAA,IAAY;AAAA,EAAA;AAG7D,WAASC,IAAIH,EAAO,SAAS,GAAGG,KAAK,GAAGA,KAAK;AAC3C,UAAMC,IAAoBJ,EAAOG,CAAC,GAAG,eAC/BE,IAAcD,IAAoB,IAAI,KAAKA,CAAiB,IAAI;AACtE,QAAIC,KAAeA,KAAeN;AAChC,aAAOC,EAAOG,CAAC,KAAK;AAAA,EAExB;AAEA,SAAOH,EAAO,CAAC,KAAK;AACtB,GAEMQ,IAAa,CAACpC,MACXA,EAAa,eAAe,YAAYA,EAAa,eAAe,sBAsBvEqC,IAA2B,CAACC,MAC3BA,EAAmB,SAEjBA,EACJ,OAAO,CAAA/B,MAAqB;AAC3B,QAAMC,IAAOD,EAAkB,MAAM,YAAA,GAC/BE,IAAS,WAAWF,EAAkB,UAAU,GAAG;AACzD,UAAQC,MAAS,mBAAmBA,MAAS,gBAAgBC,IAAS;AACxE,CAAC,EACA,OAAO,CAACP,GAAKK,MAAsBL,IAAM,WAAWK,EAAkB,UAAU,GAAG,GAAG,CAAC,IARnD,GAWnCgC,IAAsB,CAACvC,MAAuC;AAClE,QAAMT,IAAO,WAAWS,EAAa,QAAQ,GAAG;AAGhD,UAFoBA,EAAa,eAAe,QAExC;AAAA,IACN,KAAK;AACH,aAAOT;AAAA,IACT,KAAK;AACH,aAAOA,IAAO;AAAA;AAAA,IAChB,KAAK;AACH,aAAOA,IAAO;AAAA,IAChB,KAAK;AACH,aAAOA,IAAO;AAAA,IAChB,KAAK;AACH,aAAO;AAAA;AAAA,IACT;AACE,aAAOA;AAAA,EAAA;AAEb,GAEMiD,IAAsB,CAAC7D,GAAoB8D,GAAiBd,MAAgC;AAChG,QAAM/C,IAAMD,EAAS,MAAM,KAAK,CAAA+D,MAAKA,EAAE,SAASD,CAAO;AACvD,MAAI,CAAC7D,GAAK;AACR,WAAO;AAGT,QAAMoB,IAAeyB,EAAyB7C,EAAI,eAAe+C,CAAa;AAC9E,SAAO3B,IAAeuC,EAAoBvC,CAAY,IAAI;AAC5D,GAEM2C,IAAuB,CAAChE,GAAoBgD,MAAgC;AAChF,QAAMtC,IAAaX,EAAcC,CAAQ;AACzC,MAAI,CAACU,GAAY;AACf,WAAO;AAGT,QAAMW,IAAeyB,EAAyBpC,EAAW,eAAesC,CAAa;AACrF,SAAO3B,IAAeuC,EAAoBvC,CAAY,IAAI;AAC5D,GAEM4C,IAA8B,CAAC5C,MAC9BA,EAAa,cAIXA,EAAa,YAAY;AAAA,EAC9B,CAACE,GAAK2C,MAAgB3C,IAAM,WAAW2C,EAAY,+BAA+B,GAAG;AAAA,EACrF;AAAA,IALO,GASLC,IAAc,CAClB9C,GACA+C,GACAC,GACAC,MACW;AACX,QAAMC,IAAkB9C,EAAiBJ,CAAY;AAErD,MAAIiD,GAAU;AACZ,UAAME,IAAsBP,EAA4B5C,CAAY;AACpE,WAAOkD,IAAkBC;AAAA,EAC3B;AAEA,SAAIJ,IACK,KAAK,IAAIC,GAAkBE,CAAe,IAG5CA;AACT,GAEME,IAAiC,CACrCC,GACArD,GACA2B,MACW;AACX,MAAI,CAAC0B,EAAoB,qBAAsB,QAAO;AAEtD,QAAMC,IAAmBpB;AAAA,IACvBmB,EAAoB,gBAAgB,CAAA;AAAA,IACpC1B;AAAA,EAAA;AAEF,MAAI,CAAC2B;AACH,WAAO;AAGT,QAAMC,IACJvD,EAAa,qBAAqB;AAAA,IAChC,CAACE,GAAKD,MAAuBC,IAAM,WAAWD,EAAmB,SAAS,GAAG;AAAA,IAC7E;AAAA,EAAA,KACG,GAEDuD,IAAajB,EAAoBc,CAAmB,GAEpDI,KAAkB,WAAWH,EAAiB,QAAQ,GAAG,IAAIE,KAAcD,GAC3EG,IAAYrB,EAAyBrC,EAAa,sBAAsB,CAAA,CAAE;AAEhF,SAAO,KAAK,IAAI,GAAGyD,IAAiBC,CAAS;AAC/C,GAEMC,IAAkC,CACtC3D,GACArB,GACAgD,GACAoB,GACAC,GACAY,GACAC,MACW;AACX,MAAI,CAACA,KAAcd;AAEjB,WAD0BJ,EAAqBhE,GAAUgD,CAAa,KAC1CqB,IAAmBY;AAGjD,MAAI,CAAC5D,EAAa,uBAAuB,CAACrB,EAAS;AACjD,WAAO;AAGT,QAAMmF,IAAiB9D,EAAa,oBAAoB,OAAO,CAACE,GAAK6D,MAAO;AAC1E,UAAM1C,IAAQ,WAAW0C,EAAG,SAAS,GAAG,GAClCP,IAAahB,EAAoB7D,GAAUoF,EAAG,WAAW,IAAIpC,CAAa;AAChF,WAAOzB,IAAMmB,IAAQmC;AAAA,EACvB,GAAG,CAAC,GAEED,IAAavD,EAAa,oBAAoB,OAAO,CAACE,GAAK6D,MACxD7D,IAAM,WAAW6D,EAAG,SAAS,GAAG,GACtC,CAAC;AAEJ,MAAIR,MAAe,EAAG,QAAOO;AAE7B,QAAME,IAAuBnF,EAAmBiF,IAAiBP,CAAU,GAGrEU,IAAcjE,EAAa,oBAC9B,OAAO,OAAM,CAAChB,EAAe+E,EAAG,QAAQ,EAAE,CAAC,EAC3C,OAAO,CAAC7D,GAAK6D,MAAO;AACnB,UAAM1C,IAAQ,WAAW0C,EAAG,SAAS,GAAG,GAClCG,IAAaH,EAAG,0BAA0B;AAChD,WAAO7D,IAAMmB,IAAQ2C,KAAwBE,IAAa;AAAA,EAC5D,GAAG,CAAC;AAEN,SAAOJ,IAAiBG;AAC1B,GAEME,IAAkB,CACtBnE,GACArB,GACAgD,GACAoB,GACAC,GACAC,MACW;AACX,QAAMW,IAAWd;AAAA,IACf9C;AAAA,IACA+C;AAAA,IACAC;AAAA,IACAC;AAAA,EAAA,GAEImB,IAAoBzB,EAAqBhE,GAAUgD,CAAa;AACtE,SAAOiC,IAAWQ;AACpB,GAEMC,IAAuC,CAC3CrE,GACAoC,GACAY,MACY;AACZ,MAAI,CAACZ,EAAY,QAAO;AAExB,QAAMkC,IAA4BtE,EAAa,qBAAqB;AAAA,IAAK,CAAAC,MACvEjB,EAAeiB,EAAmB,QAAQ,EAAE;AAAA,EAAA;AAG9C,SAAKqE,IAEgB,WAAWA,EAA0B,SAAS,GAAG,MAC9CtB,IAHe;AAIzC,GAkBauB,KAAoB,CAC/BvE,GACArB,GACA6F,GACAhD,GACAiD,IAAmCC,EAAgB,YACxC;AACX,MAAI1E,EAAa;AACf,WAAO;AAGT,QAAM2E,IAA4BH,IAC9B,IAAI,KAAKA,CAA+B,wBACpC,KAAA,GAEFnF,IAAaX,EAAcC,CAAQ;AACzC,MAAI,CAACU,GAAY;AACf,WAAO;AAGT,QAAMgE,IAAsB5B;AAAA,IAC1BpC,EAAW;AAAA,IACXsF;AAAA,EAAA;AAGF,MAAI,CAACtB;AACH,WAAO;AAGT,QAAMuB,IAAWxC,EAAWiB,CAAmB,GACzCL,IAAmBxB,IAAcD,EAAoBC,CAAW,IAAI,GAEpEuB,IAA8BsB;AAAA,IAClCrE;AAAA,IACA4E;AAAA,IACA5B;AAAA,EAAA,GAGIC,IAAW4B,EAAkBJ,CAAe,GAE5Cb,IAAWd;AAAA,IACf9C;AAAA,IACA+C;AAAA,IACAC;AAAA,IACAC;AAAA,EAAA,GAGI6B,IAAyBnB;AAAA,IAC7B3D;AAAA,IACArB;AAAA,IACAgG;AAAA,IACA5B;AAAA,IACAC;AAAA,IACAY;AAAA,IACAX;AAAA,EAAA,GAGI8B,IAAWzE,EAAsBN,CAAY,GAC7CgF,IAASb;AAAA,IACbnE;AAAA,IACArB;AAAA,IACAgG;AAAA,IACA5B;AAAA,IACAC;AAAA,IACAC;AAAA,EAAA,GAEIgC,IAAwB7B;AAAA,IAC5BC;AAAA,IACArD;AAAA,IACA2E;AAAA,EAAA,GAGIO,IAAQJ,IAAyBC,IAAWC,IAASC;AAC3D,SAAOlG,EAAmBmG,CAAK;AACjC,GAyBaC,KAAqB,CAACC,MACjCA,MAAmBC,EAAmB,mBAElCC,IAAkD;AAAA,EACtD,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,oCAAoC;AAAA,EACpC,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,UAAU;AAAA,EACV,qCAAqC;AACvC,GAUaC,KAAsB,CAACC,MAK9BA,EAAQ,WAAiB,aACzBA,EAAQ,YAAYA,EAAQ,iBACvBF,EAAwBE,EAAQ,cAAc,KAAKA,EAAQ,iBAEhEA,EAAQ,WAAiB,cACtB,WAeIC,KAAqC,CAAC;AAAA,EACjD,YAAAC;AAAA,EACA,4BAAAC,IAA6B,CAAA;AAAA,EAC7B,gBAAAC;AAAA,EACA,wBAAAC,IAAyB,CAAA;AAAA,EACzB,eAAAC,IAAgB,CAAA;AAClB,MAM4B;AAC1B,QAAMC,IAAwB,CAAC,GAAGJ,CAA0B;AAE5D,SAAID,MAAeM,EAAW,SAASJ,KAAkBC,EAAuB,SAAS,KACzDA,EAC3B,IAAI,CAAAI,MAAQA,EAAK,IAAI,EACrB,OAAO,OAAO,EAEK,QAAQ,CAAAhH,MAAoB;AAKhD,IAJe8G,EAAsB;AAAA,MACnC,OAAQG,EAAK,MAAM,YAAA,MAAkBjH,EAAiB,YAAA;AAAA,IAAY,KAIlE8G,EAAsB,KAAK;AAAA,MACzB,MAAM9G;AAAA,MACN,QAAQ;AAAA,MACR,SAAS2G;AAAA,IAAA,CACV;AAAA,EAEL,CAAC,GAIIG,EACJ,OAAO,CAAAG,MAAQA,EAAK,QAAQ,CAACJ,EAAc,SAASI,EAAK,IAAI,CAAC,EAC9D,KAAK,CAACrE,GAAGC,OAAOD,EAAE,QAAQ,IAAI,cAAcC,EAAE,QAAQ,EAAE,CAAC;AAC9D,GASaqE,KAAwB,CAACC,MACfA,EAAY,SAC7B,OAAOA,EAAY,OAAO,YAAY,CAAC,IACvC,OAAOA,EAAY,OAAO,iBAAiB,CAAC,IAC5C,OAAOA,EAAY,OAAO,kBAAkB,CAAC,IAC7C,OAAOA,EAAY,OAAO,YAAY,CAAC,IACvC,GAaAC,IAAuB,CAACC,MAAuB;AACnD,QAAMC,IAAOD,EAAK,YAAA,GAEZE,IAAoB,IAAI,KAAKD,GAAM,GAAG,CAAC;AAC7C,EAAAC,EAAkB,QAAQ,KAAK,IAAIA,EAAkB,OAAA,KAAY,CAAC;AAElE,QAAMC,IAAsB,IAAI,KAAKF,GAAM,IAAI,CAAC;AAChD,SAAAE,EAAoB,QAAQ,KAAM,IAAIA,EAAoB,OAAA,KAAY,CAAE,GAE1DH,KAAQE,KAAqBF,IAAOG,IACnC,KAAK;AACtB,GAaaC,KAAmB,CAAClB,MAA8B;AAS7D,MARIA,EAAQ,mBAAmB,gBAAgB,MAI3C,CAACA,EAAQ,aAIT,CAACA,EAAQ;AACX,WAAO;AAGT,QAAMmB,wBAAU,KAAA,GACVC,IAAW,IAAI,KAAKpB,EAAQ,eAAe,GAE3CqB,IAAU,IAAI,KAAKF,EAAI,YAAYN,EAAqBM,CAAG,IAAIG,CAAW,GAC1EC,IAAe,IAAI,KAAKH,EAAS,YAAYP,EAAqBO,CAAQ,IAAIE,CAAW,GAEzFE,IAAa,IAAI,KAAKD,CAAY;AAGxC,SAFAC,EAAW,YAAY,IAAI,GAAG,GAAG,CAAC,GAE9B,EAAAH,KAAWG;AAKjB;"}
@@ -1,4 +1,4 @@
1
- import { useState as M, useRef as m, useMemo as _, useCallback as y, useEffect as b } from "react";
1
+ import { useState as M, useRef as y, useMemo as _, useCallback as m, useEffect as b } from "react";
2
2
  import { usePayrollsPrepareMutation as L } from "@gusto/embedded-api/react-query/payrollsPrepare";
3
3
  import { usePaySchedulesGet as D } from "@gusto/embedded-api/react-query/paySchedulesGet";
4
4
  import { UnprocessableEntityError as T } from "@gusto/embedded-api/models/errors/unprocessableentityerror";
@@ -11,20 +11,17 @@ import "@gusto/embedded-api/models/errors/apierror";
11
11
  import "@gusto/embedded-api/models/errors/gustoembeddederror";
12
12
  import "@gusto/embedded-api/models/errors/sdkvalidationerror";
13
13
  import "@gusto/embedded-api/models/errors/httpclienterrors";
14
- import "dompurify";
15
- import "../../contexts/LocaleProvider/useLocale.js";
16
14
  import "../../shared/constants.js";
17
15
  import "../../contexts/ComponentAdapter/useComponentContext.js";
18
- import "../../contexts/LoadingIndicatorProvider/useLoadingIndicator.js";
19
16
  import { retryAsync as x } from "../../helpers/retryAsync.js";
20
- const q = 4, v = 1500, B = (e) => e instanceof T ? e.errors.some((r) => r.category === "invalid_operation") : !1, $ = ({
17
+ const q = 4, v = 1500, B = (e) => e instanceof T ? e.errors.some((r) => r.category === "invalid_operation") : !1, V = ({
21
18
  companyId: e,
22
19
  payrollId: r,
23
20
  employeeUuids: a,
24
21
  sortBy: n,
25
22
  onDataReady: l
26
23
  }) => {
27
- const { mutateAsync: p, isPending: c } = L(), [o, f] = M(), t = m(!1), u = m(!1), { baseSubmitHandler: d } = w(), h = _(() => a?.join(",") ?? "", [a]), { data: S, isLoading: E } = D(
24
+ const { mutateAsync: c, isPending: p } = L(), [o, f] = M(), t = y(!1), u = y(!1), { baseSubmitHandler: d } = w(), h = _(() => a?.join(",") ?? "", [a]), { data: S, isLoading: E } = D(
28
25
  {
29
26
  companyId: e,
30
27
  payScheduleId: o?.payPeriod?.payScheduleUuid || ""
@@ -32,8 +29,8 @@ const q = 4, v = 1500, B = (e) => e instanceof T ? e.errors.some((r) => r.catego
32
29
  {
33
30
  enabled: !!o?.payPeriod?.payScheduleUuid
34
31
  }
35
- ), P = y(async () => {
36
- const s = await p({
32
+ ), P = m(async () => {
33
+ const i = await c({
37
34
  request: {
38
35
  companyId: e,
39
36
  payrollId: r,
@@ -43,8 +40,8 @@ const q = 4, v = 1500, B = (e) => e instanceof T ? e.errors.some((r) => r.catego
43
40
  }
44
41
  }
45
42
  });
46
- f(s.payrollPrepared), s.payrollPrepared && (t.current = !0, l?.(s.payrollPrepared));
47
- }, [e, r, p, h, n, l]), i = y(async () => {
43
+ f(i.payrollPrepared), i.payrollPrepared && (t.current = !0, l?.(i.payrollPrepared));
44
+ }, [e, r, c, h, n, l]), s = m(async () => {
48
45
  await d(
49
46
  null,
50
47
  () => x(P, {
@@ -55,11 +52,11 @@ const q = 4, v = 1500, B = (e) => e instanceof T ? e.errors.some((r) => r.catego
55
52
  );
56
53
  }, [d, P]);
57
54
  b(() => {
58
- u.current || (u.current = !0, i());
59
- }, [i]);
60
- const g = c && !t.current, R = c && t.current, A = g || E;
55
+ u.current || (u.current = !0, s());
56
+ }, [s]);
57
+ const g = p && !t.current, R = p && t.current, A = g || E;
61
58
  return {
62
- handlePreparePayroll: i,
59
+ handlePreparePayroll: s,
63
60
  preparedPayroll: o,
64
61
  paySchedule: S?.payScheduleShow,
65
62
  isLoading: A,
@@ -68,6 +65,6 @@ const q = 4, v = 1500, B = (e) => e instanceof T ? e.errors.some((r) => r.catego
68
65
  };
69
66
  };
70
67
  export {
71
- $ as usePreparedPayrollData
68
+ V as usePreparedPayrollData
72
69
  };
73
70
  //# sourceMappingURL=usePreparedPayrollData.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"usePreparedPayrollData.js","sources":["../../../src/components/Payroll/usePreparedPayrollData.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useRef, useMemo } from 'react'\nimport { usePayrollsPrepareMutation } from '@gusto/embedded-api/react-query/payrollsPrepare'\nimport { usePaySchedulesGet } from '@gusto/embedded-api/react-query/paySchedulesGet'\nimport type { PayrollPrepared } from '@gusto/embedded-api/models/components/payrollshow'\nimport type { PayScheduleShow } from '@gusto/embedded-api/models/components/payscheduleshow'\nimport { UnprocessableEntityError } from '@gusto/embedded-api/models/errors/unprocessableentityerror'\nimport { useBase } from '../Base'\nimport { retryAsync } from '@/helpers/retryAsync'\n\ninterface UsePreparedPayrollDataParams {\n companyId: string\n payrollId: string\n employeeUuids?: string[]\n sortBy?: string\n onDataReady?: (preparedPayroll: PayrollPrepared) => void\n}\n\ninterface UsePreparedPayrollDataReturn {\n handlePreparePayroll: () => Promise<void>\n preparedPayroll: PayrollPrepared | undefined\n paySchedule: PayScheduleShow | undefined\n isLoading: boolean\n isPaginating: boolean\n hasInitialData: boolean\n}\n\nconst PREPARE_MAX_ATTEMPTS = 4\nconst PREPARE_RETRY_DELAY_MS = 1500\n\nconst isPayrollBeingProcessedError = (error: unknown): boolean => {\n if (!(error instanceof UnprocessableEntityError)) return false\n return error.errors.some(e => e.category === 'invalid_operation')\n}\n\n/**\n * Wraps the prepare-payroll mutation and pay-schedule fetch, retrying while the payroll is still being processed.\n *\n * @remarks\n * Fires the prepare call once on mount, then exposes `handlePreparePayroll` for callers that need to re-prepare\n * (e.g. after sort or pagination changes). Distinguishes initial loading from subsequent pagination via\n * `isLoading` and `isPaginating`, and surfaces the pay schedule for the prepared payroll's pay period.\n *\n * @param params - The company and payroll identifiers, plus optional employee filter, sort, and ready callback.\n * @returns The prepared payroll, its pay schedule, loading flags, and a `handlePreparePayroll` callback to re-run.\n * @internal\n */\nexport const usePreparedPayrollData = ({\n companyId,\n payrollId,\n employeeUuids,\n sortBy,\n onDataReady,\n}: UsePreparedPayrollDataParams): UsePreparedPayrollDataReturn => {\n const { mutateAsync: preparePayroll, isPending: isPreparePayrollPending } =\n usePayrollsPrepareMutation()\n const [preparedPayroll, setPreparedPayroll] = useState<PayrollPrepared | undefined>()\n const hasInitialDataRef = useRef(false)\n const hasFiredRef = useRef(false)\n const { baseSubmitHandler } = useBase()\n\n const employeeUuidsKey = useMemo(() => employeeUuids?.join(',') ?? '', [employeeUuids])\n\n const { data: payScheduleData, isLoading: isPayScheduleLoading } = usePaySchedulesGet(\n {\n companyId,\n payScheduleId: preparedPayroll?.payPeriod?.payScheduleUuid || '',\n },\n {\n enabled: !!preparedPayroll?.payPeriod?.payScheduleUuid,\n },\n )\n\n const executePrepare = useCallback(async () => {\n const result = await preparePayroll({\n request: {\n companyId,\n payrollId,\n sortBy,\n requestBody: {\n employeeUuids,\n },\n },\n })\n setPreparedPayroll(result.payrollPrepared)\n if (result.payrollPrepared) {\n hasInitialDataRef.current = true\n onDataReady?.(result.payrollPrepared)\n }\n }, [companyId, payrollId, preparePayroll, employeeUuidsKey, sortBy, onDataReady])\n\n const handlePreparePayroll = useCallback(async () => {\n await baseSubmitHandler(null, () =>\n retryAsync(executePrepare, {\n maxAttempts: PREPARE_MAX_ATTEMPTS,\n delayMs: PREPARE_RETRY_DELAY_MS,\n shouldRetry: isPayrollBeingProcessedError,\n }),\n )\n }, [baseSubmitHandler, executePrepare])\n\n useEffect(() => {\n if (hasFiredRef.current) return\n hasFiredRef.current = true\n void handlePreparePayroll()\n }, [handlePreparePayroll])\n\n const isInitialLoading = isPreparePayrollPending && !hasInitialDataRef.current\n const isPaginating = isPreparePayrollPending && hasInitialDataRef.current\n const isLoading = isInitialLoading || isPayScheduleLoading\n\n return {\n handlePreparePayroll,\n preparedPayroll,\n paySchedule: payScheduleData?.payScheduleShow,\n isLoading,\n isPaginating,\n hasInitialData: hasInitialDataRef.current,\n }\n}\n"],"names":["PREPARE_MAX_ATTEMPTS","PREPARE_RETRY_DELAY_MS","isPayrollBeingProcessedError","error","UnprocessableEntityError","e","usePreparedPayrollData","companyId","payrollId","employeeUuids","sortBy","onDataReady","preparePayroll","isPreparePayrollPending","usePayrollsPrepareMutation","preparedPayroll","setPreparedPayroll","useState","hasInitialDataRef","useRef","hasFiredRef","baseSubmitHandler","useBase","employeeUuidsKey","useMemo","payScheduleData","isPayScheduleLoading","usePaySchedulesGet","executePrepare","useCallback","result","handlePreparePayroll","retryAsync","useEffect","isInitialLoading","isPaginating","isLoading"],"mappings":";;;;;;;;;;;;;;;;;;;AA0BA,MAAMA,IAAuB,GACvBC,IAAyB,MAEzBC,IAA+B,CAACC,MAC9BA,aAAiBC,IAChBD,EAAM,OAAO,KAAK,CAAAE,MAAKA,EAAE,aAAa,mBAAmB,IADP,IAgB9CC,IAAyB,CAAC;AAAA,EACrC,WAAAC;AAAA,EACA,WAAAC;AAAA,EACA,eAAAC;AAAA,EACA,QAAAC;AAAA,EACA,aAAAC;AACF,MAAkE;AAChE,QAAM,EAAE,aAAaC,GAAgB,WAAWC,EAAA,IAC9CC,EAAA,GACI,CAACC,GAAiBC,CAAkB,IAAIC,EAAA,GACxCC,IAAoBC,EAAO,EAAK,GAChCC,IAAcD,EAAO,EAAK,GAC1B,EAAE,mBAAAE,EAAA,IAAsBC,EAAA,GAExBC,IAAmBC,EAAQ,MAAMf,GAAe,KAAK,GAAG,KAAK,IAAI,CAACA,CAAa,CAAC,GAEhF,EAAE,MAAMgB,GAAiB,WAAWC,MAAyBC;AAAA,IACjE;AAAA,MACE,WAAApB;AAAA,MACA,eAAeQ,GAAiB,WAAW,mBAAmB;AAAA,IAAA;AAAA,IAEhE;AAAA,MACE,SAAS,CAAC,CAACA,GAAiB,WAAW;AAAA,IAAA;AAAA,EACzC,GAGIa,IAAiBC,EAAY,YAAY;AAC7C,UAAMC,IAAS,MAAMlB,EAAe;AAAA,MAClC,SAAS;AAAA,QACP,WAAAL;AAAA,QACA,WAAAC;AAAA,QACA,QAAAE;AAAA,QACA,aAAa;AAAA,UACX,eAAAD;AAAA,QAAA;AAAA,MACF;AAAA,IACF,CACD;AACD,IAAAO,EAAmBc,EAAO,eAAe,GACrCA,EAAO,oBACTZ,EAAkB,UAAU,IAC5BP,IAAcmB,EAAO,eAAe;AAAA,EAExC,GAAG,CAACvB,GAAWC,GAAWI,GAAgBW,GAAkBb,GAAQC,CAAW,CAAC,GAE1EoB,IAAuBF,EAAY,YAAY;AACnD,UAAMR;AAAA,MAAkB;AAAA,MAAM,MAC5BW,EAAWJ,GAAgB;AAAA,QACzB,aAAa5B;AAAA,QACb,SAASC;AAAA,QACT,aAAaC;AAAA,MAAA,CACd;AAAA,IAAA;AAAA,EAEL,GAAG,CAACmB,GAAmBO,CAAc,CAAC;AAEtC,EAAAK,EAAU,MAAM;AACd,IAAIb,EAAY,YAChBA,EAAY,UAAU,IACjBW,EAAA;AAAA,EACP,GAAG,CAACA,CAAoB,CAAC;AAEzB,QAAMG,IAAmBrB,KAA2B,CAACK,EAAkB,SACjEiB,IAAetB,KAA2BK,EAAkB,SAC5DkB,IAAYF,KAAoBR;AAEtC,SAAO;AAAA,IACL,sBAAAK;AAAA,IACA,iBAAAhB;AAAA,IACA,aAAaU,GAAiB;AAAA,IAC9B,WAAAW;AAAA,IACA,cAAAD;AAAA,IACA,gBAAgBjB,EAAkB;AAAA,EAAA;AAEtC;"}
1
+ {"version":3,"file":"usePreparedPayrollData.js","sources":["../../../src/components/Payroll/usePreparedPayrollData.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useRef, useMemo } from 'react'\nimport { usePayrollsPrepareMutation } from '@gusto/embedded-api/react-query/payrollsPrepare'\nimport { usePaySchedulesGet } from '@gusto/embedded-api/react-query/paySchedulesGet'\nimport type { PayrollPrepared } from '@gusto/embedded-api/models/components/payrollshow'\nimport type { PayScheduleShow } from '@gusto/embedded-api/models/components/payscheduleshow'\nimport { UnprocessableEntityError } from '@gusto/embedded-api/models/errors/unprocessableentityerror'\nimport { useBase } from '../Base'\nimport { retryAsync } from '@/helpers/retryAsync'\n\ninterface UsePreparedPayrollDataParams {\n companyId: string\n payrollId: string\n employeeUuids?: string[]\n sortBy?: string\n onDataReady?: (preparedPayroll: PayrollPrepared) => void\n}\n\ninterface UsePreparedPayrollDataReturn {\n handlePreparePayroll: () => Promise<void>\n preparedPayroll: PayrollPrepared | undefined\n paySchedule: PayScheduleShow | undefined\n isLoading: boolean\n isPaginating: boolean\n hasInitialData: boolean\n}\n\nconst PREPARE_MAX_ATTEMPTS = 4\nconst PREPARE_RETRY_DELAY_MS = 1500\n\nconst isPayrollBeingProcessedError = (error: unknown): boolean => {\n if (!(error instanceof UnprocessableEntityError)) return false\n return error.errors.some(e => e.category === 'invalid_operation')\n}\n\n/**\n * Wraps the prepare-payroll mutation and pay-schedule fetch, retrying while the payroll is still being processed.\n *\n * @remarks\n * Fires the prepare call once on mount, then exposes `handlePreparePayroll` for callers that need to re-prepare\n * (e.g. after sort or pagination changes). Distinguishes initial loading from subsequent pagination via\n * `isLoading` and `isPaginating`, and surfaces the pay schedule for the prepared payroll's pay period.\n *\n * @param params - The company and payroll identifiers, plus optional employee filter, sort, and ready callback.\n * @returns The prepared payroll, its pay schedule, loading flags, and a `handlePreparePayroll` callback to re-run.\n * @internal\n */\nexport const usePreparedPayrollData = ({\n companyId,\n payrollId,\n employeeUuids,\n sortBy,\n onDataReady,\n}: UsePreparedPayrollDataParams): UsePreparedPayrollDataReturn => {\n const { mutateAsync: preparePayroll, isPending: isPreparePayrollPending } =\n usePayrollsPrepareMutation()\n const [preparedPayroll, setPreparedPayroll] = useState<PayrollPrepared | undefined>()\n const hasInitialDataRef = useRef(false)\n const hasFiredRef = useRef(false)\n const { baseSubmitHandler } = useBase()\n\n const employeeUuidsKey = useMemo(() => employeeUuids?.join(',') ?? '', [employeeUuids])\n\n const { data: payScheduleData, isLoading: isPayScheduleLoading } = usePaySchedulesGet(\n {\n companyId,\n payScheduleId: preparedPayroll?.payPeriod?.payScheduleUuid || '',\n },\n {\n enabled: !!preparedPayroll?.payPeriod?.payScheduleUuid,\n },\n )\n\n const executePrepare = useCallback(async () => {\n const result = await preparePayroll({\n request: {\n companyId,\n payrollId,\n sortBy,\n requestBody: {\n employeeUuids,\n },\n },\n })\n setPreparedPayroll(result.payrollPrepared)\n if (result.payrollPrepared) {\n hasInitialDataRef.current = true\n onDataReady?.(result.payrollPrepared)\n }\n }, [companyId, payrollId, preparePayroll, employeeUuidsKey, sortBy, onDataReady])\n\n const handlePreparePayroll = useCallback(async () => {\n await baseSubmitHandler(null, () =>\n retryAsync(executePrepare, {\n maxAttempts: PREPARE_MAX_ATTEMPTS,\n delayMs: PREPARE_RETRY_DELAY_MS,\n shouldRetry: isPayrollBeingProcessedError,\n }),\n )\n }, [baseSubmitHandler, executePrepare])\n\n useEffect(() => {\n if (hasFiredRef.current) return\n hasFiredRef.current = true\n void handlePreparePayroll()\n }, [handlePreparePayroll])\n\n const isInitialLoading = isPreparePayrollPending && !hasInitialDataRef.current\n const isPaginating = isPreparePayrollPending && hasInitialDataRef.current\n const isLoading = isInitialLoading || isPayScheduleLoading\n\n return {\n handlePreparePayroll,\n preparedPayroll,\n paySchedule: payScheduleData?.payScheduleShow,\n isLoading,\n isPaginating,\n hasInitialData: hasInitialDataRef.current,\n }\n}\n"],"names":["PREPARE_MAX_ATTEMPTS","PREPARE_RETRY_DELAY_MS","isPayrollBeingProcessedError","error","UnprocessableEntityError","e","usePreparedPayrollData","companyId","payrollId","employeeUuids","sortBy","onDataReady","preparePayroll","isPreparePayrollPending","usePayrollsPrepareMutation","preparedPayroll","setPreparedPayroll","useState","hasInitialDataRef","useRef","hasFiredRef","baseSubmitHandler","useBase","employeeUuidsKey","useMemo","payScheduleData","isPayScheduleLoading","usePaySchedulesGet","executePrepare","useCallback","result","handlePreparePayroll","retryAsync","useEffect","isInitialLoading","isPaginating","isLoading"],"mappings":";;;;;;;;;;;;;;;;AA0BA,MAAMA,IAAuB,GACvBC,IAAyB,MAEzBC,IAA+B,CAACC,MAC9BA,aAAiBC,IAChBD,EAAM,OAAO,KAAK,CAAAE,MAAKA,EAAE,aAAa,mBAAmB,IADP,IAgB9CC,IAAyB,CAAC;AAAA,EACrC,WAAAC;AAAA,EACA,WAAAC;AAAA,EACA,eAAAC;AAAA,EACA,QAAAC;AAAA,EACA,aAAAC;AACF,MAAkE;AAChE,QAAM,EAAE,aAAaC,GAAgB,WAAWC,EAAA,IAC9CC,EAAA,GACI,CAACC,GAAiBC,CAAkB,IAAIC,EAAA,GACxCC,IAAoBC,EAAO,EAAK,GAChCC,IAAcD,EAAO,EAAK,GAC1B,EAAE,mBAAAE,EAAA,IAAsBC,EAAA,GAExBC,IAAmBC,EAAQ,MAAMf,GAAe,KAAK,GAAG,KAAK,IAAI,CAACA,CAAa,CAAC,GAEhF,EAAE,MAAMgB,GAAiB,WAAWC,MAAyBC;AAAA,IACjE;AAAA,MACE,WAAApB;AAAA,MACA,eAAeQ,GAAiB,WAAW,mBAAmB;AAAA,IAAA;AAAA,IAEhE;AAAA,MACE,SAAS,CAAC,CAACA,GAAiB,WAAW;AAAA,IAAA;AAAA,EACzC,GAGIa,IAAiBC,EAAY,YAAY;AAC7C,UAAMC,IAAS,MAAMlB,EAAe;AAAA,MAClC,SAAS;AAAA,QACP,WAAAL;AAAA,QACA,WAAAC;AAAA,QACA,QAAAE;AAAA,QACA,aAAa;AAAA,UACX,eAAAD;AAAA,QAAA;AAAA,MACF;AAAA,IACF,CACD;AACD,IAAAO,EAAmBc,EAAO,eAAe,GACrCA,EAAO,oBACTZ,EAAkB,UAAU,IAC5BP,IAAcmB,EAAO,eAAe;AAAA,EAExC,GAAG,CAACvB,GAAWC,GAAWI,GAAgBW,GAAkBb,GAAQC,CAAW,CAAC,GAE1EoB,IAAuBF,EAAY,YAAY;AACnD,UAAMR;AAAA,MAAkB;AAAA,MAAM,MAC5BW,EAAWJ,GAAgB;AAAA,QACzB,aAAa5B;AAAA,QACb,SAASC;AAAA,QACT,aAAaC;AAAA,MAAA,CACd;AAAA,IAAA;AAAA,EAEL,GAAG,CAACmB,GAAmBO,CAAc,CAAC;AAEtC,EAAAK,EAAU,MAAM;AACd,IAAIb,EAAY,YAChBA,EAAY,UAAU,IACjBW,EAAA;AAAA,EACP,GAAG,CAACA,CAAoB,CAAC;AAEzB,QAAMG,IAAmBrB,KAA2B,CAACK,EAAkB,SACjEiB,IAAetB,KAA2BK,EAAkB,SAC5DkB,IAAYF,KAAoBR;AAEtC,SAAO;AAAA,IACL,sBAAAK;AAAA,IACA,iBAAAhB;AAAA,IACA,aAAaU,GAAiB;AAAA,IAC9B,WAAAW;AAAA,IACA,cAAAD;AAAA,IACA,gBAAgBjB,EAAkB;AAAA,EAAA;AAEtC;"}
@@ -1,45 +1,45 @@
1
1
  import { jsx as r, jsxs as V } from "react/jsx-runtime";
2
- import { useMemo as s } from "react";
2
+ import { useMemo as m } from "react";
3
3
  import { useTranslation as F } from "react-i18next";
4
- import h from "./EmployeeTable.module.scss.js";
4
+ import f from "./EmployeeTable.module.scss.js";
5
5
  import { EmptyData as I } from "../../../Common/EmptyData/EmptyData.js";
6
6
  import { useComponentContext as O } from "../../../../contexts/ComponentAdapter/useComponentContext.js";
7
7
  import { useI18n as P } from "../../../../i18n/I18n.js";
8
8
  import { firstLastName as _ } from "../../../../helpers/formattedStrings.js";
9
9
  import H from "../../../../assets/icons/search-lg.svg.js";
10
- import { useDataView as W } from "../../../Common/DataView/useDataView.js";
11
- import { DataView as $ } from "../../../Common/DataView/DataView.js";
10
+ import { useDataView as M } from "../../../Common/DataView/useDataView.js";
11
+ import { DataView as W } from "../../../Common/DataView/DataView.js";
12
12
  function ee({
13
13
  data: o,
14
- label: d,
15
- additionalColumns: m = [],
14
+ label: h,
15
+ additionalColumns: s = [],
16
16
  hideJobTitle: l,
17
17
  searchValue: i,
18
- onSearchChange: y,
19
- onSearchClear: b,
20
- searchPlaceholder: E,
21
- hideSearch: T,
22
- selectionMode: g,
18
+ onSearchChange: d,
19
+ onSearchClear: y,
20
+ searchPlaceholder: b,
21
+ hideSearch: E,
22
+ selectionMode: T,
23
23
  onSelect: c,
24
- onSelectAll: C,
25
- getIsItemSelected: S,
26
- hideSelectAll: N,
27
- itemMenu: p,
24
+ onSelectAll: g,
25
+ getIsItemSelected: C,
26
+ hideSelectAll: S,
27
+ itemMenu: N,
28
28
  pagination: j,
29
29
  isFetching: k,
30
- emptyState: u,
30
+ emptyState: p,
31
31
  emptySearchState: a,
32
- footer: v
32
+ footer: x
33
33
  }) {
34
34
  P("Company.TimeOff.EmployeeTable");
35
- const { t } = F("Company.TimeOff.EmployeeTable"), x = O(), n = i.length > 0 && o.length === 0, L = (e) => {
36
- y(e), e || b();
37
- }, f = s(() => {
35
+ const { t } = F("Company.TimeOff.EmployeeTable"), L = O(), n = i.length > 0 && o.length === 0, v = (e) => {
36
+ d(e), e || y();
37
+ }, u = m(() => {
38
38
  const e = t("noSearchResults");
39
39
  return function() {
40
- return /* @__PURE__ */ r(q, { message: e });
40
+ return /* @__PURE__ */ r($, { message: e });
41
41
  };
42
- }, [t]), w = s(() => n && a ? a : n ? f : u, [n, a, u, f]), D = s(
42
+ }, [t]), w = m(() => n && a ? a : n ? u : p, [n, a, p, u]), D = m(
43
43
  () => [
44
44
  {
45
45
  key: "name",
@@ -56,37 +56,37 @@ function ee({
56
56
  render: (e) => e.jobTitle ?? ""
57
57
  }
58
58
  ],
59
- ...m
59
+ ...s
60
60
  ],
61
- [t, m, l]
62
- ), R = W({
61
+ [t, s, l]
62
+ ), R = M({
63
63
  data: o,
64
64
  columns: D,
65
- itemMenu: p,
65
+ itemMenu: N,
66
66
  pagination: j,
67
67
  isFetching: k,
68
68
  emptyState: w,
69
- footer: v,
70
- ...c && { selectionMode: g, onSelect: c, onSelectAll: C, getIsItemSelected: S, hideSelectAll: N }
69
+ footer: x,
70
+ ...c && { selectionMode: T, onSelect: c, onSelectAll: g, getIsItemSelected: C, hideSelectAll: S }
71
71
  });
72
- return /* @__PURE__ */ V("div", { className: h.root, "data-has-menu": p ? !0 : void 0, children: [
73
- !T && /* @__PURE__ */ r("div", { className: h.searchContainer, children: /* @__PURE__ */ r(
74
- x.TextInput,
72
+ return /* @__PURE__ */ V("div", { className: f.root, children: [
73
+ !E && /* @__PURE__ */ r("div", { className: f.searchContainer, children: /* @__PURE__ */ r(
74
+ L.TextInput,
75
75
  {
76
76
  name: "employee-search",
77
77
  type: "search",
78
78
  label: t("searchLabel"),
79
79
  shouldVisuallyHideLabel: !0,
80
- placeholder: E ?? t("searchPlaceholder"),
80
+ placeholder: b ?? t("searchPlaceholder"),
81
81
  value: i,
82
- onChange: L,
82
+ onChange: v,
83
83
  adornmentStart: /* @__PURE__ */ r(H, { "aria-hidden": !0 })
84
84
  }
85
85
  ) }),
86
- /* @__PURE__ */ r($, { label: d ?? t("tableLabel"), ...R })
86
+ /* @__PURE__ */ r(W, { label: h ?? t("tableLabel"), ...R })
87
87
  ] });
88
88
  }
89
- function q({ message: o }) {
89
+ function $({ message: o }) {
90
90
  return /* @__PURE__ */ r(I, { title: o });
91
91
  }
92
92
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"EmployeeTable.js","sources":["../../../../../src/components/TimeOff/shared/EmployeeTable/EmployeeTable.tsx"],"sourcesContent":["import { useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport type { EmployeeTableItem, EmployeeTableProps } from './EmployeeTableTypes'\nimport styles from './EmployeeTable.module.scss'\nimport { DataView, EmptyData, useDataView } from '@/components/Common'\nimport type { useDataViewProp } from '@/components/Common/DataView/useDataView'\nimport { useComponentContext } from '@/contexts/ComponentAdapter/useComponentContext'\nimport { useI18n } from '@/i18n/I18n'\nimport { firstLastName } from '@/helpers/formattedStrings'\nimport SearchIcon from '@/assets/icons/search-lg.svg?react'\n\n/** @internal */\nexport function EmployeeTable<T extends EmployeeTableItem>({\n data,\n label,\n additionalColumns = [],\n hideJobTitle,\n searchValue,\n onSearchChange,\n onSearchClear,\n searchPlaceholder,\n hideSearch,\n selectionMode,\n onSelect,\n onSelectAll,\n getIsItemSelected,\n hideSelectAll,\n itemMenu,\n pagination,\n isFetching,\n emptyState,\n emptySearchState,\n footer,\n}: EmployeeTableProps<T>) {\n useI18n('Company.TimeOff.EmployeeTable')\n const { t } = useTranslation('Company.TimeOff.EmployeeTable')\n const Components = useComponentContext()\n\n const isSearchWithNoResults = searchValue.length > 0 && data.length === 0\n\n const handleSearchChange = (value: string) => {\n onSearchChange(value)\n if (!value) onSearchClear()\n }\n\n const defaultEmptySearch = useMemo(() => {\n const noSearchResults = t('noSearchResults')\n return function EmptySearchFallback() {\n return <DefaultEmptySearchState message={noSearchResults} />\n }\n }, [t])\n\n const resolvedEmptyState = useMemo(() => {\n if (isSearchWithNoResults && emptySearchState) {\n return emptySearchState\n }\n if (isSearchWithNoResults) {\n return defaultEmptySearch\n }\n return emptyState\n }, [isSearchWithNoResults, emptySearchState, emptyState, defaultEmptySearch])\n\n const columns = useMemo(\n () => [\n {\n key: 'name',\n title: t('name'),\n render: (item: T) => (\n <span id={`employee-name-${item.uuid}`}>\n {firstLastName({\n first_name: item.firstName,\n last_name: item.lastName,\n }) || t('unknownEmployeeFallback')}\n </span>\n ),\n },\n ...(hideJobTitle\n ? []\n : [\n {\n key: 'jobTitle' as keyof T,\n title: t('jobTitle'),\n render: (item: T) => item.jobTitle ?? '',\n },\n ]),\n ...additionalColumns,\n ],\n [t, additionalColumns, hideJobTitle],\n )\n\n const dataViewProps = useDataView<T>({\n data,\n columns,\n itemMenu,\n pagination,\n isFetching,\n emptyState: resolvedEmptyState,\n footer,\n ...(onSelect && { selectionMode, onSelect, onSelectAll, getIsItemSelected, hideSelectAll }),\n } as useDataViewProp<T>)\n\n return (\n <div className={styles.root} data-has-menu={itemMenu ? true : undefined}>\n {!hideSearch && (\n <div className={styles.searchContainer}>\n <Components.TextInput\n name=\"employee-search\"\n type=\"search\"\n label={t('searchLabel')}\n shouldVisuallyHideLabel\n placeholder={searchPlaceholder ?? t('searchPlaceholder')}\n value={searchValue}\n onChange={handleSearchChange}\n adornmentStart={<SearchIcon aria-hidden />}\n />\n </div>\n )}\n <DataView label={label ?? t('tableLabel')} {...dataViewProps} />\n </div>\n )\n}\n\nfunction DefaultEmptySearchState({ message }: { message: string }) {\n return <EmptyData title={message} />\n}\n"],"names":["EmployeeTable","data","label","additionalColumns","hideJobTitle","searchValue","onSearchChange","onSearchClear","searchPlaceholder","hideSearch","selectionMode","onSelect","onSelectAll","getIsItemSelected","hideSelectAll","itemMenu","pagination","isFetching","emptyState","emptySearchState","footer","useI18n","useTranslation","Components","useComponentContext","isSearchWithNoResults","handleSearchChange","value","defaultEmptySearch","useMemo","noSearchResults","jsx","DefaultEmptySearchState","resolvedEmptyState","columns","item","firstLastName","dataViewProps","useDataView","jsxs","styles","SearchIcon","DataView","message","EmptyData"],"mappings":"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"}
1
+ {"version":3,"file":"EmployeeTable.js","sources":["../../../../../src/components/TimeOff/shared/EmployeeTable/EmployeeTable.tsx"],"sourcesContent":["import { useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport type { EmployeeTableItem, EmployeeTableProps } from './EmployeeTableTypes'\nimport styles from './EmployeeTable.module.scss'\nimport { DataView, EmptyData, useDataView } from '@/components/Common'\nimport type { useDataViewProp } from '@/components/Common/DataView/useDataView'\nimport { useComponentContext } from '@/contexts/ComponentAdapter/useComponentContext'\nimport { useI18n } from '@/i18n/I18n'\nimport { firstLastName } from '@/helpers/formattedStrings'\nimport SearchIcon from '@/assets/icons/search-lg.svg?react'\n\n/** @internal */\nexport function EmployeeTable<T extends EmployeeTableItem>({\n data,\n label,\n additionalColumns = [],\n hideJobTitle,\n searchValue,\n onSearchChange,\n onSearchClear,\n searchPlaceholder,\n hideSearch,\n selectionMode,\n onSelect,\n onSelectAll,\n getIsItemSelected,\n hideSelectAll,\n itemMenu,\n pagination,\n isFetching,\n emptyState,\n emptySearchState,\n footer,\n}: EmployeeTableProps<T>) {\n useI18n('Company.TimeOff.EmployeeTable')\n const { t } = useTranslation('Company.TimeOff.EmployeeTable')\n const Components = useComponentContext()\n\n const isSearchWithNoResults = searchValue.length > 0 && data.length === 0\n\n const handleSearchChange = (value: string) => {\n onSearchChange(value)\n if (!value) onSearchClear()\n }\n\n const defaultEmptySearch = useMemo(() => {\n const noSearchResults = t('noSearchResults')\n return function EmptySearchFallback() {\n return <DefaultEmptySearchState message={noSearchResults} />\n }\n }, [t])\n\n const resolvedEmptyState = useMemo(() => {\n if (isSearchWithNoResults && emptySearchState) {\n return emptySearchState\n }\n if (isSearchWithNoResults) {\n return defaultEmptySearch\n }\n return emptyState\n }, [isSearchWithNoResults, emptySearchState, emptyState, defaultEmptySearch])\n\n const columns = useMemo(\n () => [\n {\n key: 'name',\n title: t('name'),\n render: (item: T) => (\n <span id={`employee-name-${item.uuid}`}>\n {firstLastName({\n first_name: item.firstName,\n last_name: item.lastName,\n }) || t('unknownEmployeeFallback')}\n </span>\n ),\n },\n ...(hideJobTitle\n ? []\n : [\n {\n key: 'jobTitle' as keyof T,\n title: t('jobTitle'),\n render: (item: T) => item.jobTitle ?? '',\n },\n ]),\n ...additionalColumns,\n ],\n [t, additionalColumns, hideJobTitle],\n )\n\n const dataViewProps = useDataView<T>({\n data,\n columns,\n itemMenu,\n pagination,\n isFetching,\n emptyState: resolvedEmptyState,\n footer,\n ...(onSelect && { selectionMode, onSelect, onSelectAll, getIsItemSelected, hideSelectAll }),\n } as useDataViewProp<T>)\n\n return (\n <div className={styles.root}>\n {!hideSearch && (\n <div className={styles.searchContainer}>\n <Components.TextInput\n name=\"employee-search\"\n type=\"search\"\n label={t('searchLabel')}\n shouldVisuallyHideLabel\n placeholder={searchPlaceholder ?? t('searchPlaceholder')}\n value={searchValue}\n onChange={handleSearchChange}\n adornmentStart={<SearchIcon aria-hidden />}\n />\n </div>\n )}\n <DataView label={label ?? t('tableLabel')} {...dataViewProps} />\n </div>\n )\n}\n\nfunction DefaultEmptySearchState({ message }: { message: string }) {\n return <EmptyData title={message} />\n}\n"],"names":["EmployeeTable","data","label","additionalColumns","hideJobTitle","searchValue","onSearchChange","onSearchClear","searchPlaceholder","hideSearch","selectionMode","onSelect","onSelectAll","getIsItemSelected","hideSelectAll","itemMenu","pagination","isFetching","emptyState","emptySearchState","footer","useI18n","useTranslation","Components","useComponentContext","isSearchWithNoResults","handleSearchChange","value","defaultEmptySearch","useMemo","noSearchResults","jsx","DefaultEmptySearchState","resolvedEmptyState","columns","item","firstLastName","dataViewProps","useDataView","jsxs","styles","SearchIcon","DataView","message","EmptyData"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- const o = "_root_1m6sr_1", r = "_searchContainer_1m6sr_12", t = {
1
+ const o = "_root_fokkf_1", t = "_searchContainer_fokkf_8", r = {
2
2
  root: o,
3
- searchContainer: r
3
+ searchContainer: t
4
4
  };
5
5
  export {
6
- t as default,
6
+ r as default,
7
7
  o as root,
8
- r as searchContainer
8
+ t as searchContainer
9
9
  };
10
10
  //# sourceMappingURL=EmployeeTable.module.scss.js.map
@@ -14,6 +14,8 @@
14
14
  export interface UnstableFeatures {
15
15
  /** Enables recording past payments to contractors within the `ContractorManagement` flows. */
16
16
  historicalPayments?: boolean;
17
+ /** Enables the in-development regular-rate-of-pay experience for editing an employee's payroll. */
18
+ payrollRegularRateOfPay?: boolean;
17
19
  }
18
20
  /**
19
21
  * React context backing {@link useUnstableFeature}.