hrms-user/src/modules/03_retire/views/addRetire.vue

790 lines
27 KiB
Vue
Raw Normal View History

2023-07-21 16:34:06 +07:00
<script setup lang="ts">
import { ref, onMounted } from "vue";
import { useQuasar } from "quasar";
import type { QForm, QTableProps } from "quasar";
import { useRouter, useRoute } from "vue-router";
2024-09-03 11:48:07 +07:00
import http from "@/plugins/http";
import config from "@/app.config";
import { useRestDataStore } from "@/modules/03_retire/store";
2024-09-03 11:48:07 +07:00
import { useCounterMixin } from "@/stores/mixin";
2024-11-08 14:03:01 +07:00
import { useDataStore } from "@/stores/data";
2024-09-03 11:48:07 +07:00
import type {
DataOptions,
RowsType,
SeqTypeRow,
} from "@/modules/03_retire/interface/Main";
import Dialog from "@/modules/03_retire/views/DialogRetire.vue";
2024-10-25 15:52:54 +07:00
import Header from "@/components/DialogHeader.vue";
2024-10-17 17:43:45 +07:00
import Workflow from "@/components/Workflow/Main.vue";
2023-07-21 16:34:06 +07:00
2024-09-03 11:48:07 +07:00
const $q = useQuasar();
const route = useRoute();
const router = useRouter();
const store = useRestDataStore();
const { convertStatusText } = store;
2024-11-08 14:03:01 +07:00
const link = ref<string>("");
const dataStore = useDataStore();
2024-09-03 11:48:07 +07:00
const routeName = router.currentRoute.value.name;
const mixin = useCounterMixin();
const {
date2Thai,
dateToISO,
success,
messageError,
showLoader,
hideLoader,
dialogConfirm,
} = mixin;
2024-10-17 17:43:45 +07:00
const id = ref<string>(
router.currentRoute.value.name !== "AddRetire"
? route.params.id.toString()
: ""
); //เก็บ id path
const rowsApprover = ref<RowsType>();
2024-09-03 11:48:07 +07:00
const myform = ref<QForm | null>(null); //form
const tranferOrg = ref(""); //สถานที่ยื่นขอลาออกจากราชการ
const dateCommand = ref<Date>(new Date()); //วันที่ยื่นขอลาออกจากราชการ
2024-10-18 14:51:42 +07:00
const dateLeave = ref<Date | null>(null); //วันที่ขอลาออกจากราชการ
const noteReason = ref<string>(""); //เหตุผลที่ลาออกจากราชการ
2024-09-03 11:48:07 +07:00
const modal = ref<boolean>(false); //ตัวแปร dialog
const remark = ref<string>(""); //ระบุเหตุผล
const noteReasonOp = ref<DataOptions[]>([
{
id: "CAREER",
name: "ประกอบอาชีพอื่น",
},
{
id: "MOVE",
name: "รับราชการสังกัดอื่น",
},
{
id: "FAMILY",
name: "ดูแลบิดามารดา",
},
{
id: "EDUCATION",
name: "ศึกษาต่อ",
},
{
id: "OTHER",
name: "อื่น ๆ",
},
]);
/** ข้อมูล v-model ของฟอร์ม */
2024-10-25 15:52:54 +07:00
const dataDetail = ref<any>({});
const modalWorkflow = ref<boolean>(false);
const columnsCommanders = ref<QTableProps["columns"]>([
{
name: "no",
align: "left",
label: "ลำดับ",
sortable: true,
field: "no",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
},
{
name: "fullName",
align: "left",
label: "ชื่อ-นามสกุล",
sortable: true,
field: "fullName",
format(val, row) {
return `${row.prefix}${row.firstName} ${row.lastName}`;
},
headerStyle: "font-size: 14px",
style: "font-size: 14px",
},
{
name: "positionName",
align: "left",
label: "ตำแหน่ง",
sortable: true,
field: "positionName",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
},
{
name: "approveStatus",
align: "left",
label: "สถานะ",
sortable: true,
field: "approveStatus",
headerStyle: "font-size: 14px",
style: "font-size: 14px",
},
{
name: "comment",
align: "left",
label: "ความคิดเห็นและเหตุผล",
field: "comment",
sortable: true,
headerStyle: "font-size: 14px",
style: "font-size: 14px",
},
{
name: "rejectDate",
align: "left",
label: "วันสุดท้ายที่ยับยั้ง",
field: "rejectDate",
sortable: true,
headerStyle: "font-size: 14px",
style: "font-size: 14px",
format(val, row) {
return `${row.rejectDate ? date2Thai(row.rejectDate) : "-"}`;
},
},
]);
/**
* งกนเปลยนเป string ของ status
* @param val value ของ status true/false
*/
2024-09-03 11:48:07 +07:00
function statusOrder(val: boolean) {
switch (val) {
case true:
2024-07-09 17:19:21 +07:00
return "ยับยั้ง";
case false:
2024-07-09 17:19:21 +07:00
return "อนุญาต";
}
2024-09-03 11:48:07 +07:00
}
/**
* นทกขอมลการลาออก
*/
2024-09-03 11:48:07 +07:00
async function onSubmit() {
dialogConfirm(
$q,
() => {
showLoader();
2024-10-18 14:51:42 +07:00
const formData = new FormData();
formData.append("Location", tranferOrg.value);
// formData.append("SendDate", dateToISO(dateCommand.value));
2024-10-18 14:51:42 +07:00
formData.append(
"ActiveDate",
dateLeave.value !== null ? dateToISO(dateLeave.value) : ""
);
formData.append("Reason", noteReason.value);
formData.append("file", files.value);
if (noteReason.value == "OTHER") {
formData.append("remark", remark.value);
}
http
2024-11-08 14:03:01 +07:00
.post(config.API.listResignByType(link.value), formData)
.then((res) => {
2024-10-25 15:52:54 +07:00
let id = res.data.result.id;
2024-11-08 14:03:01 +07:00
if (dataStore.officerType == "OFFICER") {
router.push(`/retire/result/${id}`);
} else {
2024-11-11 10:05:27 +07:00
router.push(`/retire/${id}`);
2024-11-08 14:03:01 +07:00
}
success($q, "บันทึกข้อมูลสำเร็จ");
})
.catch((e) => {
messageError($q, e);
})
.finally(() => {
hideLoader();
});
},
"ยืนยันการยื่นข้อมูลลาออก",
"ต้องการยื่นข้อมูลลาออกนี้ใช่หรือไม่"
);
2024-09-03 11:48:07 +07:00
}
const files = ref<any>();
2024-09-03 11:48:07 +07:00
const checkCancleLeave = ref<boolean>(false);
//ยกเลิกการลาออก
2024-09-03 11:48:07 +07:00
function cancelResing() {
modal.value = true;
2024-09-03 11:48:07 +07:00
}
/**
* งกนเรยกขอมลจาก Api
* @param id ไอดของขอม
*/
2024-09-03 11:48:07 +07:00
async function fectDataresign(id: string) {
showLoader();
await http
2024-11-08 14:03:01 +07:00
.get(config.API.resingByidType(link.value, id))
.then((res) => {
let data = res.data.result;
tranferOrg.value = data.location;
dateCommand.value = data.sendDate;
dateLeave.value = data.activeDate;
const currentDate = new Date();
let dueDateMinusOne = new Date(data.activeDate);
dueDateMinusOne.setDate(dueDateMinusOne.getDate() - 1);
checkCancleLeave.value = currentDate < dueDateMinusOne;
noteReason.value = data.reason;
remark.value = data.remark;
rowsApprover.value = {
commanders: data.commanders,
approvers: data.approvers,
};
files.value = data.docs;
dataDetail.value = data;
})
.catch((e) => {
messageError($q, e);
})
.finally(() => {
hideLoader();
});
2024-09-03 11:48:07 +07:00
}
2024-09-03 11:48:07 +07:00
/**
* เป tab ใหม
* @param data path file
*/
function downloadFile(data: string) {
window.open(data, "_blank");
}
2024-09-03 11:48:07 +07:00
/**
* เรยกฟงกนทงหมดตอนเรยกใชไฟล
*/
2024-11-08 14:03:01 +07:00
onMounted(async () => {
link.value = await dataStore.getProFileType();
2024-09-03 11:48:07 +07:00
if (route.params.id !== undefined) {
fectDataresign(id.value);
}
});
2023-07-21 16:34:06 +07:00
</script>
2024-10-17 17:43:45 +07:00
<template>
<div class="col-12 row justify-center">
<div class="col-xs-12 col-sm-12 col-md-11">
<div class="toptitle text-white col-12 row items-center">
<q-btn
icon="mdi-arrow-left"
unelevated
round
dense
flat
color="primary"
class="q-mr-sm"
2024-11-11 10:05:27 +07:00
@click="router.push('/retire')"
/>
<div v-if="routeName == 'AddRetire'">เพิ่มเรื่องลาออก</div>
<div v-else>รายละเอียดเรื่องลาออก</div>
</div>
<q-form
ref="myform"
class="col-12"
greedy
@submit.prevent
@validation-success="onSubmit"
>
<q-card bordered>
2024-10-25 15:52:54 +07:00
<q-card-actions
v-if="routeName !== 'AddRetire'"
style="padding-bottom: 0px"
>
<div class="q-pl-sm text-grey-7" v-if="dataDetail.cancelReason">
2025-01-23 09:14:48 +07:00
เหตผลการขอยกเล :
<spen class="text-red">{{ dataDetail.cancelReason }}</spen>
</div>
2024-10-25 15:52:54 +07:00
<q-space />
<q-btn
2025-01-23 09:14:48 +07:00
v-if="
dataDetail.statusMain !== 'CANCEL' &&
dataDetail.statusMain !== 'DONECANCEL' &&
checkCancleLeave
"
unelevated
color="orange"
label="ยกเลิกการลาออก"
@click="cancelResing"
:disable="tranferOrg == '' && noteReason == ''"
/>
2024-10-25 15:52:54 +07:00
2025-04-03 17:51:30 +07:00
<!-- <q-btn
2024-11-15 10:25:54 +07:00
v-else-if="
2025-01-23 09:14:48 +07:00
(dataDetail.statusMain === 'CANCEL' ||
dataDetail.statusMain === 'DONECANCEL') &&
2024-11-15 10:25:54 +07:00
dataStore.officerType == 'OFFICER'
"
2024-10-25 15:52:54 +07:00
unelevated
color="red"
2024-10-30 18:08:16 +07:00
label="ติดตามสถานะยกเลิกการขอลาออก"
2024-10-25 15:52:54 +07:00
@click="modalWorkflow = true"
2025-04-03 17:51:30 +07:00
/> -->
</q-card-actions>
2024-10-21 18:05:22 +07:00
<div class="col-12 row q-col-gutter-sm q-pa-md">
<q-input
:class="
routeName !== 'AddRetire'
? 'col-md-9 col-xs-12'
: 'col-md-9 col-xs-12 inputgreen'
"
class=""
dense
outlined
v-model="tranferOrg"
hide-bottom-space
label="สถานที่ยื่นขอลาออกจากราชการ"
:readonly="routeName != 'AddRetire'"
:rules="[(val:string) => !!val || `${'กรุณากรอกสถานที่ยื่นขอลาออกจากราชการ'}`]"
/>
<!-- <datepicker
:class="
routeName !== 'AddRetire'
? 'col-md-2 col-xs-12'
: 'col-md-2 col-xs-12 inputgreen'
"
menu-class-name="modalfix"
v-model="dateCommand"
:locale="'th'"
autoApply
readonly
borderless
:enableTimePicker="false"
week-start="0"
>
<template #year="{ year }">
{{ year + 543 }}
</template>
<template #year-overlay-value="{ value }">
{{ parseInt(value + 543) }}
</template>
<template #trigger>
<q-input
outlined
readonly
dense
hide-bottom-space
class="full-width"
:model-value="
dateCommand != null ? date2Thai(dateCommand) : null
"
:label="`${'วันที่ยื่นขอลาออกจากราชการ'}`"
:rules="[
(val: string) =>
!!val || `${'กรุณาเลือกวันที่ยื่นขอลาออกจากราชการ'}`,
]"
>
<template v-slot:prepend>
<q-icon
name="event"
class="cursor-pointer"
style="color: var(--q-primary)"
>
</q-icon>
</template>
</q-input>
</template>
</datepicker> -->
<datepicker
:class="
routeName !== 'AddRetire'
? 'col-md-3 col-xs-12'
: 'col-md-3 col-xs-12 inputgreen'
"
menu-class-name="modalfix"
v-model="dateLeave"
:locale="'th'"
autoApply
borderless
:enableTimePicker="false"
week-start="0"
:readonly="routeName != 'AddRetire'"
>
<template #year="{ year }">
{{ year + 543 }}
</template>
<template #year-overlay-value="{ value }">
{{ parseInt(value + 543) }}
</template>
<template #trigger>
<q-input
outlined
dense
hide-bottom-space
:readonly="routeName != 'AddRetire'"
class="full-width"
:model-value="dateLeave != null ? date2Thai(dateLeave) : null"
:label="`${'วันที่ขอลาออกจากราชการ'}`"
:rules="[
(val: string) =>
!!val || `${'กรุณาเลือกวันที่ขอลาออกจากราชการ'}`,
]"
>
<template v-slot:prepend>
<q-icon
name="event"
class="cursor-pointer"
style="color: var(--q-primary)"
>
</q-icon>
</template>
</q-input>
</template>
</datepicker>
<q-select
v-model="noteReason"
:class="
routeName !== 'AddRetire' ? 'col-12' : 'col-12 inputgreen'
"
dense
outlined
emit-value
map-options
hide-bottom-space
option-label="name"
option-value="id"
:options="noteReasonOp"
label="เหตุผลที่ลาออกจากราชการ"
:readonly="routeName != 'AddRetire'"
:rules="[
(val: string) => !!val || `${'กรุณาเลือกเหตุผลที่ลาออกจากราชการ'}`,
]"
>
</q-select>
<q-input
:class="
routeName !== 'AddRetire' ? 'col-12' : 'col-12 inputgreen'
"
v-if="noteReason == 'OTHER'"
v-model="remark"
outlined
hide-bottom-space
dense
type="textarea"
label="ระบุเหตุผล"
:readonly="routeName != 'AddRetire'"
:rules="[
(val: string) => !!val || `${'กรุณาระบุเหตุผล'}`,
]"
></q-input>
<div class="col-12 row" v-if="routeName == 'AddRetire'">
<q-file
v-model="files"
class="col-xs-12 col-sm-12 inputgreen"
outlined
dense
lazy-rules
hide-bottom-space
accept=".pdf"
:rules="[(val: string) => !!val || 'กรุณาเลือกเอกสารเพิ่มเติม']"
label="เอกสารเพิ่มเติม"
>
<template v-slot:prepend>
<q-icon name="attach_file" /> </template
></q-file>
</div>
<div class="col-12 row" v-if="routeName != 'AddRetire'">
<q-card bordered flat class="row col-12 text-dark q-mt-sm">
<div
class="bg-grey-1 q-pa-sm col-12 row items-center text-primary"
>
<div class="q-pl-sm text-weight-bold text-dark">
เอกสารเพมเต
</div>
</div>
<q-list class="col-12">
<q-item v-for="file in files" :key="file.key" class="q-my-xs">
<q-item-section>
<q-item-label class="full-width ellipsis">
{{ file.fileName }}
</q-item-label>
<q-item-label caption> </q-item-label>
</q-item-section>
<q-space />
<q-btn
size="12px"
flat
round
dense
color="blue"
icon="mdi-download"
@click="downloadFile(file.pathName)"
><q-tooltip>ดาวนโหลดไฟล</q-tooltip></q-btn
>
</q-item>
</q-list>
</q-card>
</div>
2024-10-25 15:52:54 +07:00
<!-- <div class="col-12 row" v-if="routeName != 'AddRetire'">
<q-card bordered class="row col-12 text-dark q-mt-sm">
<div
class="bg-grey-1 q-pa-sm col-12 row items-center text-primary"
>
<div class="q-pl-sm text-weight-bold text-dark">
ผลการพจารณาของการเจาหนาทของหนวยงาน
</div>
</div>
<q-separator />
<div class="row col-12 q-pa-md">
<div class="col-12 row bg-white q-col-gutter-md">
<div class="col-xs-6 row items-start">
<div class="col-12 text-top">สถานะ</div>
<div class="col-12 text-detail">
{{
dataDetail.officerReject !== null
? statusOrder(dataDetail.officerReject)
: "-"
}}
</div>
</div>
<div class="col-xs-6 row items-start">
<div class="col-12 text-top">นสดทายทบย</div>
<div class="col-12 text-detail">
{{
dataDetail.officerRejectDate !== null
? date2Thai(dataDetail.officerRejectDate)
: "-"
}}
2024-06-05 15:19:19 +07:00
</div>
</div>
<div class="col-xs-12 row items-start">
<div class="col-12 text-top">ความคดเหนและเหตผล</div>
<div
class="col-12 text-detail"
v-if="dataDetail.officerReject === false"
>
{{
dataDetail.officerApproveReason !== null
? dataDetail.officerApproveReason
: "-"
}}
</div>
<div
class="col-12 text-detail"
v-if="dataDetail.officerReject === true"
>
{{
dataDetail.officerRejectReason !== null
? dataDetail.officerRejectReason
: "-"
}}
2024-06-05 15:19:19 +07:00
</div>
</div>
</div>
2024-06-05 15:19:19 +07:00
</div>
</q-card>
2024-10-25 15:52:54 +07:00
</div> -->
2024-06-05 15:19:19 +07:00
2024-10-24 16:10:03 +07:00
<!-- ผลการพจารณาของผงคบบญชา -->
<div class="col-12 row" v-if="routeName != 'AddRetire'">
<q-card bordered class="row col-12 text-dark q-mt-sm">
<div
class="bg-grey-1 q-pa-sm col-12 row items-center text-primary"
>
<div class="q-pl-sm text-weight-bold text-dark">
ผลการพจารณาของผงคบบญชา
</div>
</div>
<q-separator />
<div class="col-12">
<d-table
ref="table"
:columns="columnsCommanders"
:rows="rowsApprover?.commanders ?? []"
row-key="key"
flat
bordered
:paging="true"
dense
:rows-per-page-options="[1, 25, 50, 100]"
>
<template v-slot:header="props">
<q-tr :props="props">
<q-th
v-for="col in props.cols"
:key="col.name"
:props="props"
>
<span class="text-weight-medium">{{
col.label
}}</span>
</q-th>
</q-tr>
</template>
<template v-slot:body="props">
<q-tr :props="props" class="cursor-pointer">
<q-td
v-for="col in props.cols"
:key="col.name"
:props="props"
>
<div v-if="col.name == 'no'">
{{ props.rowIndex + 1 }}
</div>
<div v-else-if="col.name == 'approveStatus'">
{{
props.row.approveStatus
? convertStatusText(props.row.approveStatus)
: "-"
}}
</div>
<div v-else>
{{ col.value ? col.value : "-" }}
</div>
</q-td>
</q-tr>
</template>
</d-table>
</div>
</q-card>
</div>
2024-10-17 17:43:45 +07:00
2024-10-24 16:10:03 +07:00
<!-- ผลการพจารณาของผอำนาจ -->
<div class="col-12 row" v-if="routeName != 'AddRetire'">
<q-card bordered class="row col-12 text-dark q-mt-sm">
<div
class="bg-grey-1 q-pa-sm col-12 row items-center text-primary"
>
<div class="q-pl-sm text-weight-bold text-dark">
ผลการพจารณาของผอำนาจ
</div>
</div>
<q-separator />
<div class="row col-12 q-pa-md">
<div class="col-12 row bg-white q-col-gutter-md">
<div class="col-xs-6 row items-start">
<div class="col-12 text-top"> - นามสก</div>
<div class="col-12 text-detail">
{{
rowsApprover &&
rowsApprover.approvers &&
rowsApprover.approvers[0]?.firstName
? `${rowsApprover?.approvers[0].prefix}${rowsApprover?.approvers[0].firstName} ${rowsApprover?.approvers[0].lastName}`
: "-"
}}
</div>
</div>
<div class="col-xs-6 row items-start">
<div class="col-12 text-top">สถานะ</div>
<div class="col-12 text-detail">
{{
rowsApprover &&
rowsApprover.approvers &&
rowsApprover.approvers[0]?.approveStatus
? convertStatusText(
rowsApprover?.approvers[0].approveStatus
)
: "-"
}}
</div>
</div>
<div class="col-xs-6 row items-start">
<div class="col-12 text-top">นสดทายทบย</div>
<div class="col-12 text-detail">
{{
rowsApprover &&
rowsApprover.approvers &&
rowsApprover.approvers[0]?.rejectDate
? date2Thai(rowsApprover?.approvers[0].rejectDate)
: "-"
}}
</div>
</div>
<div class="col-xs-12 row items-start">
<div class="col-12 text-top">ความคดเหนและเหตผล</div>
<div class="col-12 text-detail">
{{
rowsApprover &&
rowsApprover.approvers &&
rowsApprover.approvers[0]?.comment
? rowsApprover?.approvers[0].comment
: "-"
}}
</div>
</div>
</div>
2024-10-17 17:43:45 +07:00
</div>
</q-card>
</div>
</div>
<q-separator v-if="routeName == 'AddRetire'" />
<q-card-actions
align="right"
v-if="routeName == 'AddRetire'"
class="q-px-md"
>
<q-space />
<q-btn
unelevated
class="q-px-md items-center"
color="primary"
label="ยื่นเรื่องขอลาออก"
type="submit"
/>
</q-card-actions>
</q-card>
</q-form>
2024-10-25 15:52:54 +07:00
<div
class="col-12 row q-mt-sm"
v-if="
routeName != 'AddRetire' &&
dataDetail.status !== 'DELETE' &&
dataDetail.status !== 'CANCEL' &&
dataDetail.status !== 'DONECANCEL' &&
2024-11-08 14:03:01 +07:00
dataDetail.status !== 'DONEREJECT' &&
dataStore.officerType == 'OFFICER'
2024-10-25 15:52:54 +07:00
"
>
2025-04-03 17:51:30 +07:00
<!-- <Workflow :id="id" sys-name="SYS_RESIGN" /> -->
</div>
</div>
</div>
2024-11-15 10:25:54 +07:00
<Dialog
v-model:modal="modal"
:fectData="fectDataresign"
v-model:link="link"
/>
2024-10-25 15:52:54 +07:00
<q-dialog v-model="modalWorkflow" persistent>
<q-card style="width: 700px; max-width: 80vw">
<Header
2024-10-30 18:08:16 +07:00
:tittle="`ติดตามสถานะยกเลิกการขอลาออก`"
2024-10-25 15:52:54 +07:00
:close="
() => {
modalWorkflow = false;
}
"
/>
<q-separator />
<q-card-section>
<Workflow :id="id" sys-name="RETIREMENT_CANCEL" />
2024-10-25 15:52:54 +07:00
</q-card-section>
</q-card>
</q-dialog>
</template>
<style scoped>
.text-top {
color: gray;
font-weight: 400;
padding-bottom: 3px;
}
.text-detail {
font-weight: 500;
}
</style>