import { defineStore } from "pinia"; import { ref } from "vue"; import http from "@/plugins/http"; import config from "@/app.config"; import { useCounterMixin } from "@/stores/mixin"; import type { QTableProps } from "quasar"; import type { OptionData, TypeLeave, } from "@/modules/05_leave/interface/index/main"; import type { ListLeave, ListLeaveTable, } from "@/modules/05_leave/interface/response/leave"; import type { DataOption } from "../14_IDP/interface/Main"; const mixin = useCounterMixin(); const { date2Thai, messageError, showLoader, hideLoader } = mixin; const type = ref("00000000-0000-0000-0000-000000000000"); const status = ref("ALL"); export const useLeaveStore = defineStore("Leave", () => { const tabValue = ref("calendar"); const typeLeave = ref(""); const LeaveType = ref("0"); const LeaveStatus = ref("0"); const fiscalYearyear = ref(new Date().getFullYear()); const rows = ref([]); /** * function เรียกข้อมูลรายการลา Table * @param data ข้อมูลรายการลา Table */ async function fetchListLeave(data: ListLeave[]) { let datalist: ListLeaveTable[] = data.map((e: ListLeave) => ({ id: e.id, leaveTypeName: e.leaveTypeName, leaveTypeId: e.leaveTypeId, fullName: e.fullName, dateSendLeave: e.dateSendLeave && date2Thai(e.dateSendLeave, false, true), dateLeave: e.leaveStartDate && e.leaveEndDate ? e.leaveStartDate === e.leaveEndDate ? date2Thai(e.leaveEndDate) : `${date2Thai(e.leaveStartDate)}${ e.leaveRange !== "ALL" ? ` (${converstType(e.leaveRange)})` : "" } - ${date2Thai(e.leaveEndDate)}${ e.leaveRangeEnd !== "ALL" ? ` (${converstType(e.leaveRangeEnd)})` : "" }` : "-", status: e.status, hajjDayStatus: e.hajjDayStatus, leaveRange: e.leaveRange, leaveRangeEnd: e.leaveRangeEnd, leaveSubTypeName: e.leaveSubTypeName, statusConvert: convertStatud(e.status), isDelete: e.isDelete, })); rows.value = datalist; } //ฟังก์ชั่นแปลง Status function convertStatud(val: string) { switch (val) { case "DRAFT": return "แบบร่าง"; case "NEW": return "ใหม่"; case "PENDING": return "กำลังดำเนินการ"; case "APPROVE": return "อนุมัติ"; case "REJECT": return "ไม่อนุมัติ"; case "DELETING": return "กำลังดำเนินการยกเลิก"; case "DELETE": return "ยกเลิกสำเร็จ"; } } /** ประเภทการลา */ const typeOptions = ref([]); const typeId = ref(""); const typeOptionsMain = ref([]); const typeOptionsAdd = ref([]); /** รายการข้อมูลประเภทใบลา */ const options = ref([]); /** * function เรียกข้อมูลประเภทการลา * @param data ประเภทการลา */ async function fetchLeaveType(data: TypeLeave[]) { typeOptionsMain.value = [ { id: "00000000-0000-0000-0000-000000000000", name: "ทั้งหมด", code: "LV-000", }, ]; const optionType = data.map((e: TypeLeave) => ({ id: e.id, name: e.name, code: e.code, })); typeOptionsMain.value.push(...optionType); typeOptions.value = typeOptionsMain.value; typeOptionsAdd.value = []; typeOptionsAdd.value.push(...optionType); options.value = typeOptionsAdd.value; } /** สถานะของการลา */ const statusOptionsMain = ref([ { id: "ALL", name: "ทั้งหมด" }, { id: "DRAFT", name: "แบบร่าง" }, { id: "NEW", name: "ใหม่" }, { id: "PENDING", name: "กำลังดำเนินการ" }, { id: "APPROVE", name: "อนุญาต " }, { id: "REJECT", name: "ไม่อนุญาต" }, { id: "DELETE", name: "ยกเลิก" }, ]); const statusOptions = ref(statusOptionsMain.value); /** * function ต้นหาข้อมูลของ Option * @param val ค่าที่ต้องการฟิลเตอร์ * @param update อัพเดทค่า * @param refData ดาต้าที่ต้องการฟิลเตอร์ */ function filterOption(val: any, update: Function, refData: string) { switch (refData) { case "LeaveTypeOption": type.value = ""; update(() => { typeOptions.value = typeOptionsMain.value.filter( (v: any) => v.name.indexOf(val) > -1 ); }); break; case "LeaveStatusOption": status.value = ""; update(() => { statusOptions.value = statusOptionsMain.value.filter( (v: any) => v.name.indexOf(val) > -1 ); }); break; default: break; } } const rangeOptions = ref([ { id: "ALL", name: "เต็มวัน", }, { id: "MORNING", name: "ครึ่งวันเช้า", }, { id: "AFTERNOON", name: "ครึ่งวันบ่าย", }, ]); function converstType(val: string) { switch (val) { case "ALL": return ""; case "MORNING": return "ครึ่งวันเช้า"; case "AFTERNOON": return "ครึ่งวันบ่าย"; } } /** รายการประเภทการลาของ ลาไปศึกษา ฝึกอบรม ปฎิบัติการวิจัย หรือดูงาน*/ const optionsSpecific = ref([ "ศึกษาต่อ", "ฝึกอบรม", "ปฎิบัติการวิจัย", "ดูงาน", ]); /** รายการประเภทการลาของ ลาอุปสมบทหรือลาประกอบพิธีฮัจญ์*/ const optionsOrdination = ref(["ลาอุปสมบท", "ลาประกอบพิธีฮัจญ์"]); /** data table filter & column ของรายการลา */ const visibleColumns = ref([ "no", "leaveTypeName", "dateSendLeave", "status", "dateLeave", ]); const columns = ref([ { name: "no", align: "left", label: "ลำดับ", sortable: true, field: "no", headerStyle: "font-size: 14px", style: "font-size: 14px; width:5%;", }, { name: "leaveTypeName", align: "left", label: "ประเภทการลา", sortable: true, field: "leaveTypeName", headerStyle: "font-size: 14px", style: "font-size: 14px; width:15%;", }, { name: "dateLeave", align: "left", label: "วันที่ลา", sortable: true, field: "dateLeave", headerStyle: "font-size: 14px", style: "font-size: 14px; width:15%;", }, { name: "dateSendLeave", align: "left", label: "วันที่ยื่นใบลา", sortable: true, field: "dateSendLeave", headerStyle: "font-size: 14px", style: "font-size: 14px; width:15%;", }, { name: "status", align: "left", label: "สถานะ", sortable: true, field: "status", headerStyle: "font-size: 14px", style: "font-size: 14px; width:10%;", }, ]); /** *ฟังก์ชั่นแปลงประเภทแบบฟอร์มลา * @param item ประเภทแบบฟอร์ม * @param subitem ประเภทแบบฟอร์มย่อย */ function typeConvert(item: string, subitem: any) { typeLeave.value = convertSubtitle(item); // } typeId.value = convertId(item); } /** *ฟังก์ชั่นแปลงประเภทแบบฟอร์มลา ลาอุปสมบท/ลาประกอบพิธีฮัจญ์ * @param val ค่า string * @returns ส่งค่าที่แปลงแล้ว */ function convertSubtitle(val: string) { return options.value.find((x) => x.code == val)?.name; } /** *ฟังก์ชั่นหา id จาก api * @param val ค่า string * @returns ส่งค่าที่แปลงแล้ว */ function convertId(val: string) { return options.value.find((x) => x.code == val)?.id; } /** *ตัวแปร profile ที่จะส่งออก */ const dateSendLeave = ref(); //วันที่ยื่นใบลา const leaveTypeName = ref(""); //Name ประเภทการลา const dear = ref(""); //เรียน const commanderPosition = ref(""); //ตำแหน่งผู้บังคับบัญชา const fullName = ref(""); //คำนำหน้า ชื่อ นามสกุล ผู้ยื่นขอ const positionName = ref(""); //ตำแหน่งผู้ยื่นขอ const positionLevelName = ref(""); //ระดับผู้ยื่นขอ const organizationName = ref(""); //สังกัดผู้ยื่นขอ const leaveLimit = ref(0); //โควต้าลา(แต่ละประเภท)หน่วยเป็นวัน(ภายในปีนั้น) const leaveTotal = ref(0); //ลาไปแล้ว(แต่ละประเภท)หน่วยเป็นวัน(ภายในปีนั้น) const leaveRemain = ref(0); //คงเหลือโควต้า(แต่ละประเภท)หน่วยเป็นวัน(ภายในปีนั้น) const restDayTotalOld = ref(0); //จำนวนวันลาพักผ่อนสะสม จากปีที่ผ่านมา const birthDate = ref(); //วันเกิด const dateAppoint = ref(); //วันที่เข้ารับราชการ const salary = ref(0); //เงินเดือนปัจจุบัน const salaryText = ref(""); //เงินเดือนปัจจุบัน(ภาษาไทย) const leaveLast = ref(); const restDayCurrentTotal = ref(0); const telephoneNumber = ref(""); const currentAddress = ref(""); //ดึงข้อมูล profile จาก API async function fetchProfile() { showLoader(); await http .post(config.API.leaveProfile(), { type: typeId.value }) .then((res: any) => { const data = res.data.result; dateSendLeave.value = data.dateSendLeave; leaveTypeName.value = data.leaveTypeName; fullName.value = data.fullName; positionName.value = data.positionName; positionLevelName.value = data.positionLevelName; organizationName.value = data.organizationName; leaveLimit.value = data.leaveLimit; leaveTotal.value = data.leaveTotal; leaveRemain.value = data.leaveRemain; restDayTotalOld.value = data.restDayTotalOld; birthDate.value = data.birthDate; dateAppoint.value = data.dateAppoint; telephoneNumber.value = data.telephoneNumber && data.telephoneNumber !== "-" ? data.telephoneNumber : null; currentAddress.value = data.currentSubDistrict ? `${data.currentAddress} ${data.currentSubDistrict} ${data.currentDistrict} ${data.currentProvince} ${data.currentZipCode}` : ""; salary.value = data.salary ? data.salary.toLocaleString("th-TH") : ""; salaryText.value = data.salaryText; leaveLast.value = data.leaveLast != "0001-01-01T00:00:00" ? date2Thai(data.leaveLast) : "-"; restDayCurrentTotal.value = Number(data.leaveLimit) - Number(data.restDayTotalOld); }) .catch((e: any) => { console.log(e); }) .finally(() => { hideLoader(); }); } async function fetchProfileOld(data: any) { await http .post(config.API.leaveProfile(), { type: typeId.value }) .then((res: any) => { const data = res.data.result; leaveLimit.value = data.leaveLimit; leaveTotal.value = data.leaveTotal; leaveRemain.value = data.leaveRemain; restDayTotalOld.value = data.restDayTotalOld; //จำนวนวันลาพักผ่อนสะสม จากปีที่ผ่านมา birthDate.value = data.birthDate; // วันเกิด dateAppoint.value = data.dateAppoint; // วันที่รับราชการ salary.value = data.salary ? data.salary.toLocaleString("th-TH") : ""; salaryText.value = data.salaryText; restDayCurrentTotal.value = Number(data.leaveLimit) - Number(data.restDayTotalOld); }) .catch((e: any) => { console.log(e); }); dateSendLeave.value = data.dateSendLeave; typeLeave.value = data.leaveTypeName; dear.value = data.dear; commanderPosition.value = data.commanderPosition; fullName.value = data.fullName; positionName.value = data.positionName; positionLevelName.value = data.positionLevelName; organizationName.value = data.organizationName; leaveLast.value = data.leaveLast != "0001-01-01T00:00:00" ? date2Thai(data.leaveLast) : "-"; restDayCurrentTotal.value = data.restDayCurrentTotal; } function resetForm2() { dateSendLeave.value = undefined; leaveTypeName.value = ""; dear.value = ""; commanderPosition.value = ""; fullName.value = ""; positionName.value = ""; positionLevelName.value = ""; organizationName.value = ""; leaveLimit.value = 0; leaveTotal.value = 0; leaveRemain.value = 0; restDayTotalOld.value = 0; birthDate.value = undefined; dateAppoint.value = undefined; salary.value = 0; salaryText.value = ""; leaveLast.value = undefined; restDayCurrentTotal.value = 0; } return { tabValue, typeOptions, optionsSpecific, statusOptions, visibleColumns, columns, rows, LeaveType, LeaveStatus, fiscalYearyear, options, optionsOrdination, typeConvert, typeLeave, typeId, fetchListLeave, fetchLeaveType, filterOption, fetchProfile, //ส่งออกตัวแปร profileที่ได้จาก Api dateSendLeave, leaveTypeName, dear, commanderPosition, fullName, positionName, positionLevelName, organizationName, leaveLimit, //โควต้าลา(แต่ละประเภท)หน่วยเป็นวัน(ภายในปีนั้น) leaveTotal, //ลาไปแล้ว(แต่ละประเภท)หน่วยเป็นวัน(ภายในปีนั้น) leaveRemain, //คงเหลือโควต้า(แต่ละประเภท)หน่วยเป็นวัน(ภายในปีนั้น) restDayTotalOld, birthDate, dateAppoint, salary, salaryText, leaveLast, restDayCurrentTotal, convertStatud, resetForm2, fetchProfileOld, type, typeOptionsMain, status, statusOptionsMain, telephoneNumber, currentAddress, rangeOptions, converstType, }; });