"use client"; import { FC } from "react"; import { Page, Text, View, Document, StyleSheet, Font, Image, } from "@react-pdf/renderer"; import get from "lodash.get"; import { dayDate } from "@/lib/utils/date"; import { getNumber } from "@/lib/utils/getNumber"; Font.register({ family: "Noto Sans SC", src: `${process.env.NEXT_PUBLIC_BASE_URL}/NotoSerifSC-Regular.ttf`, }); Font.register({ family: "roboto", src: `${process.env.NEXT_PUBLIC_BASE_URL}/Roboto-Medium.ttf`, }); Font.register({ family: "roboto-light", src: `${process.env.NEXT_PUBLIC_BASE_URL}/Roboto-Light.ttf`, }); // Create styles const styles = StyleSheet.create({ chinese: { fontFamily: "Noto Sans SC", // Font Chinese fontSize: 10, }, chineseFont: { fontFamily: "Noto Sans SC", }, page: { padding: 20, fontFamily: "roboto", fontSize: 10, display: "flex", flexDirection: "column", }, title: { fontSize: 10, textAlign: "center", fontWeight: "bold", width: 80, }, thead: { fontSize: 12, textAlign: "center", fontWeight: "bold", display: "flex", flexDirection: "row", alignItems: "center", }, section: { marginBottom: 10, }, table: { width: "auto", borderStyle: "solid", borderWidth: 1, marginBottom: 10, }, tableRow: { flexDirection: "row", }, tableCol: { borderStyle: "solid", borderWidth: 1, padding: 5, flex: 1, }, bold: { fontWeight: "bold", }, image: { height: 50, // Atur tinggi gambar marginBottom: 5, alignSelf: "center", }, }); const extractMajors = (data: Array<{ Major: { Major: string } }>): string => { if (!data?.length) return ""; return data.map((entry) => get(entry, "Major.Major")).join(", "); }; const splitText = ( input: string ): { firstPart: string; secondPart: string } => { const match = input.match(/^(.+?)\s+([^\s]+)$/); // Match "text text" return { firstPart: match?.[1] || "", secondPart: match?.[2] || "", }; }; const handleInput = (input: string, mode: "cn" | "id" = "id"): string => { const result = splitText(input); if (mode === "cn") { // Return only the Chinese part return result.secondPart; } else if (mode === "id") { // Return only the non-Chinese part return result.firstPart; } return ""; // Return empty string if the condition doesn't match the mode }; // Create Document Component const DocumentMPR: FC = ({ data, onRender }) => { return ( { if (typeof onRender === "function") { onRender(); } }} > JULONG GROUP INDONESIA FORMULIR {" "} 表单 Nomor Dokumen {" "} 文件编码 {get(data, "document_number")} Revisi 修正 1 Tanggal Berlaku {" "} 有效期 {dayDate(get(data, "document_date"))} Halaman {" "} 页面 1 dari 1 KEBUTUHAN TENAGA KERJA {" "} 员工需求 DATA KEBUTUHAN {" "} 需求信息: {/* BODY */} Jumlah kebutuhan {" "} 需求人数 : {getNumber(get(data, "male_needs"))} ( Pria{" "} 男{" "} {" "} ) dan{" "} /atau{" "} {" "} {getNumber(get(data, "female_needs"))} ( Wanita{" "} 女{" "} {" "} ) Status 身份 :{" "} {get(data, "is_replacement") === "penggantian" ? "Penambahan" : "Penggantian"} , karena {handleInput(get(data, "request_category.Name"), "id")}{" "} {get(data, "is_replacement") === "penggantian" ? "增加" : "代替"}, {handleInput(get(data, "request_category.Name"), "cn")} Usia 年龄 : Minimal 最小 {get(data, "minimum_age")} Tahun / Maksimal 最大 {get(data, "maximum_age")} Tahun {/* Status Perkawinan */} Status perkawinan{" "} 婚姻状况 :{" "} {get(data, "marital_status") === "no rules" ? "Tidak ada masalah" : get(data, "marital_status") === "single" ? "Single" : get(data, "marital_status") === "married" ? "Maried" : "-"}{" "} {get(data, "marital_status") === "no rules" ? "没问题" : get(data, "marital_status") === "single" ? "未婚" : get(data, "marital_status") === "married" ? "已婚" : "-"} {/* PT/Est/Dept */} PT/Est./Dept.{" "} 区域/部门 : {get(data, "organization_name")} {/* Jabatan */} Jabatan{" "} 职位 : {get(data, "job_name")} {/* Golongan */} Golongan{" "} 等级 : {get(data, "job_level_name")} {/* Harapan Tanggal Masuk Kerja */} Harapan tanggal masuk kerja{" "} 入职时间期望 : {dayDate(get(data, "expected_date"))} SPESIFIKASI JABATAN{" "} 职位规格 Pendidikan minimal{" "} 最低学历 : {get(data, "minimum_education")} {/* Jurusan */} Jurusan{" "} 专业 : {extractMajors(get(data, "request_majors"))} {/* Pengalaman Kerja */} Pengalaman kerja{" "} 工作经验 : {get(data, "experiences")} {/* Kualifikasi yang Dibutuhkan */} Kualifikasi yang dibutuhkan{" "} 任职条件 : {get(data, "required_qualification")} Kemampuan khusus{" "} 特殊技能 : {/* Sertifikat */} - Sertifikat{" "} 证书 : {get(data, "certificate")} {/* Komputer */} - Komputer{" "} 电脑 : {get(data, "computer_skill")} {/* Bahasa */} - Bahasa{" "} 语言 : {get(data, "language_skill")} {/* Lainnya */} - Lainnya{" "} 其他 : {get(data, "other_skill")} {/* Uraian Pekerjaan */} Uraian pekerjaan / Job desc{" "} 岗位职责 : {get(data, "jobdesc")} {/* Rentang Gaji/Bulan */} Rentang gaji/bulan{" "} 月薪范围 : {get(data, "salary_min")} - {get(data, "salary_max")}{" "} {/* FOOTER */} Nama {" "} 姓名 : {get(data, "requestor_name")} Posisi {" "} 职位 : Tanggal {" "} 日期 : Disetujui oleh {" "} 已批准: Nama {" "} 姓名 : {get(data, "department_head_name")} Manager/Dept.Head {" "} 经理/部门领导 {/* ROW */} Nama {" "} 姓名 : {get(data, "vp_gm_director_name")} VP/GM/Direktur {" "} 总经理/董事/总监 {/* ROW */} CEO *TTD CEO jika luar budget {" "} *预算外需求需要CEO批 Diverifikasi oleh {" "} 已审核: Nama {" "} 姓名 : {get(data, "hrd_ho_unit_name")} HRD HO/Unit {" "} 总部/区域人力 ); }; export default DocumentMPR;