-
{{ timesheetStore.currentPayPeriod?.label }}
-
-
-
-
-
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/modules/timesheet-approval/composables/use-timesheet-approval-api.ts b/src/modules/timesheet-approval/composables/use-timesheet-approval-api.ts
new file mode 100644
index 0000000..498d70f
--- /dev/null
+++ b/src/modules/timesheet-approval/composables/use-timesheet-approval-api.ts
@@ -0,0 +1,47 @@
+import { useTimesheetStore } from "src/stores/timesheet-store";
+import { useAuthStore } from "src/stores/auth-store";
+
+export const useTimesheetApprovalApi = () => {
+ const timesheet_store = useTimesheetStore();
+ const auth_store = useAuthStore();
+
+ const getPayPeriodOverviewByDate = async (date: Date) => {
+ const success = await timesheet_store.getPayPeriodByDate(date);
+
+ if (success) {
+ const current_pay_period = timesheet_store.currentPayPeriod;
+ await timesheet_store.getTimesheetApprovalPayPeriodEmployeeOverviews(current_pay_period.pay_year, current_pay_period.pay_period_no, auth_store.user.email);
+ }
+ }
+
+ /* This method attempts to get the next or previous pay period.
+ It checks if pay period number is within a certain range, adjusts pay period and year accordingly.
+ It then requests the matching pay period object to set as current pay period from server.
+ If successful, it then requests pay period overviews from that new pay period. */
+ const getNextPayPeriodOverview = async (direction: number) => {
+ const current_pay_period = timesheet_store.currentPayPeriod;
+ let new_pay_period_no = current_pay_period.pay_period_no + direction;
+ let new_pay_year = current_pay_period.pay_year;
+
+ if (new_pay_period_no > 26) {
+ new_pay_period_no = 1;
+ new_pay_year += 1;
+ }
+
+ if (new_pay_period_no < 1) {
+ new_pay_period_no = 26;
+ new_pay_year -= 1;
+ }
+
+ const success = await timesheet_store.getPayPeriodByYearAndPeriodNumber(new_pay_year, new_pay_period_no);
+
+ if (success) {
+ await timesheet_store.getTimesheetApprovalPayPeriodEmployeeOverviews(new_pay_year, new_pay_period_no, auth_store.user.email);
+ }
+ }
+
+ return {
+ getPayPeriodOverviewByDate,
+ getNextPayPeriodOverview,
+ }
+};
\ No newline at end of file
diff --git a/src/modules/timesheet-approval/pages/timesheet-approval.vue b/src/modules/timesheet-approval/pages/timesheet-approval.vue
index ed00b1d..d6b0447 100644
--- a/src/modules/timesheet-approval/pages/timesheet-approval.vue
+++ b/src/modules/timesheet-approval/pages/timesheet-approval.vue
@@ -1,12 +1,39 @@
-
+ {{ $t('pageTitles.timeSheetValidations') }}
+
+
{{ pay_period_label.start_date }}
+
{{ $t('timeSheet.dateRangesTo') }}
+
{{ pay_period_label.end_date }}
+
\ No newline at end of file
diff --git a/src/modules/timesheet-approval/services/services-timesheet-approval.ts b/src/modules/timesheet-approval/services/services-timesheet-approval.ts
index 6303eee..a7f4c2d 100644
--- a/src/modules/timesheet-approval/services/services-timesheet-approval.ts
+++ b/src/modules/timesheet-approval/services/services-timesheet-approval.ts
@@ -1,37 +1,22 @@
import { api } from "src/boot/axios";
-import { mock_pay_periods } from "../timesheet-approval-test-constants";
+import type { PayPeriodOverview } from "../types/timesheet-approval-pay-period-overview-interface";
import type { PayPeriod } from "src/modules/shared/types/pay-period-interface";
export const timesheetApprovalService = {
- getCurrentPayPeriod: (): PayPeriod => {
- // TODO: REMOVE MOCK DATA PEFORE PUSHING TO PROD
- //let current_pay_period: PayPeriod;
- //
- // try {
- // console.log("Trying to get current pay period");
- // current_pay_period = await api.get(`/pay-periods/date/${(new Date()).toDateString()}`);
- // return current_pay_period;
- // } catch (err){
- // console.log(err);
- // }
- // console.log("failed to retrieve current pay period");
-
- return {
- "period_number": 15,
- "start_date": "2025-07-27",
- "end_date": "2025-08-09",
- "year": 2025,
- "label": "2025-07-27 → 2025-08-09"
- } as PayPeriod;
+ getPayPeriodByDate: async (date: Date): Promise
=> {
+ const response = await api.get(`pay-periods/date/${date.toISOString()}`);
+ return response.data;
},
- getAllPayPeriods: async () => {
- // TODO: REMOVE MOCK DATA PEFORE PUSHING TO PROD
- return await api.get(`/pay-periods/`) || mock_pay_periods;
+ getPayPeriodByYearAndPeriodNumber: async (year: number, period_number: number): Promise => {
+ const response = await api.get(`pay-periods/${year}/${period_number}`);
+ return response.data;
},
- getPayPeriodEmployeeOverviews: async (period_number: number) => {
+
+ getPayPeriodEmployeeOverviews: async (year: number, period_number: number, supervisor_email: string): Promise => {
// TODO: REMOVE MOCK DATA PEFORE PUSHING TO PROD
- return await api.get(`/pay-periods/${period_number}/overview`);
+ const response = await api.get(`/pay-periods/${year}/${period_number}/${supervisor_email}`);
+ return response.data;
},
};
\ No newline at end of file
diff --git a/src/modules/timesheet-approval/timesheet-approval-test-constants.ts b/src/modules/timesheet-approval/timesheet-approval-test-constants.ts
index 556bf7c..abdb8ba 100644
--- a/src/modules/timesheet-approval/timesheet-approval-test-constants.ts
+++ b/src/modules/timesheet-approval/timesheet-approval-test-constants.ts
@@ -1,287 +1,287 @@
-import type { PayPeriod } from "../shared/types/pay-period-interface";
-import type { PayPeriodEmployeeOverview } from "./types/timesheet-approval-pay-period-employee-overview-interface"
+// import type { PayPeriod } from "../shared/types/pay-period-interface";
+// import type { PayPeriodEmployeeOverview } from "./types/timesheet-approval-pay-period-employee-overview-interface"
-export const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [
- {
- "employee_id": 'EMP-001',
- "employee_name": 'Alice Johnson',
- "regular_hours": 75,
- "evening_hours": 12,
- "emergency_hours": 3,
- "overtime_hours": 5,
- "expenses": 120.50,
- "mileage": 45,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-002',
- "employee_name": 'Brian Smith',
- "regular_hours": 80,
- "evening_hours": 8,
- "emergency_hours": 0,
- "overtime_hours": 2,
- "expenses": 75.00,
- "mileage": 12,
- "is_approved": true
- },
- {
- "employee_id": 'EMP-003',
- "employee_name": 'Chloe Ramirez',
- "regular_hours": 68,
- "evening_hours": 15,
- "emergency_hours": 1,
- "overtime_hours": 0,
- "expenses": 200.00,
- "mileage": 88,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-004',
- "employee_name": 'David Lee',
- "regular_hours": 82,
- "evening_hours": 5,
- "emergency_hours": 4,
- "overtime_hours": 6,
- "expenses": 50.75,
- "mileage": 20,
- "is_approved": true
- },
- {
- "employee_id": 'EMP-005',
- "employee_name": 'Emily Carter',
- "regular_hours": 78,
- "evening_hours": 10,
- "emergency_hours": 2,
- "overtime_hours": 3,
- "expenses": 95.25,
- "mileage": 60,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-006',
- "employee_name": 'Maxime Murray Gendron',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-007',
- "employee_name": 'Marc-André Henrico',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-008',
- "employee_name": 'Jessy Sharock',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-009',
- "employee_name": 'David Richer',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-010',
- "employee_name": 'Nicolas Drolet',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-011',
- "employee_name": 'Frederick Pruneau',
- "regular_hours": 16,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-012',
- "employee_name": 'Matthieu Haineault Gervais',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-013',
- "employee_name": 'Robinson Viaud',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-014',
- "employee_name": 'Geneviève Bourdon',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-015',
- "employee_name": 'Frédérique Soulard',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-016',
- "employee_name": 'Patrick Doucet',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-017',
- "employee_name": 'Dahlia Tremblay',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-018',
- "employee_name": 'Louis Morneau',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-019',
- "employee_name": 'Michel Blais',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- }
-];
+// export const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [
+// {
+// "email": 'EMP-001',
+// "employee_name": 'Alice Johnson',
+// "regular_hours": 75,
+// "evening_hours": 12,
+// "emergency_hours": 3,
+// "overtime_hours": 5,
+// "expenses": 120.50,
+// "mileage": 45,
+// "is_approved": false
+// },
+// {
+// "email": 'EMP-002',
+// "employee_name": 'Brian Smith',
+// "regular_hours": 80,
+// "evening_hours": 8,
+// "emergency_hours": 0,
+// "overtime_hours": 2,
+// "expenses": 75.00,
+// "mileage": 12,
+// "is_approved": true
+// },
+// {
+// "email": 'EMP-003',
+// "employee_name": 'Chloe Ramirez',
+// "regular_hours": 68,
+// "evening_hours": 15,
+// "emergency_hours": 1,
+// "overtime_hours": 0,
+// "expenses": 200.00,
+// "mileage": 88,
+// "is_approved": false
+// },
+// {
+// "email": 'EMP-004',
+// "employee_name": 'David Lee',
+// "regular_hours": 82,
+// "evening_hours": 5,
+// "emergency_hours": 4,
+// "overtime_hours": 6,
+// "expenses": 50.75,
+// "mileage": 20,
+// "is_approved": true
+// },
+// {
+// "email": 'EMP-005',
+// "employee_name": 'Emily Carter',
+// "regular_hours": 78,
+// "evening_hours": 10,
+// "emergency_hours": 2,
+// "overtime_hours": 3,
+// "expenses": 95.25,
+// "mileage": 60,
+// "is_approved": false
+// },
+// {
+// "email": 'EMP-006',
+// "employee_name": 'Maxime Murray Gendron',
+// "regular_hours": 80,
+// "evening_hours": 0,
+// "emergency_hours": 0,
+// "overtime_hours": 0,
+// "expenses": 0,
+// "mileage": 0,
+// "is_approved": false
+// },
+// {
+// "email": 'EMP-007',
+// "employee_name": 'Marc-André Henrico',
+// "regular_hours": 80,
+// "evening_hours": 0,
+// "emergency_hours": 0,
+// "overtime_hours": 0,
+// "expenses": 0,
+// "mileage": 0,
+// "is_approved": false
+// },
+// {
+// "email": 'EMP-008',
+// "employee_name": 'Jessy Sharock',
+// "regular_hours": 80,
+// "evening_hours": 0,
+// "emergency_hours": 0,
+// "overtime_hours": 0,
+// "expenses": 0,
+// "mileage": 0,
+// "is_approved": false
+// },
+// {
+// "email": 'EMP-009',
+// "employee_name": 'David Richer',
+// "regular_hours": 80,
+// "evening_hours": 0,
+// "emergency_hours": 0,
+// "overtime_hours": 0,
+// "expenses": 0,
+// "mileage": 0,
+// "is_approved": false
+// },
+// {
+// "email": 'EMP-010',
+// "employee_name": 'Nicolas Drolet',
+// "regular_hours": 80,
+// "evening_hours": 0,
+// "emergency_hours": 0,
+// "overtime_hours": 0,
+// "expenses": 0,
+// "mileage": 0,
+// "is_approved": false
+// },
+// {
+// "email": 'EMP-011',
+// "employee_name": 'Frederick Pruneau',
+// "regular_hours": 16,
+// "evening_hours": 0,
+// "emergency_hours": 0,
+// "overtime_hours": 0,
+// "expenses": 0,
+// "mileage": 0,
+// "is_approved": false
+// },
+// {
+// "email": 'EMP-012',
+// "employee_name": 'Matthieu Haineault Gervais',
+// "regular_hours": 80,
+// "evening_hours": 0,
+// "emergency_hours": 0,
+// "overtime_hours": 0,
+// "expenses": 0,
+// "mileage": 0,
+// "is_approved": false
+// },
+// {
+// "email": 'EMP-013',
+// "employee_name": 'Robinson Viaud',
+// "regular_hours": 80,
+// "evening_hours": 0,
+// "emergency_hours": 0,
+// "overtime_hours": 0,
+// "expenses": 0,
+// "mileage": 0,
+// "is_approved": false
+// },
+// {
+// "email": 'EMP-014',
+// "employee_name": 'Geneviève Bourdon',
+// "regular_hours": 80,
+// "evening_hours": 0,
+// "emergency_hours": 0,
+// "overtime_hours": 0,
+// "expenses": 0,
+// "mileage": 0,
+// "is_approved": false
+// },
+// {
+// "email": 'EMP-015',
+// "employee_name": 'Frédérique Soulard',
+// "regular_hours": 80,
+// "evening_hours": 0,
+// "emergency_hours": 0,
+// "overtime_hours": 0,
+// "expenses": 0,
+// "mileage": 0,
+// "is_approved": false
+// },
+// {
+// "email": 'EMP-016',
+// "employee_name": 'Patrick Doucet',
+// "regular_hours": 80,
+// "evening_hours": 0,
+// "emergency_hours": 0,
+// "overtime_hours": 0,
+// "expenses": 0,
+// "mileage": 0,
+// "is_approved": false
+// },
+// {
+// "email": 'EMP-017',
+// "employee_name": 'Dahlia Tremblay',
+// "regular_hours": 80,
+// "evening_hours": 0,
+// "emergency_hours": 0,
+// "overtime_hours": 0,
+// "expenses": 0,
+// "mileage": 0,
+// "is_approved": false
+// },
+// {
+// "email": 'EMP-018',
+// "employee_name": 'Louis Morneau',
+// "regular_hours": 80,
+// "evening_hours": 0,
+// "emergency_hours": 0,
+// "overtime_hours": 0,
+// "expenses": 0,
+// "mileage": 0,
+// "is_approved": false
+// },
+// {
+// "email": 'EMP-019',
+// "employee_name": 'Michel Blais',
+// "regular_hours": 80,
+// "evening_hours": 0,
+// "emergency_hours": 0,
+// "overtime_hours": 0,
+// "expenses": 0,
+// "mileage": 0,
+// "is_approved": false
+// }
+// ];
-export const mock_pay_periods: PayPeriod[] = [
- {
- "period_number": 15,
- "start_date": "2025-07-27",
- "end_date": "2025-08-09",
- "year": 2025,
- "label": "2025-07-27 → 2025-08-09"
- },
- {
- "period_number": 14,
- "start_date": "2025-07-13",
- "end_date": "2025-07-26",
- "year": 2025,
- "label": "2025-07-13 → 2025-07-26"
- },
- {
- "period_number": 13,
- "start_date": "2025-06-29",
- "end_date": "2025-07-12",
- "year": 2025,
- "label": "2025-06-29 → 2025-07-12"
- },
- {
- "period_number": 12,
- "start_date": "2025-06-15",
- "end_date": "2025-06-28",
- "year": 2025,
- "label": "2025-06-15 → 2025-06-28"
- },
- {
- "period_number": 11,
- "start_date": "2025-06-01",
- "end_date": "2025-06-14",
- "year": 2025,
- "label": "2025-06-01 → 2025-06-14"
- },
- {
- "period_number": 10,
- "start_date": "2025-05-18",
- "end_date": "2025-05-31",
- "year": 2025,
- "label": "2025-05-18 → 2025-05-31"
- },
- {
- "period_number": 9,
- "start_date": "2025-05-04",
- "end_date": "2025-05-17",
- "year": 2025,
- "label": "2025-05-04 → 2025-05-17"
- },
- {
- "period_number": 8,
- "start_date": "2025-04-20",
- "end_date": "2025-05-03",
- "year": 2025,
- "label": "2025-04-20 → 2025-05-03"
- },
- {
- "period_number": 7,
- "start_date": "2025-04-06",
- "end_date": "2025-04-19",
- "year": 2025,
- "label": "2025-04-06 → 2025-04-19"
- },
- {
- "period_number": 6,
- "start_date": "2025-03-23",
- "end_date": "2025-04-05",
- "year": 2025,
- "label": "2025-03-23 → 2025-04-05"
- }
-]
+// export const mock_pay_periods: PayPeriod[] = [
+// {
+// "period_number": 15,
+// "start_date": "2025-07-27",
+// "end_date": "2025-08-09",
+// "year": 2025,
+// "label": "2025-07-27 → 2025-08-09"
+// },
+// {
+// "period_number": 14,
+// "start_date": "2025-07-13",
+// "end_date": "2025-07-26",
+// "year": 2025,
+// "label": "2025-07-13 → 2025-07-26"
+// },
+// {
+// "period_number": 13,
+// "start_date": "2025-06-29",
+// "end_date": "2025-07-12",
+// "year": 2025,
+// "label": "2025-06-29 → 2025-07-12"
+// },
+// {
+// "period_number": 12,
+// "start_date": "2025-06-15",
+// "end_date": "2025-06-28",
+// "year": 2025,
+// "label": "2025-06-15 → 2025-06-28"
+// },
+// {
+// "period_number": 11,
+// "start_date": "2025-06-01",
+// "end_date": "2025-06-14",
+// "year": 2025,
+// "label": "2025-06-01 → 2025-06-14"
+// },
+// {
+// "period_number": 10,
+// "start_date": "2025-05-18",
+// "end_date": "2025-05-31",
+// "year": 2025,
+// "label": "2025-05-18 → 2025-05-31"
+// },
+// {
+// "period_number": 9,
+// "start_date": "2025-05-04",
+// "end_date": "2025-05-17",
+// "year": 2025,
+// "label": "2025-05-04 → 2025-05-17"
+// },
+// {
+// "period_number": 8,
+// "start_date": "2025-04-20",
+// "end_date": "2025-05-03",
+// "year": 2025,
+// "label": "2025-04-20 → 2025-05-03"
+// },
+// {
+// "period_number": 7,
+// "start_date": "2025-04-06",
+// "end_date": "2025-04-19",
+// "year": 2025,
+// "label": "2025-04-06 → 2025-04-19"
+// },
+// {
+// "period_number": 6,
+// "start_date": "2025-03-23",
+// "end_date": "2025-04-05",
+// "year": 2025,
+// "label": "2025-03-23 → 2025-04-05"
+// }
+// ]
diff --git a/src/modules/timesheet-approval/types/timesheet-approval-pay-period-employee-overview-interface.ts b/src/modules/timesheet-approval/types/timesheet-approval-pay-period-employee-overview-interface.ts
index f935687..03783da 100644
--- a/src/modules/timesheet-approval/types/timesheet-approval-pay-period-employee-overview-interface.ts
+++ b/src/modules/timesheet-approval/types/timesheet-approval-pay-period-employee-overview-interface.ts
@@ -1,5 +1,5 @@
export interface PayPeriodEmployeeOverview {
- employee_id: string;
+ email: string;
employee_name: string;
regular_hours: number;
evening_hours: number;
diff --git a/src/modules/timesheet-approval/types/timesheet-approval-pay-period-overview-interface.ts b/src/modules/timesheet-approval/types/timesheet-approval-pay-period-overview-interface.ts
index 130ee40..f12b0e0 100644
--- a/src/modules/timesheet-approval/types/timesheet-approval-pay-period-overview-interface.ts
+++ b/src/modules/timesheet-approval/types/timesheet-approval-pay-period-overview-interface.ts
@@ -1,6 +1,11 @@
+import type { PayPeriodEmployeeOverview } from "./timesheet-approval-pay-period-employee-overview-interface";
+
export interface PayPeriodOverview {
- period_number: number;
- start_date: string;
- end_date: string;
+ pay_period_no: number;
+ pay_year: number;
+ payday: string;
+ period_start: string;
+ period_end: string;
label: string;
+ employees_overview: PayPeriodEmployeeOverview[];
};
\ No newline at end of file
diff --git a/src/stores/auth-store.ts b/src/stores/auth-store.ts
index f25f094..d7ba1f5 100644
--- a/src/stores/auth-store.ts
+++ b/src/stores/auth-store.ts
@@ -3,15 +3,18 @@ import { defineStore } from "pinia";
import { AuthService } from "../modules/auth/services/services-auth";
import type { User } from "src/modules/shared/types/user-interface";
-const defaultUser: User = {
- firstName: 'Unknown',
- lastName: 'Unknown',
- email: 'guest@guest.com',
- role: 'guest'
- };
+export type CompanyRole = 'guest' | 'supervisor' | 'accounting' | 'human_resources' | 'employee';
+
+const TestUsers: Record = {
+ guest: { firstName: 'Unknown', lastName: 'Unknown', email: 'guest@guest.com', role: 'guest' },
+ supervisor: { firstName: 'Robin', lastName: 'Clark', email: 'user5@example.test', role: 'supervisor' },
+ accounting: { firstName: 'Robin', lastName: 'Clark', email: 'user5@example.test', role: 'supervisor' },
+ human_resources: { firstName: 'Robin', lastName: 'Clark', email: 'user5@example.test', role: 'supervisor' },
+ employee: { firstName: 'Robin', lastName: 'Clark', email: 'user5@example.test', role: 'supervisor' },
+}
export const useAuthStore = defineStore('auth', () => {
- const user = ref(defaultUser);
+ const user = ref(TestUsers.guest);
const authError = ref("");
const isAuthorizedUser = computed(() => user.value.role !== 'guest');
@@ -27,11 +30,16 @@ export const useAuthStore = defineStore('auth', () => {
};
const logout = () => {
- user.value = defaultUser;
+ user.value = TestUsers.guest;
};
- const setUser = (currentUser: User) => {
- user.value = currentUser;
+ const setUser = (bypassRole: string) => {
+ if (bypassRole in TestUsers) {
+ user.value = TestUsers[bypassRole as CompanyRole];
+ }
+ else {
+ user.value = TestUsers.guest;
+ }
};
return { user, authError, isAuthorizedUser, login, oidcLogin, logout, setUser };
diff --git a/src/stores/timesheet-store.ts b/src/stores/timesheet-store.ts
index a6b79d3..6b202b1 100644
--- a/src/stores/timesheet-store.ts
+++ b/src/stores/timesheet-store.ts
@@ -4,229 +4,79 @@ import { timesheetApprovalService } from 'src/modules/timesheet-approval/service
import type { PayPeriod } from 'src/modules/shared/types/pay-period-interface';
import type { PayPeriodEmployeeOverview } from "src/modules/timesheet-approval/types/timesheet-approval-pay-period-employee-overview-interface";
-
-const default_current_pay_period: PayPeriod = {"period_number": 1, "start_date": "1970-01-01", "end_date": "1970-01-15", "year": 1970, "label": "1970-01-01 → 1970-01-15"};
-
-const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [
- {
- "employee_id": 'EMP-001',
- "employee_name": 'Alice Johnson',
- "regular_hours": 75,
- "evening_hours": 12,
- "emergency_hours": 3,
- "overtime_hours": 5,
- "expenses": 120.50,
- "mileage": 45,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-002',
- "employee_name": 'Brian Smith',
- "regular_hours": 80,
- "evening_hours": 8,
- "emergency_hours": 0,
- "overtime_hours": 2,
- "expenses": 75.00,
- "mileage": 12,
- "is_approved": true
- },
- {
- "employee_id": 'EMP-003',
- "employee_name": 'Chloe Ramirez',
- "regular_hours": 68,
- "evening_hours": 15,
- "emergency_hours": 1,
- "overtime_hours": 0,
- "expenses": 200.00,
- "mileage": 88,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-004',
- "employee_name": 'David Lee',
- "regular_hours": 82,
- "evening_hours": 5,
- "emergency_hours": 4,
- "overtime_hours": 6,
- "expenses": 50.75,
- "mileage": 20,
- "is_approved": true
- },
- {
- "employee_id": 'EMP-005',
- "employee_name": 'Emily Carter',
- "regular_hours": 78,
- "evening_hours": 10,
- "emergency_hours": 2,
- "overtime_hours": 3,
- "expenses": 95.25,
- "mileage": 60,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-006',
- "employee_name": 'Maxime Murray Gendron',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 20000,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-007',
- "employee_name": 'Marc-André Henrico',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-008',
- "employee_name": 'Jessy Sharock',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-009',
- "employee_name": 'David Richer',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-010',
- "employee_name": 'Nicolas Drolet',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-011',
- "employee_name": 'Frederick Pruneau',
- "regular_hours": 16,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-012',
- "employee_name": 'Matthieu Haineault Gervais',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-013',
- "employee_name": 'Robinson Viaud',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-014',
- "employee_name": 'Geneviève Bourdon',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-015',
- "employee_name": 'Frédérique Soulard',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-016',
- "employee_name": 'Patrick Doucet',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-017',
- "employee_name": 'Dahlia Tremblay',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-018',
- "employee_name": 'Louis Morneau',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- },
- {
- "employee_id": 'EMP-019',
- "employee_name": 'Michel Blais',
- "regular_hours": 80,
- "evening_hours": 0,
- "emergency_hours": 0,
- "overtime_hours": 0,
- "expenses": 0,
- "mileage": 0,
- "is_approved": false
- }
-];
+const default_pay_period: PayPeriod = {
+ pay_period_no: -1,
+ period_start: '',
+ period_end: '',
+ payday: '',
+ pay_year: -1,
+ label: ''
+ };
export const useTimesheetStore = defineStore('timesheet', () => {
- const payPeriods = ref([]);
- const currentPayPeriod = ref(default_current_pay_period);
- const payPeriodEmployeeOverviews = ref(mock_pay_period_employee_overviews);
+ const currentPayPeriod = ref(default_pay_period);
+ const payPeriodEmployeeOverviews = ref([]);
+ const isLoading = ref(false);
- const getCurrentPayPeriod = () => {
- currentPayPeriod.value = timesheetApprovalService.getCurrentPayPeriod();
- }
+ const getPayPeriodByDate = async (date: Date): Promise => {
+ isLoading.value = true;
- return { payPeriods, currentPayPeriod, payPeriodEmployeeOverviews, getCurrentPayPeriod};
+ try {
+ const response = await timesheetApprovalService.getPayPeriodByDate(date);
+ currentPayPeriod.value = response;
+ isLoading.value = false;
+
+ return true;
+ } catch(error){
+ console.error('Could not get current pay period: ', error );
+ //TODO: More in-depth error-handling here
+ }
+
+ isLoading.value = false;
+
+ return false;
+ };
+
+ const getPayPeriodByYearAndPeriodNumber = async (year: number, period_number: number): Promise => {
+ isLoading.value = true;
+
+ try {
+ const response = await timesheetApprovalService.getPayPeriodByYearAndPeriodNumber(year, period_number);
+ currentPayPeriod.value = response;
+ isLoading.value = false;
+
+ return true;
+ } catch(error){
+ console.error('Could not get current pay period: ', error );
+ //TODO: More in-depth error-handling here
+ }
+
+ isLoading.value = false;
+
+ return false;
+ };
+
+ const getTimesheetApprovalPayPeriodEmployeeOverviews = async (pay_year: number, period_number: number, supervisor_email: string) => {
+ isLoading.value = true;
+
+ try {
+ const response = await timesheetApprovalService.getPayPeriodEmployeeOverviews(pay_year, period_number, supervisor_email);
+ payPeriodEmployeeOverviews.value = response.employees_overview;
+ } catch (error) {
+ console.error('There was an error retrieving Employee Pay Period overviews: ', error);
+ payPeriodEmployeeOverviews.value = [];
+ // TODO: trigger an alert window with an error message here!
+ }
+
+ isLoading.value = false;
+ };
+
+ return {
+ currentPayPeriod,
+ payPeriodEmployeeOverviews,
+ isLoading,
+ getPayPeriodByDate,
+ getPayPeriodByYearAndPeriodNumber,
+ getTimesheetApprovalPayPeriodEmployeeOverviews,
+ };
});
diff --git a/src/utils/has-required-role.ts b/src/utils/has-required-role.ts
deleted file mode 100644
index dbd7056..0000000
--- a/src/utils/has-required-role.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { useAuthStore } from "src/stores/auth-store";
-
-export const hasRequiredRole = (...requiredRoles: string[] ) => {
- const currentUserRole = useAuthStore().user.role;
-
- return requiredRoles.includes(currentUserRole);
-};
\ No newline at end of file
diff --git a/src/utils/pay-period-calculator.ts b/src/utils/pay-period-calculator.ts
new file mode 100644
index 0000000..36adb38
--- /dev/null
+++ b/src/utils/pay-period-calculator.ts
@@ -0,0 +1,16 @@
+import { date } from 'quasar';
+
+const anchor_date: Date = new Date('2023-12-17');
+
+export const getCurrentPayPeriod = (today = new Date()): number => {
+ const period_length = 14; // days
+ const periods_per_year = 26;
+
+ const days_since_anchor = date.getDateDiff(today, anchor_date, 'days');
+ const periods_since_anchor = Math.floor(days_since_anchor / period_length);
+
+ const current_period = (periods_since_anchor % periods_per_year) + 1;
+
+ console.log(current_period);
+ return current_period;
+}