targo-frontend/src/stores/expense-store.ts
Nicolas Drolet 13c339953f feat(timesheet): add shift overlap verification to shift entries
Also refactor mobile UI/UX for timesheet: reduced header bloat, made only shifts scrollable, added left or right swipe to travel between pay periods, showing default 'no data' message when beyond 6-month-back 1-month-forward timesheet scope.
2025-12-18 10:05:31 -05:00

65 lines
2.3 KiB
TypeScript

import { date } from "quasar";
import { computed, ref } from "vue";
import { defineStore } from "pinia";
import { useTimesheetStore } from "src/stores/timesheet-store";
import { Expense } from "src/modules/timesheets/models/expense.models";
import { ExpenseService } from "src/modules/timesheets/services/expense-service";
export const useExpensesStore = defineStore('expenses', () => {
const timesheet_store = useTimesheetStore();
const is_open = ref(false);
const is_loading = ref(false);
const is_showing_create_form = ref(true);
const mode = ref<'create' | 'update' | 'delete'>('create');
const current_expense = ref<Expense>(new Expense(date.formatDate(new Date(), 'YYYY-MM-DD')));
const initial_expense = ref<Expense>(new Expense(date.formatDate(new Date(), 'YYYY-MM-DD')));
const is_save_disabled = computed(() => JSON.stringify(current_expense.value) === JSON.stringify(initial_expense.value))
const open = (): void => {
is_open.value = true;
if (timesheet_store.pay_period !== undefined) {
current_expense.value = new Expense(date.formatDate(new Date(), 'YYYY-MM-DD'));
initial_expense.value = new Expense(date.formatDate(new Date(), 'YYYY-MM-DD'));
}
mode.value = 'create';
}
const close = () => {
is_open.value = false;
is_showing_create_form.value = true;
};
const upsertExpense = async (expense: Expense): Promise<boolean> => {
try {
if (expense.id < 0) {
const data = await ExpenseService.createExpense(expense);
return data.success;
}
const data = await ExpenseService.updateExpense(expense);
return data.success;
} catch (err) {
// setErrorFrom(err);
console.error(err);
return false;
}
};
const deleteExpenseById = async (expense_id: number): Promise<boolean> => {
const data = await ExpenseService.deleteExpenseById(expense_id);
return data.success;
}
return {
is_open,
is_loading,
is_showing_create_form,
mode,
current_expense,
initial_expense,
is_save_disabled,
open,
upsertExpense,
deleteExpenseById,
close,
};
});