import { ref } from 'vue'; import { defineStore } from 'pinia'; import { unwrapAndClone } from 'src/utils/unwrap-and-clone'; import { timesheetApprovalService } from 'src/modules/timesheet-approval/services/timesheet-approval-service'; import { timesheetService } from 'src/modules/timesheets/services/timesheet-service'; import type { TimesheetOverview } from "src/modules/timesheet-approval/models/timesheet-overview.models"; import type { PayPeriod } from 'src/modules/shared/models/pay-period.models'; import type { Timesheet } from 'src/modules/timesheets/models/timesheet.models'; import type { TimesheetApprovalCSVReportFilters } from 'src/modules/timesheet-approval/models/timesheet-approval-csv-report.models'; export const useTimesheetStore = defineStore('timesheet', () => { const is_loading = ref(false); const pay_period = ref(); const timesheets = ref([]); const initial_timesheets = ref([]); const pay_period_overviews = ref([]); const is_details_dialog_open = ref(false); const selected_employee_name = ref(); const current_pay_period_overview = ref(); const search_filter = ref(''); const is_approval_grid_mode = ref(true); const pay_period_report = ref(); const getPayPeriodByDateOrYearAndNumber = async (date?: string): Promise => { try { if (date !== undefined) { pay_period.value = await timesheetService.getPayPeriodByDate(date); } else if (pay_period.value !== undefined) { pay_period.value = await timesheetService.getPayPeriodByYearAndPeriodNumber(pay_period.value.pay_year, pay_period.value.pay_period_no); } else return false; return true; } catch (error) { console.error('Could not get current pay period: ', error); pay_period.value = undefined; pay_period_overviews.value = []; //TODO: More in-depth error-handling here return false; } }; const getTimesheetOverviews = async (): Promise => { is_loading.value = true; try { if (pay_period.value === undefined) { is_loading.value = false; return false; } const response = await timesheetApprovalService.getPayPeriodOverviews(pay_period.value.pay_year, pay_period.value.pay_period_no); pay_period_overviews.value = response.employees_overview; is_loading.value = false; return true; } catch (error) { console.error('There was an error retrieving Employee Pay Period overviews: ', error); pay_period_overviews.value = []; // TODO: More in-depth error-handling here is_loading.value = false; return false; } }; const getTimesheetsByOptionalEmployeeEmail = async (employee_email?: string) => { if (pay_period.value === undefined) return; is_loading.value = true; let response; try { if (employee_email) { response = await timesheetService.getTimesheetsByPayPeriodAndOptionalEmail(pay_period.value.pay_year, pay_period.value.pay_period_no, employee_email); } else { response = await timesheetService.getTimesheetsByPayPeriodAndOptionalEmail(pay_period.value.pay_year, pay_period.value.pay_period_no); } selected_employee_name.value = response.employee_fullname; timesheets.value = response.timesheets; initial_timesheets.value = unwrapAndClone(timesheets.value); is_loading.value = false; } catch (error) { console.error('There was an error retrieving timesheet details for this employee: ', error); // TODO: More in-depth error-handling here timesheets.value = []; is_loading.value = false; } }; const getPayPeriodReportByYearAndPeriodNumber = async (year: number, period_number: number, report_filters?: TimesheetApprovalCSVReportFilters) => { try { const response = await timesheetApprovalService.getPayPeriodReportByYearAndPeriodNumber( year, period_number, report_filters ); pay_period_report.value = response; return true; } catch (error) { console.error('There was an error retrieving the report CSV: ', error); // TODO: More in-depth error-handling here } return false; }; return { is_loading, is_approval_grid_mode, is_details_dialog_open, search_filter, pay_period, pay_period_overviews, current_pay_period_overview, selected_employee_name, timesheets, initial_timesheets, getPayPeriodByDateOrYearAndNumber, getTimesheetOverviews, getTimesheetsByOptionalEmployeeEmail, getPayPeriodReportByYearAndPeriodNumber, }; });