fix(timesheets): fix backend return to send an array of expenses with total mileage and total expense
This commit is contained in:
parent
4d905c905e
commit
a750f79107
|
|
@ -8,6 +8,7 @@ const WEEK_IN_MS = 7 * 24 * 60 * 60 * 1000;
|
||||||
le calcul est 1/20 des 4 dernières semaines, précédent la semaine incluant le férier.
|
le calcul est 1/20 des 4 dernières semaines, précédent la semaine incluant le férier.
|
||||||
Un maximum de 08h00 est allouable pour le férier
|
Un maximum de 08h00 est allouable pour le férier
|
||||||
Un maximum de 40hrs par semaine est retenue pour faire le calcul.
|
Un maximum de 40hrs par semaine est retenue pour faire le calcul.
|
||||||
|
le bank-code à soumettre à Desjardins doit être le G104
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,6 @@ export class ExpenseDto {
|
||||||
amount: number;
|
amount: number;
|
||||||
mileage: number;
|
mileage: number;
|
||||||
comment: string;
|
comment: string;
|
||||||
total_mileage: number;
|
|
||||||
total_expense: number;
|
|
||||||
is_approved: boolean;
|
is_approved: boolean;
|
||||||
supervisor_comment: string;
|
supervisor_comment: string;
|
||||||
}
|
}
|
||||||
|
|
@ -33,10 +31,9 @@ export class DetailedShifts {
|
||||||
}
|
}
|
||||||
|
|
||||||
export class DayExpensesDto {
|
export class DayExpensesDto {
|
||||||
expense: ExpenseDto[] = [];
|
expenses: ExpenseDto[];
|
||||||
mileage: ExpenseDto[] = [];
|
total_mileage: number;
|
||||||
per_diem: ExpenseDto[] = [];
|
total_expense: number;
|
||||||
on_call: ExpenseDto[] = [];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export class WeekDto {
|
export class WeekDto {
|
||||||
|
|
|
||||||
|
|
@ -5,10 +5,9 @@ import { addDays, shortDate } from "../utils/timesheet.helpers";
|
||||||
// Factories
|
// Factories
|
||||||
export function makeEmptyDayExpenses(): DayExpensesDto {
|
export function makeEmptyDayExpenses(): DayExpensesDto {
|
||||||
return {
|
return {
|
||||||
expense: [],
|
expenses: [],
|
||||||
mileage: [],
|
total_expense: -1,
|
||||||
per_diem: [],
|
total_mileage: -1,
|
||||||
on_call: [],
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -43,10 +43,6 @@ export const EXPENSE_TYPES = {
|
||||||
export const DAY_KEYS = ['sun','mon','tue','wed','thu','fri','sat'] as const;
|
export const DAY_KEYS = ['sun','mon','tue','wed','thu','fri','sat'] as const;
|
||||||
export type DayKey = typeof DAY_KEYS[number];
|
export type DayKey = typeof DAY_KEYS[number];
|
||||||
|
|
||||||
export const EXPENSE_BUCKETS = ['expense', 'mileage'] as const;
|
|
||||||
export type ExpenseBucketKey = typeof EXPENSE_BUCKETS[number];
|
|
||||||
|
|
||||||
|
|
||||||
//shifts's hour by type
|
//shifts's hour by type
|
||||||
export type ShiftsHours = {
|
export type ShiftsHours = {
|
||||||
regular: number;
|
regular: number;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,12 @@
|
||||||
import { DayKey, DAY_KEYS, EXPENSE_BUCKETS, EXPENSE_TYPES, ExpenseBucketKey, ExpenseRow, MS_PER_HOUR, SHIFT_TYPES, ShiftRow, make_hours, ShiftsHours, ExpensesAmount } from "../types/timesheet.types";
|
import {
|
||||||
import { isBetweenUTC, dayKeyFromDate, toTimeString, round2, toUTCDateOnly, endOfDayUTC, addDays } from "./timesheet.helpers";
|
DayKey, DAY_KEYS, EXPENSE_TYPES, ExpenseRow, MS_PER_HOUR,
|
||||||
import { WeekDto, ShiftDto, ExpenseDto, TimesheetPeriodDto } from "../dtos/timesheet-period.dto";
|
SHIFT_TYPES, ShiftRow, make_hours, ShiftsHours, ExpensesAmount
|
||||||
|
} from "../types/timesheet.types";
|
||||||
|
import {
|
||||||
|
isBetweenUTC, dayKeyFromDate, toTimeString, round2,
|
||||||
|
toUTCDateOnly, endOfDayUTC, addDays
|
||||||
|
} from "./timesheet.helpers";
|
||||||
|
import { WeekDto, ShiftDto, TimesheetPeriodDto, DayExpensesDto, ExpenseDto } from "../dtos/timesheet-period.dto";
|
||||||
import { makeAmounts, makeEmptyWeek } from "../mappers/timesheet.mappers";
|
import { makeAmounts, makeEmptyWeek } from "../mappers/timesheet.mappers";
|
||||||
import { toDateString } from "src/modules/pay-periods/utils/pay-year.util";
|
import { toDateString } from "src/modules/pay-periods/utils/pay-year.util";
|
||||||
|
|
||||||
|
|
@ -25,13 +31,21 @@ export function buildWeek(
|
||||||
acc[key] = makeAmounts(); return acc;
|
acc[key] = makeAmounts(); return acc;
|
||||||
}, {} as Record<DayKey, ExpensesAmount>);
|
}, {} as Record<DayKey, ExpensesAmount>);
|
||||||
|
|
||||||
const day_expense_rows: Record<DayKey, Record<ExpenseBucketKey, ExpenseRow[]>> = DAY_KEYS.reduce((acc, key) => {
|
const day_expense_rows: Record<DayKey, DayExpensesDto> = DAY_KEYS.reduce((acc, key) => {
|
||||||
acc[key] = {
|
acc[key] = {
|
||||||
expense: [],
|
expenses: [{
|
||||||
mileage: [],
|
type: '',
|
||||||
|
amount: -1,
|
||||||
|
mileage: -1,
|
||||||
|
comment: '',
|
||||||
|
is_approved: false,
|
||||||
|
supervisor_comment: '',
|
||||||
|
}],
|
||||||
|
total_expense: -1,
|
||||||
|
total_mileage: -1,
|
||||||
};
|
};
|
||||||
return acc;
|
return acc;
|
||||||
}, {} as Record<DayKey, Record<ExpenseBucketKey, ExpenseRow[]>>);
|
}, {} as Record<DayKey, DayExpensesDto>);
|
||||||
|
|
||||||
//regroup hours per type of shifts
|
//regroup hours per type of shifts
|
||||||
const week_shifts = shifts.filter(shift => isBetweenUTC(shift.date, week_start, week_end));
|
const week_shifts = shifts.filter(shift => isBetweenUTC(shift.date, week_start, week_end));
|
||||||
|
|
@ -69,18 +83,24 @@ export function buildWeek(
|
||||||
const key = dayKeyFromDate(expense.date, true);
|
const key = dayKeyFromDate(expense.date, true);
|
||||||
const type = (expense.type || '').toUpperCase();
|
const type = (expense.type || '').toUpperCase();
|
||||||
|
|
||||||
let bucket: ExpenseBucketKey;
|
const row: ExpenseDto = {
|
||||||
|
type,
|
||||||
|
amount: round2(expense.amount ?? 0),
|
||||||
|
mileage: round2(expense.mileage ?? 0),
|
||||||
|
comment: expense.comment ?? '',
|
||||||
|
is_approved: expense.is_approved ?? true,
|
||||||
|
supervisor_comment: expense.supervisor_comment ?? '',
|
||||||
|
};
|
||||||
|
|
||||||
|
day_expense_rows[key].expenses.push(row);
|
||||||
|
|
||||||
if(type === EXPENSE_TYPES.MILEAGE) {
|
if(type === EXPENSE_TYPES.MILEAGE) {
|
||||||
bucket = 'mileage';
|
day_amounts[key].mileage += row.mileage ?? 0;
|
||||||
day_amounts[key].mileage += expense.mileage ?? 0;
|
|
||||||
} else {
|
} else {
|
||||||
bucket = 'expense';
|
day_amounts[key].expense += row.amount;
|
||||||
day_amounts[key].expense += expense.amount;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
day_expense_rows[key][bucket].push(expense);
|
all_approved = all_approved && row.is_approved;
|
||||||
all_approved = all_approved && (expense.is_approved ?? true );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const key of DAY_KEYS) {
|
for (const key of DAY_KEYS) {
|
||||||
|
|
@ -101,26 +121,9 @@ export function buildWeek(
|
||||||
|
|
||||||
//daily totals
|
//daily totals
|
||||||
const totals = day_amounts[key];
|
const totals = day_amounts[key];
|
||||||
const total_mileage = round2(totals.mileage);
|
|
||||||
const total_expense = round2(totals.expense);
|
|
||||||
|
|
||||||
const target_buckets = week.expenses[key] as Record<ExpenseBucketKey, ExpenseDto[]>;
|
day_expense_rows[key].total_mileage = round2(totals.mileage);
|
||||||
const source_buckets = day_expense_rows[key];
|
day_expense_rows[key].total_expense = round2(totals.expense);
|
||||||
|
|
||||||
for (const bucket of EXPENSE_BUCKETS) {
|
|
||||||
for (const row of source_buckets[bucket]) {
|
|
||||||
target_buckets[bucket].push({
|
|
||||||
type: (row.type || '').toUpperCase(),
|
|
||||||
amount: round2(row.amount),
|
|
||||||
mileage: round2(row.mileage ?? 0),
|
|
||||||
comment: row.comment,
|
|
||||||
is_approved: row.is_approved ?? true,
|
|
||||||
supervisor_comment: row.supervisor_comment,
|
|
||||||
total_mileage,
|
|
||||||
total_expense,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
week.is_approved = all_approved;
|
week.is_approved = all_approved;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user