511 lines
16 KiB
Vue
511 lines
16 KiB
Vue
<script setup lang="ts">
|
|
import { ref, reactive, watch } from "vue";
|
|
import { useQuasar } from "quasar";
|
|
import { useRoute } from "vue-router";
|
|
import http from "@/plugins/http";
|
|
import config from "@/app.config";
|
|
|
|
import type {
|
|
ObjectReteRef,
|
|
DataOptions,
|
|
DataListOptions,
|
|
} from "@/modules/13_salary/interface/index/EmployeeChart";
|
|
import type { FormDataRate } from "@/modules/13_salary/interface/request/EmployeeChart";
|
|
|
|
import Header from "@/components/DialogHeader.vue";
|
|
|
|
import { useCounterMixin } from "@/stores/mixin";
|
|
|
|
const $q = useQuasar();
|
|
const route = useRoute();
|
|
const {
|
|
date2Thai,
|
|
dialogConfirm,
|
|
showLoader,
|
|
hideLoader,
|
|
messageError,
|
|
success,
|
|
} = useCounterMixin();
|
|
|
|
// const salaryEmployeeId = ref<string>(route.params.id.toString());
|
|
|
|
const modal = defineModel<boolean>("modal", { required: true });
|
|
const isEdit = defineModel<boolean>("isStatusEdit", { required: true });
|
|
const props = defineProps({
|
|
data: {
|
|
type: Object,
|
|
defult: [],
|
|
},
|
|
getDataMain: Function,
|
|
// fetchData: {
|
|
// type: Function,
|
|
// required: true,
|
|
// },
|
|
});
|
|
|
|
const posTypeOp = ref<DataOptions[]>([]);
|
|
const posNameOp = ref<DataOptions[]>([]);
|
|
const groupOldOp = ref<DataOptions[]>([]);
|
|
const posLevelOp = ref<any[]>([]);
|
|
const posNameListOp = ref<DataListOptions[]>([]);
|
|
const formData = reactive<any>({
|
|
id: "",
|
|
posType: "", //กลุ่มงาน
|
|
posName: "", //ตำแหน่ง
|
|
posLevel: "", //ระดับชั้นงาน
|
|
reson: "", //หมายเหตุ
|
|
rateOldMin: "", //อัตราค่าจ้าง ขั้นต่ำสุด
|
|
groupOld: null, //อัตราค่าจ้าง กลุ่มบัญชีค่าจ้าง
|
|
rateMaxOld: "", //อัตราค่าจ้าง ขั้นสูงสุดเดิม
|
|
groupRateHigh: "", //อัตราค่าจ้างสูงกว่าฯ กลุ่มบัญชีค่าจ่าง
|
|
rateHighMax: "", //อัตราค่าจ้างสูงกว่าฯ ขั้นสูงใหม่
|
|
});
|
|
|
|
/** ตัวแปร ref สำหรับแสดง validate */
|
|
const posTypeRef = ref<object | null>(null);
|
|
const posNameRef = ref<object | null>(null);
|
|
const posLevelRef = ref<object | null>(null);
|
|
const rateOldMinRef = ref<object | null>(null);
|
|
const groupOldRef = ref<object | null>(null);
|
|
const rateMaxOldRef = ref<object | null>(null);
|
|
const groupRateHighRef = ref<object | null>(null);
|
|
const rateHighMaxRef = ref<object | null>(null);
|
|
|
|
const ObjectRef: ObjectReteRef = {
|
|
posType: posTypeRef,
|
|
posName: posNameRef,
|
|
posLevel: posLevelRef,
|
|
rateOldMin: rateOldMinRef,
|
|
groupOld: groupOldRef,
|
|
rateMaxOld: rateMaxOldRef,
|
|
groupRateHigh: groupRateHighRef,
|
|
rateHighMax: rateHighMaxRef,
|
|
};
|
|
|
|
function closeDialog() {
|
|
modal.value = !modal.value;
|
|
clearFormData();
|
|
}
|
|
|
|
function clearFormData() {
|
|
isEdit.value = false;
|
|
formData.posType = "";
|
|
formData.posName = "";
|
|
formData.posLevel = "";
|
|
formData.reson = "";
|
|
formData.rateOldMin = "";
|
|
formData.groupOld = null;
|
|
formData.rateMaxOld = "";
|
|
formData.groupRateHigh = "";
|
|
formData.rateHighMax = "";
|
|
}
|
|
|
|
function onClickSubmit() {
|
|
const hasError = [];
|
|
for (const key in ObjectRef) {
|
|
if (Object.prototype.hasOwnProperty.call(ObjectRef, key)) {
|
|
const property = ObjectRef[key];
|
|
if (property.value && typeof property.value.validate === "function") {
|
|
const isValid = property.value.validate();
|
|
hasError.push(isValid);
|
|
}
|
|
}
|
|
}
|
|
if (hasError.every((result) => result === true)) {
|
|
onSubmit();
|
|
}
|
|
}
|
|
|
|
function onSubmit() {
|
|
dialogConfirm($q, async () => {
|
|
// showLoader();
|
|
const body = {
|
|
posTypeId: formData.posType.id,
|
|
position: formData.posName,
|
|
posLevelId: formData.posLevel.id,
|
|
details: formData.reson,
|
|
salaryMin:
|
|
typeof formData.rateOldMin === "string"
|
|
? Number(formData.rateOldMin.replace(/,/g, ""))
|
|
: formData.rateOldMin,
|
|
salaryEmployeeMinIds: formData.groupOld.map(
|
|
(group: DataOptions) => group.id
|
|
),
|
|
salary:
|
|
typeof formData.rateMaxOld === "string"
|
|
? Number(formData.rateMaxOld.replace(/,/g, ""))
|
|
: formData.rateMaxOld,
|
|
salaryEmployeeId: formData.groupRateHigh,
|
|
salaryMax:
|
|
typeof formData.rateHighMax === "string"
|
|
? Number(formData.rateHighMax.replace(/,/g, ""))
|
|
: formData.rateHighMax,
|
|
};
|
|
|
|
const url = !isEdit.value
|
|
? config.API.salaryFormula()
|
|
: config.API.salaryFormulaById(formData.id);
|
|
await http[!isEdit.value ? "post" : "put"](url, body)
|
|
.then((res) => {
|
|
success($q, "บันทึกข้อมูลสำเร็จ");
|
|
closeDialog();
|
|
props.getDataMain?.();
|
|
})
|
|
.catch((e) => {
|
|
messageError($q, e);
|
|
})
|
|
.finally(() => {
|
|
hideLoader();
|
|
});
|
|
});
|
|
}
|
|
|
|
// watch(
|
|
// () => modal.value,
|
|
// () => {
|
|
// if (modal.value && props.isStatusEdit) {
|
|
// if (props.data) {
|
|
// const data = props.data;
|
|
// console.log(data);
|
|
// formData.salaryNo = data.step;
|
|
// formData.salaryMonth = data.salaryMonth;
|
|
// formData.salaryDay = data.salaryDay;
|
|
// }
|
|
// }
|
|
// }
|
|
// );
|
|
|
|
/** ดึงข้อมูล กลุ่มงาน */
|
|
function getPosType() {
|
|
showLoader();
|
|
http
|
|
.get(config.API.salaryEmployeePosType())
|
|
.then((res) => {
|
|
const dataOp = res.data.result;
|
|
posTypeOp.value = dataOp.map((item: any) => ({
|
|
id: item.id,
|
|
name: item.posTypeName,
|
|
}));
|
|
})
|
|
.catch((e) => {
|
|
messageError($q, e);
|
|
})
|
|
.finally(() => {
|
|
hideLoader();
|
|
});
|
|
}
|
|
|
|
/** ดึงข้อมูล ตำแหน่ง */
|
|
function getPosName() {
|
|
formData.posName = "";
|
|
formData.posLevel = "";
|
|
showLoader();
|
|
http
|
|
.get(config.API.salaryEmployeePositionType(formData.posType.name))
|
|
.then((res) => {
|
|
const dataOp = res.data.result;
|
|
posNameListOp.value = res.data.result;
|
|
posNameOp.value = [
|
|
...new Map(
|
|
dataOp.map((i: DataListOptions) => [i.posDictName, i])
|
|
).values(),
|
|
].map((i: any) => ({
|
|
id: i.id,
|
|
name: i.posDictName,
|
|
}));
|
|
})
|
|
.catch((e) => {
|
|
messageError($q, e);
|
|
})
|
|
.finally(() => {
|
|
hideLoader();
|
|
});
|
|
}
|
|
|
|
/** ดึงข้อมูล ตำแหน่ง */
|
|
function getPosNameEdit() {
|
|
showLoader();
|
|
http
|
|
.get(config.API.salaryEmployeePositionType(formData.posType.name))
|
|
.then((res) => {
|
|
const dataOp = res.data.result;
|
|
posNameListOp.value = res.data.result;
|
|
posNameOp.value = [
|
|
...new Map(
|
|
dataOp.map((i: DataListOptions) => [i.posDictName, i])
|
|
).values(),
|
|
].map((i: any) => ({
|
|
id: i.id,
|
|
name: i.posDictName,
|
|
}));
|
|
})
|
|
.catch((e) => {
|
|
messageError($q, e);
|
|
})
|
|
.finally(() => {
|
|
hideLoader();
|
|
});
|
|
}
|
|
/** ดึงข้อมูล ระดับชั้นงาน */
|
|
function getPosLevel() {
|
|
formData.posLevel = "";
|
|
posLevelOp.value = posNameListOp.value
|
|
.filter((item) => item.posDictName === formData.posName)
|
|
.map((i) => ({ id: i.posLevelId, name: i.posLevelName }))
|
|
.sort((a, b) => a.name - b.name);
|
|
if (posLevelOp.value.length == 1) {
|
|
formData.posLevel = posLevelOp.value[0];
|
|
}
|
|
}
|
|
/** ดึงข้อมูล ระดับชั้นงาน */
|
|
function getPosLevelEdit() {
|
|
console.log(1);
|
|
console.log(posNameListOp.value);
|
|
|
|
posLevelOp.value = posNameListOp.value
|
|
.filter((item) => item.posDictName === formData.posName)
|
|
.map((i) => ({ id: i.posLevelId, name: i.posLevelName }))
|
|
.sort((a, b) => a.name - b.name);
|
|
if (posLevelOp.value.length == 1) {
|
|
formData.posLevel = posLevelOp.value[0];
|
|
}
|
|
}
|
|
|
|
function getSalaryGroup() {
|
|
http
|
|
.get(config.API.salaryEmployeeActive())
|
|
.then((res) => {
|
|
const list = res.data.result;
|
|
const data = list.sort((a: any, b: any) => a.group - b.group);
|
|
groupOldOp.value = data.map((item: any) => ({
|
|
id: item.id,
|
|
name: item.name,
|
|
}));
|
|
console.log(groupOldOp.value);
|
|
})
|
|
.catch((e) => {
|
|
messageError($q, e);
|
|
})
|
|
.finally(() => {});
|
|
}
|
|
|
|
function getDataEdit() {
|
|
http.get(config.API.salaryFormula() + `/${formData.id}`).then(async (res) => {
|
|
const data = res.data.result;
|
|
formData.posType = posTypeOp.value.find((a: any) => a.id == data.posTypeId);
|
|
formData.posName = data.position;
|
|
getPosNameEdit();
|
|
setTimeout(() => {
|
|
getPosLevelEdit();
|
|
formData.posLevel = posLevelOp.value.find(
|
|
(item: any) => item.id == data.posLevelId
|
|
);
|
|
formData.reson = data.details;
|
|
formData.rateOldMin = data.salaryMin;
|
|
formData.groupOld = groupOldOp.value.filter((b: any) =>
|
|
data.salaryEmployeeMinIds.includes(b.id)
|
|
);
|
|
formData.rateMaxOld = data.salary;
|
|
formData.groupRateHigh = data.salaryEmployeeId;
|
|
formData.rateHighMax = data.salaryMax;
|
|
}, 200);
|
|
});
|
|
}
|
|
watch(
|
|
() => modal.value,
|
|
async (check) => {
|
|
if (check) {
|
|
await getPosType();
|
|
await getSalaryGroup();
|
|
|
|
if (isEdit.value) {
|
|
formData.id = props.data?.id ? props.data.id : null;
|
|
getDataEdit();
|
|
}
|
|
}
|
|
}
|
|
);
|
|
</script>
|
|
|
|
<template>
|
|
<q-dialog v-model="modal" persistent>
|
|
<q-card class="col-12" style="width: 80%">
|
|
<Header
|
|
:tittle="isEdit ? 'แก้ไขหลักเกณฑ์' : 'เพิ่มหลักเกณฑ์'"
|
|
:close="closeDialog"
|
|
/>
|
|
<q-separator />
|
|
|
|
<q-card-section>
|
|
<div class="row q-gutter-sm q-pa-sm">
|
|
<div class="row col-xs-12 col-md-12 q-col-gutter-sm">
|
|
<div class="col-4">
|
|
<q-select
|
|
ref="posTypeRef"
|
|
dense
|
|
outlined
|
|
v-model="formData.posType"
|
|
label="กลุ่มงาน"
|
|
:rules="[(val) => !!val || 'กรุณาเลือกกลุ่มงาน']"
|
|
:options="posTypeOp"
|
|
option-label="name"
|
|
option-value="id"
|
|
map-options
|
|
lazy-rules
|
|
hide-bottom-space
|
|
@update:model-value="getPosName()"
|
|
/>
|
|
</div>
|
|
<div class="col-4">
|
|
<q-select
|
|
ref="posNameRef"
|
|
dense
|
|
:readonly="formData.posType"
|
|
outlined
|
|
v-model="formData.posName"
|
|
label="ตำแหน่ง"
|
|
:rules="[(val) => !!val || 'กรุณาเลือกตำแหน่ง']"
|
|
:options="posNameOp"
|
|
option-label="name"
|
|
option-value="name"
|
|
emit-value
|
|
lazy-rules
|
|
hide-bottom-space
|
|
@update:model-value="getPosLevel()"
|
|
/>
|
|
</div>
|
|
<div class="col-4">
|
|
<q-select
|
|
:readonly="formData.posName"
|
|
ref="posLevelRef"
|
|
dense
|
|
outlined
|
|
v-model="formData.posLevel"
|
|
:options="posLevelOp"
|
|
option-label="name"
|
|
option-value="id"
|
|
map-options
|
|
label="ระดับชั้นงาน"
|
|
:rules="[(val) => !!val || 'กรุณาเลือกระดับชั้นงาน']"
|
|
lazy-rules
|
|
hide-bottom-space
|
|
/>
|
|
</div>
|
|
|
|
<div class="col-8">
|
|
<q-input
|
|
dense
|
|
outlined
|
|
v-model="formData.reson"
|
|
label="หมายเหตุ"
|
|
/>
|
|
</div>
|
|
|
|
<div class="col-12 text-bold">อัตราค่าจ้าง</div>
|
|
<div class="col-4">
|
|
<q-input
|
|
ref="rateOldMinRef"
|
|
dense
|
|
outlined
|
|
v-model="formData.rateOldMin"
|
|
label="ขั้นต่ำสุด"
|
|
mask="###,###,###,###"
|
|
reverse-fill-mask
|
|
:rules="[
|
|
(val) => !!val || `${'กรุณากรอกอัตราค่าจ้าง ขั้นต่ำสุด'}`,
|
|
]"
|
|
lazy-rules
|
|
hide-bottom-space
|
|
/>
|
|
</div>
|
|
<div class="col-4">
|
|
<q-select
|
|
ref="groupOldRef"
|
|
dense
|
|
outlined
|
|
multiple
|
|
v-model="formData.groupOld"
|
|
label="กลุ่มของผังบัญชีอัตราค่าจ้าง"
|
|
:rules="[
|
|
(val) =>
|
|
!!val ||
|
|
`${'กรุณาเลือกอัตราค่าจ้าง กลุ่มของผังบัญชีอัตราค่าจ้าง'}`,
|
|
]"
|
|
:options="groupOldOp"
|
|
map-options
|
|
option-label="name"
|
|
option-value="id"
|
|
lazy-rules
|
|
hide-bottom-space
|
|
/>
|
|
</div>
|
|
<div class="col-4">
|
|
<q-input
|
|
ref="rateMaxOldRef"
|
|
dense
|
|
outlined
|
|
v-model="formData.rateMaxOld"
|
|
label="ขั้นสูงสุดเดิม"
|
|
mask="###,###,###,###"
|
|
reverse-fill-mask
|
|
:rules="[
|
|
(val) => !!val || `${'กรุณากรอกอัตราค่าจ้าง ขั้นสูงสุดเดิม'}`,
|
|
]"
|
|
lazy-rules
|
|
hide-bottom-space
|
|
/>
|
|
</div>
|
|
|
|
<div class="col-12 text-bold">
|
|
อัตราค่าจ้างสูงกว่าอัตราค่าจ้างขั้นสูงของตำแหน่งที่ได้รับแต่งตั้งในแต่ละระดับ
|
|
</div>
|
|
<div class="col-4">
|
|
<q-select
|
|
ref="groupRateHighRef"
|
|
dense
|
|
outlined
|
|
v-model="formData.groupRateHigh"
|
|
label="กลุ่มบัญชีค่าจ้าง"
|
|
:rules="[
|
|
(val) => !!val || `${'กรุณากรอกเลือกกลุ่มบัญชีค่าจ้าง'}`,
|
|
]"
|
|
lazy-rules
|
|
:options="groupOldOp"
|
|
map-options
|
|
option-label="name"
|
|
option-value="id"
|
|
emit-value
|
|
hide-bottom-space
|
|
/>
|
|
</div>
|
|
<div class="col-4">
|
|
<q-input
|
|
ref="rateHighMaxRef"
|
|
dense
|
|
outlined
|
|
v-model="formData.rateHighMax"
|
|
label="อัตราค่าจ้างขั้นสูงใหม่"
|
|
mask="###,###,###,###"
|
|
reverse-fill-mask
|
|
:rules="[
|
|
(val) => !!val || `${'กรุณากรอกอัตราค่าจ้างขั้นสูงใหม่'}`,
|
|
]"
|
|
lazy-rules
|
|
hide-bottom-space
|
|
/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</q-card-section>
|
|
<q-separator />
|
|
|
|
<q-card-actions align="right" class="bg-white text-teal">
|
|
<q-btn label="บันทึก" color="secondary" @click="onClickSubmit"
|
|
><q-tooltip>บันทึกข้อมูล</q-tooltip></q-btn
|
|
>
|
|
</q-card-actions>
|
|
</q-card>
|
|
</q-dialog>
|
|
</template>
|
|
|
|
<style lang="scss" scoped></style>
|