-
-
- {{ props.row.employee_name }}
-
-
- {{ col.value }}
- {{ col.label }}
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+ {{ message }}
+
+
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..e66f8ff
--- /dev/null
+++ b/src/modules/timesheet-approval/composables/use-timesheet-approval-api.ts
@@ -0,0 +1,13 @@
+import { useTimesheetStore } from "src/stores/timesheet-store";
+
+export const useTimesheetApprovalApi = () => {
+ const timesheetStore = useTimesheetStore();
+
+ const getTimesheetApprovalPayPeriodEmployeeOverviews = async (year: number, period_number: number, supervisor_email: string): Promise
=> {
+ await timesheetStore.getTimesheetApprovalPayPeriodEmployeeOverviews(year, period_number, supervisor_email);
+ }
+
+ return {
+ getTimesheetApprovalPayPeriodEmployeeOverviews,
+ }
+};
\ 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..30a09b6 100644
--- a/src/modules/timesheet-approval/services/services-timesheet-approval.ts
+++ b/src/modules/timesheet-approval/services/services-timesheet-approval.ts
@@ -1,21 +1,10 @@
import { api } from "src/boot/axios";
import { mock_pay_periods } from "../timesheet-approval-test-constants";
import type { PayPeriod } from "src/modules/shared/types/pay-period-interface";
+import type { PayPeriodOverview } from "../types/timesheet-approval-pay-period-overview-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",
@@ -30,8 +19,9 @@ export const timesheetApprovalService = {
return await api.get(`/pay-periods/`) || mock_pay_periods;
},
- 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..28db6c4 100644
--- a/src/modules/timesheet-approval/timesheet-approval-test-constants.ts
+++ b/src/modules/timesheet-approval/timesheet-approval-test-constants.ts
@@ -3,7 +3,7 @@ import type { PayPeriodEmployeeOverview } from "./types/timesheet-approval-pay-p
export const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [
{
- "employee_id": 'EMP-001',
+ "email": 'EMP-001',
"employee_name": 'Alice Johnson',
"regular_hours": 75,
"evening_hours": 12,
@@ -14,7 +14,7 @@ export const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [
"is_approved": false
},
{
- "employee_id": 'EMP-002',
+ "email": 'EMP-002',
"employee_name": 'Brian Smith',
"regular_hours": 80,
"evening_hours": 8,
@@ -25,7 +25,7 @@ export const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [
"is_approved": true
},
{
- "employee_id": 'EMP-003',
+ "email": 'EMP-003',
"employee_name": 'Chloe Ramirez',
"regular_hours": 68,
"evening_hours": 15,
@@ -36,7 +36,7 @@ export const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [
"is_approved": false
},
{
- "employee_id": 'EMP-004',
+ "email": 'EMP-004',
"employee_name": 'David Lee',
"regular_hours": 82,
"evening_hours": 5,
@@ -47,7 +47,7 @@ export const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [
"is_approved": true
},
{
- "employee_id": 'EMP-005',
+ "email": 'EMP-005',
"employee_name": 'Emily Carter',
"regular_hours": 78,
"evening_hours": 10,
@@ -58,7 +58,7 @@ export const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [
"is_approved": false
},
{
- "employee_id": 'EMP-006',
+ "email": 'EMP-006',
"employee_name": 'Maxime Murray Gendron',
"regular_hours": 80,
"evening_hours": 0,
@@ -69,7 +69,7 @@ export const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [
"is_approved": false
},
{
- "employee_id": 'EMP-007',
+ "email": 'EMP-007',
"employee_name": 'Marc-André Henrico',
"regular_hours": 80,
"evening_hours": 0,
@@ -80,7 +80,7 @@ export const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [
"is_approved": false
},
{
- "employee_id": 'EMP-008',
+ "email": 'EMP-008',
"employee_name": 'Jessy Sharock',
"regular_hours": 80,
"evening_hours": 0,
@@ -91,7 +91,7 @@ export const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [
"is_approved": false
},
{
- "employee_id": 'EMP-009',
+ "email": 'EMP-009',
"employee_name": 'David Richer',
"regular_hours": 80,
"evening_hours": 0,
@@ -102,7 +102,7 @@ export const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [
"is_approved": false
},
{
- "employee_id": 'EMP-010',
+ "email": 'EMP-010',
"employee_name": 'Nicolas Drolet',
"regular_hours": 80,
"evening_hours": 0,
@@ -113,7 +113,7 @@ export const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [
"is_approved": false
},
{
- "employee_id": 'EMP-011',
+ "email": 'EMP-011',
"employee_name": 'Frederick Pruneau',
"regular_hours": 16,
"evening_hours": 0,
@@ -124,7 +124,7 @@ export const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [
"is_approved": false
},
{
- "employee_id": 'EMP-012',
+ "email": 'EMP-012',
"employee_name": 'Matthieu Haineault Gervais',
"regular_hours": 80,
"evening_hours": 0,
@@ -135,7 +135,7 @@ export const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [
"is_approved": false
},
{
- "employee_id": 'EMP-013',
+ "email": 'EMP-013',
"employee_name": 'Robinson Viaud',
"regular_hours": 80,
"evening_hours": 0,
@@ -146,7 +146,7 @@ export const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [
"is_approved": false
},
{
- "employee_id": 'EMP-014',
+ "email": 'EMP-014',
"employee_name": 'Geneviève Bourdon',
"regular_hours": 80,
"evening_hours": 0,
@@ -157,7 +157,7 @@ export const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [
"is_approved": false
},
{
- "employee_id": 'EMP-015',
+ "email": 'EMP-015',
"employee_name": 'Frédérique Soulard',
"regular_hours": 80,
"evening_hours": 0,
@@ -168,7 +168,7 @@ export const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [
"is_approved": false
},
{
- "employee_id": 'EMP-016',
+ "email": 'EMP-016',
"employee_name": 'Patrick Doucet',
"regular_hours": 80,
"evening_hours": 0,
@@ -179,7 +179,7 @@ export const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [
"is_approved": false
},
{
- "employee_id": 'EMP-017',
+ "email": 'EMP-017',
"employee_name": 'Dahlia Tremblay',
"regular_hours": 80,
"evening_hours": 0,
@@ -190,7 +190,7 @@ export const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [
"is_approved": false
},
{
- "employee_id": 'EMP-018',
+ "email": 'EMP-018',
"employee_name": 'Louis Morneau',
"regular_hours": 80,
"evening_hours": 0,
@@ -201,7 +201,7 @@ export const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [
"is_approved": false
},
{
- "employee_id": 'EMP-019',
+ "email": 'EMP-019',
"employee_name": 'Michel Blais',
"regular_hours": 80,
"evening_hours": 0,
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..0877b5f 100644
--- a/src/stores/timesheet-store.ts
+++ b/src/stores/timesheet-store.ts
@@ -7,226 +7,27 @@ import type { PayPeriodEmployeeOverview } from "src/modules/timesheet-approval/t
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
- }
-];
-
export const useTimesheetStore = defineStore('timesheet', () => {
const payPeriods = ref([]);
const currentPayPeriod = ref(default_current_pay_period);
- const payPeriodEmployeeOverviews = ref(mock_pay_period_employee_overviews);
+ const payPeriodEmployeeOverviews = ref([]);
+ const isLoading = ref(false);
const getCurrentPayPeriod = () => {
currentPayPeriod.value = timesheetApprovalService.getCurrentPayPeriod();
}
- return { payPeriods, currentPayPeriod, payPeriodEmployeeOverviews, getCurrentPayPeriod};
+ const getTimesheetApprovalPayPeriodEmployeeOverviews = async (year: number, period_number: number, supervisor_email: string) => {
+ isLoading.value = true;
+ try {
+ const response = await timesheetApprovalService.getPayPeriodEmployeeOverviews(year, period_number, supervisor_email);
+ payPeriodEmployeeOverviews.value = response.employees_overview;
+ } catch (error) {
+ console.error('There was an error retrieving Employee Pay Period overviews: ', error);
+ // TODO: trigger an alert window with an error message here!
+ }
+ isLoading.value = false;
+ }
+
+ return { payPeriods, currentPayPeriod, payPeriodEmployeeOverviews, isLoading, getCurrentPayPeriod, 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;
+}