penisularhr-ui / src / routes / app / employee / +page.server.ts
+page.server.ts
Raw
/* eslint-disable @typescript-eslint/no-explicit-any */
import { PUBLIC_BASE_API_URL } from '$env/static/public';
import { fail } from '@sveltejs/kit';

export async function load({ cookies }) {
	return {
		accessToken: cookies.get('accessToken')
	};
}

export const actions = {
	create: async ({ cookies, request, getClientAddress }) => {
		const data = await request.formData();
		const name = data.get('name');
		const origin = data.get('origin');
		const dateJoin = data.get('dateJoin');
		const dateResign = data.get('dateResign');
		const referralBy = data.get('referralBy');
		const referralFeePaidAt = data.get('referralFeePaidAt');
		const isActive = data.get('isActive');
		const basicSalary = Number(data.get('basicSalary'));
		const monthlyAllowanceAmount = Number(data.get('monthlyAllowanceAmount'));
		const annualLeave = Number(data.get('annualLeave'));
		const sickLeave = Number(data.get('sickLeave'));
		const epfRatePer = Number(data.get('epfRatePer'));
		const shouldDeductSocso = data.get('shouldDeductSocso');

		const reqBody = JSON.stringify({
			name,
			origin: origin === '' ? null : origin,
			dateJoin,
			dateResign: dateResign === '' ? null : dateResign,
			referralBy: referralBy === '' ? null : referralBy,
			referralFeePaidAt: referralFeePaidAt === '' ? null : referralFeePaidAt,
			isActive,
			basicSalary,
			monthlyAllowanceAmount,
			annualLeave,
			sickLeave,
			epfRatePer,
			shouldDeductSocso
		});

		const response = await fetch(`${PUBLIC_BASE_API_URL}/employee`, {
			body: reqBody,
			headers: {
				'Content-Type': 'application/json',
				Authorization: `Bearer ${cookies.get('accessToken')}`,
				'x-forwarded-for': getClientAddress(),
				'x-real-ip': getClientAddress()
			},
			method: 'POST'
		});

		const responseData = await response.json();

		if (responseData.statusCode) {
			return fail(responseData.statusCode, {
				id: 'inputData',
				message: JSON.stringify(responseData.message)
			});
		}

		return {
			id: 'inputData',
			message: 'Created'
		};
	},

	update: async ({ cookies, request, getClientAddress }) => {
		const data = await request.formData();

		const id = data.get('id');
		const name = data.get('name');
		const origin = data.get('origin');
		const dateJoin = data.get('dateJoin');
		const dateResign = data.get('dateResign');
		const referralBy = data.get('referralBy');
		const referralFeePaidAt = data.get('referralFeePaidAt');
		const isActive = data.get('isActive');
		const basicSalary = Number(data.get('basicSalary'));
		const monthlyAllowanceAmount = Number(data.get('monthlyAllowanceAmount'));
		const annualLeave = Number(data.get('annualLeave'));
		const sickLeave = Number(data.get('sickLeave'));
		const epfRatePer = Number(data.get('epfRatePer'));
		const shouldDeductSocso = data.get('shouldDeductSocso');

		const reqBody = JSON.stringify({
			name,
			origin: origin === '' ? null : origin,
			dateJoin,
			dateResign: dateResign === '' ? null : dateResign,
			referralBy: referralBy === '' ? null : referralBy,
			referralFeePaidAt: referralFeePaidAt === '' ? null : referralFeePaidAt,
			isActive,
			basicSalary,
			monthlyAllowanceAmount,
			annualLeave,
			sickLeave,
			epfRatePer,
			shouldDeductSocso
		});
		const response = await fetch(`${PUBLIC_BASE_API_URL}/employee/${id}`, {
			body: reqBody,
			headers: {
				'Content-Type': 'application/json',
				Authorization: `Bearer ${cookies.get('accessToken')}`,
				'x-forwarded-for': getClientAddress(),
				'x-real-ip': getClientAddress()
			},
			method: 'PATCH'
		});

		const responseData = await response.json();

		if (responseData.statusCode) {
			return fail(responseData.statusCode, {
				id: 'inputData',
				message: JSON.stringify(responseData.message)
			});
		}

		return {
			id: 'inputData',
			message: 'Updated'
		};
	},

	getTableData: async ({ cookies, request, getClientAddress }) => {
		const data = await request.formData();
		const page = data.get('page');
		const filterName = data.get('filterName');
		const filterOrigin = data.get('filterOrigin');
		const filterIsActive = data.get('filterIsActive');
		const filterReferralBy = data.get('filterReferralBy');
		const filterReferralFeePaid = data.get('filterReferralFeePaid');

		let query = `?take=10&page=${page}`;

		if (filterName) {
			query += `&name=${filterName}`;
		}

		if (filterReferralBy) {
			query += `&referralBy=${filterReferralBy}`;
		}

		if (filterIsActive) {
			query += `&isActive=${filterIsActive}`;
		}

		if (filterOrigin) {
			query += `&origin=${filterOrigin}`;
		}

		if (filterReferralFeePaid) {
			query += `&referralFeePaid=${filterReferralFeePaid}`;
		}

		try {
			const res = await fetch(`${PUBLIC_BASE_API_URL}/employee${query}`, {
				headers: {
					'Content-Type': 'application/json',
					Authorization: `Bearer ${cookies.get('accessToken')}`,
					'x-forwarded-for': getClientAddress(),
					'x-real-ip': getClientAddress()
				}
			});
			const resData = await res.json();

			if (resData.meta.itemCount === 0) {
				return fail(404, { id: 'tableData', message: 'No items available' });
			}
			const pageCount = resData.meta.pageCount;
			const hasNextPage = resData.meta.hasNextPage;
			const hasPreviousPage = resData.meta.hasPreviousPage;

			const returnData = resData.data.map((el: any) => ({
				...el,
				createdAt: new Date(el.createdAt).toISOString().split('T')[0],
				updatedAt: new Date(el.updatedAt).toISOString().split('T')[0],
				dateJoin: new Date(el.dateJoin).toISOString().split('T')[0],
				dateResign: el.dateResign ? new Date(el.dateResign).toISOString().split('T')[0] : null,
				referralFeePaidAt: el.referralFeePaidAt
					? new Date(el.referralFeePaidAt).toISOString().split('T')[0]
					: null
			}));

			return { returnData, pageCount, hasNextPage, hasPreviousPage, id: 'tableData' };
		} catch (err: any) {
			return err.message;
		}
	}
};