diff --git a/src/routes/backoffice/humanresource/employee/+page.svelte b/src/routes/backoffice/humanresource/employee/+page.svelte index 07a3037..4d3b022 100644 --- a/src/routes/backoffice/humanresource/employee/+page.svelte +++ b/src/routes/backoffice/humanresource/employee/+page.svelte @@ -2,6 +2,7 @@ import { supabase } from "$lib/supabaseClient"; import { onMount } from "svelte"; import { writable } from "svelte/store"; + import { v4 as uuidv4 } from "uuid"; type EmployeeItem = { id: string; @@ -17,12 +18,12 @@ phone: string; mobile: string; personal_email: string; - wok_email: string; + work_email: string; permanent_address: string; temporary_address: string; job_title: string; emergency_contact_name: string; - emergency_contract_phone: string; + emergency_contact_phone: string; bank_account: string; jamsostek_id: string; npwp_id: string; @@ -34,10 +35,15 @@ created_at?: Date; }; - type POItem = { - id: number; - item_name: string; - created_at?: Date; + const EmployeeStatus = { + Active: "Active", + Inactive: "Inactive", + }; + + const EmployeeType = { + DailyWorker: "Daily Worker", + Contract: "Contract", + OutSource: "Outsource", }; let allRows: EmployeeItem[] = []; @@ -63,12 +69,12 @@ { key: "phone", title: "Phone" }, { key: "mobile", title: "Mobile" }, { key: "personal_email", title: "Personal Email" }, - { key: "wok_email", title: "Work Email" }, + { key: "work_email", title: "Work Email" }, { key: "permanent_address", title: "Permanent Address" }, { key: "temporary_address", title: "Temporary Address" }, { key: "job_title", title: "Job Title" }, { key: "emergency_contact_name", title: "Emergency Contact Name" }, - { key: "emergency_contract_phone", title: "Emergency Contact Phone" }, + { key: "emergency_contact_phone", title: "Emergency Contact Phone" }, { key: "bank_account", title: "Bank Account" }, { key: "jamsostek_id", title: "Jamsostek ID" }, { key: "npwp_id", title: "NPWP ID" }, @@ -132,13 +138,7 @@ currentPage = page; offset = (currentPage - 1) * rowsPerPage; - fetchEmployee( - null, - "created_at", - "desc", - (currentPage - 1) * rowsPerPage, - rowsPerPage, - ); + fetchEmployee(null, "created_at", "desc", currentPage - 1, rowsPerPage); } function pageRange( @@ -173,13 +173,7 @@ currentPage = page; offset = (currentPage - 1) * rowsPerPage; - fetchEmployee( - null, - "created_at", - "desc", - (currentPage - 1) * rowsPerPage, - rowsPerPage, - ); + fetchEmployee(null, "created_at", "desc", currentPage - 1, rowsPerPage); } onMount(() => { @@ -194,32 +188,34 @@ let currentEditingId: string | null = null; let newEmployeeInsert: EmployeeItem = { id: "", - employee_name: "", - employee_status: "", - location: "", - department: "", + employee_name: "AJITEST", + employee_status: EmployeeStatus.Active, + location: "Nusa Penida", + department: "IT", contract_start: new Date(), end_of_contract: new Date(), - employee_type: "", + employee_type: "Contract", date_of_birth: new Date(), - photo_url: "", - phone: "", - mobile: "", - personal_email: "", - wok_email: "", - permanent_address: "", - temporary_address: "", - job_title: "", - emergency_contact_name: "", - emergency_contract_phone: "", - bank_account: "", - jamsostek_id: "", - npwp_id: "", - remarks: "", - salary: 0, - last_edu: "", - document: "", - url: "", + photo_url: + "https://nusapenida-balitour.com/wp-content/uploads/2022/10/a-glance-nusa-penida-scaled.jpg", + phone: "08123456789", + mobile: "08123456789", + personal_email: "ajitest@example.com", + work_email: "ajitest@workmail.com", + permanent_address: "Jl. Example No. 123, Jakarta", + temporary_address: "Jl. Temporary No. 456, Jakarta", + job_title: "Software Engineer", + emergency_contact_name: "Aji Setiaji", + emergency_contact_phone: "08123456789", + bank_account: "1234567890", + jamsostek_id: "9876543210", + npwp_id: "123456789012345", + remarks: "New employee", + salary: 5000000, + last_edu: "Bachelor's Degree", + document: + "https://nusapenida-balitour.com/wp-content/uploads/2022/10/a-glance-nusa-penida-scaled.jpg", + url: "https://example.com/employee/ajitest", created_at: new Date(), }; @@ -255,12 +251,12 @@ phone: "", mobile: "", personal_email: "", - wok_email: "", + work_email: "", permanent_address: "", temporary_address: "", job_title: "", emergency_contact_name: "", - emergency_contract_phone: "", + emergency_contact_phone: "", bank_account: "", jamsostek_id: "", npwp_id: "", @@ -278,16 +274,12 @@ async function saveEmployee(event: Event) { event.preventDefault(); - const formData = new FormData(event.target as HTMLFormElement); - - // Validate form data - if (!validateForm(formData)) { - console.error("Form validation failed"); + // validate newEmployeeInsert + if (!validateForm(newEmployeeInsert)) { + alert("Please fix the form errors before submitting."); return; } - console.log("Saving Employee:", newEmployeeInsert); - if (isEditing && currentEditingId) { const { error } = await supabase .from("vb_employee") @@ -302,6 +294,8 @@ alert("Employee updated successfully!"); } } else { + newEmployeeInsert.id = uuidv4(); // Generate a new UUID for the ID + const { error } = await supabase .from("vb_employee") .insert(newEmployeeInsert); @@ -347,7 +341,7 @@ export let formErrors = writable<{ [key: string]: string }>({}); - function validateForm(formData: FormData): boolean { + function validateForm(newEmployeeInsert: EmployeeItem): boolean { const errors: { [key: string]: string } = {}; const requiredFields = [ "employee_name", @@ -355,7 +349,10 @@ ]; requiredFields.forEach((field) => { - if (!formData.get(field) || formData.get(field) === "") { + if ( + !newEmployeeInsert[field as keyof EmployeeItem] || + newEmployeeInsert[field as keyof EmployeeItem] === "" + ) { errors[field] = `${field.replace(/_/g, " ")} is required.`; } }); @@ -377,7 +374,7 @@

- 👥 + 👨‍💼 Employee

Manage your employee data here.

@@ -443,6 +440,86 @@ {row[col.key as keyof EmployeeItem]} + {:else if col.key === "employee_status"} + + {#if row[col.key as keyof EmployeeItem] === EmployeeStatus.Active} + + {EmployeeStatus.Active} + + {:else} + + {EmployeeStatus.Inactive} + + {/if} + + {:else if col.key === "employee_type"} + + {#if row[col.key as keyof EmployeeItem] === EmployeeType.DailyWorker} + + {EmployeeType.DailyWorker} + + {:else if row[col.key as keyof EmployeeItem] === EmployeeType.Contract} + + {EmployeeType.Contract} + + {:else if row[col.key as keyof EmployeeItem] === EmployeeType.OutSource} + + {EmployeeType.OutSource} + + {:else} + + Unknown + + {/if} + + {:else if col.key === "photo_url" || col.key === "document" || col.key === "url"} + + {#if row[col.key as keyof EmployeeItem]} + View + {:else} + N/A + {/if} + + {:else if col.key === "salary"} + + {row[col.key as keyof EmployeeItem] + ? new Intl.NumberFormat("id-ID", { + style: "currency", + currency: "IDR", + }).format( + row[ + col.key as keyof EmployeeItem + ] as number, + ) + : "N/A"} + + {:else if col.key === "contract_start" || col.key === "end_of_contract" || col.key === "date_of_birth"} + + {row[col.key as keyof EmployeeItem] + ? new Date( + row[ + col.key as keyof EmployeeItem + ] as string | number | Date, + ).toLocaleDateString() + : "N/A"} + {:else if col.key === "created_at"} {row[col.key as keyof EmployeeItem] @@ -529,23 +606,22 @@

{isEditing ? "Edit Employee" : "New Employee"}

-
+ + {#each formColumns as col}
+ {col.title} + + {#if col.key === "contract_start" || col.key === "end_of_contract" || col.key === "date_of_birth"} + {:else if col.key === "employee_type"} + + {:else if col.key === "employee_status"} + {:else} {/if} + {#if $formErrors[col.key]}

{$formErrors[col.key]} @@ -584,6 +683,7 @@ {/if}

{/each} +