diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index c233f34d4..096fab0e2 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -9,7 +9,8 @@ env: REGISTRY: docker.frappet.com IMAGE_NAME: ehr/bma-ehr-app DEPLOY_HOST: frappet.com - COMPOSE_PATH: /home/frappet/docker/bma/bma-ehr + COMPOSE_PATH: /home/frappet/docker/bma-ehr + # COMPOSE_PATH: /home/frappet/docker/bma/bma-ehr jobs: # act workflow_dispatch -W .github/workflows/release.yaml --input IMAGE_VER=latest -s DOCKER_USER=kittapath@frappet.com -s DOCKER_PASS=P@ssw0rd -s SSH_PASSWORD=FPTadmin2357 release-test: diff --git a/src/modules/02_organizational/interface/index/Main.ts b/src/modules/02_organizational/interface/index/Main.ts index 2c475b5b0..c78b323ee 100644 --- a/src/modules/02_organizational/interface/index/Main.ts +++ b/src/modules/02_organizational/interface/index/Main.ts @@ -7,6 +7,7 @@ interface DataOption { id: string; name: string; note?: string; + level?: number; } interface GovermentOption { diff --git a/src/modules/03_recruiting/views/02_qualify/ExamForm.vue b/src/modules/03_recruiting/views/02_qualify/ExamForm.vue index 7d0c4b9c1..db8629750 100644 --- a/src/modules/03_recruiting/views/02_qualify/ExamForm.vue +++ b/src/modules/03_recruiting/views/02_qualify/ExamForm.vue @@ -30,7 +30,7 @@ > บันทึกข้อมูล - ตรวจสอบข้อมูล - + --> { option.push({ id: r.id.toString(), name: r.name.toString(), + level: r.level, }); }); - positionLevelOptions.value = option; - positionLevelFilters.value = option; + positionLevelOptions.value = option.filter( + (v: DataOption) => v.level === 0 + ); + positionLevelFilters.value = option.filter( + (v: DataOption) => v.level === 0 + ); }) .catch((e) => { messageError($q, e); diff --git a/src/modules/03_recruiting/views/02_qualify/manageDetail.vue b/src/modules/03_recruiting/views/02_qualify/manageDetail.vue index b120d1a79..eb4372add 100644 --- a/src/modules/03_recruiting/views/02_qualify/manageDetail.vue +++ b/src/modules/03_recruiting/views/02_qualify/manageDetail.vue @@ -158,7 +158,6 @@
(); const router = useRouter(); const $q = useQuasar(); -const { showLoader, hideLoader, messageError, date2Thai, dialogMessageNotify } = - useCounterMixin(); +const { showLoader, hideLoader, messageError, date2Thai } = useCounterMixin(); -/**props*/ +/** + * props + */ const modal = defineModel("modal", { required: true }); +/** + * ตัวแปร + */ const employeeClass = ref(""); const typeKeyword = ref(""); const Keyword = ref(""); @@ -35,7 +55,12 @@ const typeKeywordOps = ref([ { id: "position", name: "ตำแหน่ง" }, ]); const positionOps = ref([]); -const columns = ref([ +const options = ref([]); + +/** + * Table + */ +const columns = ref([ { name: "no", label: "ลำดับ", @@ -81,18 +106,26 @@ const columns = ref([ align: "left", label: "วันที่ถือครอง", field: "date", + format: (val, row) => `${date2Thai(val)}`, headerStyle: "font-size: 14px", style: "font-size: 14px", }, ]); -const rows = ref([]); +const rows = ref([]); +/** + * function fetch ข้อมูลตำแหน่ง ข้าราชการ + */ function fecthPositionOfficer() { http .get(config.API.listPositionPathHistory) .then((res) => { let data = res.data.result.items; - positionOps.value = data.map((e: any) => ({ id: e.id, name: e.name })); + + positionOps.value = data.map((e: Position) => ({ + id: e.id, + name: e.name, + })); options.value = positionOps.value; }) .catch((err) => { @@ -100,12 +133,20 @@ function fecthPositionOfficer() { }); } +/** + * function fetch ข้อมูลตำแหน่ง ลูกจ้างประจำ + */ function fetchPositionPerm() { http .get(config.API.listPositionEmployeePositionHistory) .then((res) => { let data = res.data.result.items; - positionOps.value = data.map((e: any) => ({ id: e.id, name: e.name })); + console.log(data); + + positionOps.value = data.map((e: Position) => ({ + id: e.id, + name: e.name, + })); options.value = positionOps.value; }) .catch((err) => { @@ -113,12 +154,20 @@ function fetchPositionPerm() { }); } +/** + * function เปลี่ยนประเภท + */ function changeEmployeeClass() { typeKeyword.value = ""; Keyword.value = ""; positionKeyword.value = ""; rows.value = []; } + +/** + * function เลือกฟิลด์ที่จะค้นหา + * @param typeKeyword ประเภทฟิลด์ + */ function selectTypeKeyword(typeKeyword: string) { positionOps.value = []; positionKeyword.value = ""; @@ -131,6 +180,10 @@ function selectTypeKeyword(typeKeyword: string) { } } +/** + * function ค้นหาประวัติถือครองตำแหน่ง + * @param type ประเภทข่าราชการ + */ function clickSearch(type: string) { myForm.value!.validate().then((result: boolean) => { if (result) { @@ -151,16 +204,15 @@ function clickSearch(type: string) { .then((res) => { let data = res.data.result; if (data.length !== 0) { - rows.value = data.map((e: any) => ({ + rows.value = data.map((e: HistoryPos) => ({ id: e.id, citizenId: e.citizenId, name: e.fullName, posNo: e.posNo, position: e.position, - date: date2Thai(e.date), + date: e.date, })); } else { - dialogMessageNotify($q, "ไม่มีข้อมูลที่ต้องการค้นหา"); rows.value = []; } }) @@ -174,8 +226,13 @@ function clickSearch(type: string) { } }); } -const options = ref([]); -function filterFn(val: string, update: any) { + +/** + * function ค้นหาข่อมูล Optiion + * @param val คำค้นหา + * @param update function + */ +function filterFn(val: string, update: Function) { if (val === "") { update(() => { options.value = positionOps.value; @@ -189,6 +246,11 @@ function filterFn(val: string, update: any) { }); } } + +/** + * function redirect ไปทะเบียนประวัติ + * @param id + */ function clickRedirect(id: string) { const url = employeeClass.value === "officer" @@ -197,42 +259,32 @@ function clickRedirect(id: string) { router.push(`${url}/${id}`); } -const paging = ref(true); -const pagination = ref({ - sortBy: "order", - descending: false, - page: 1, - rowsPerPage: 10, -}); -const paginationLabel = (start: number, end: number, total: number) => { - if (paging.value == true) return " " + start + "-" + end + " ใน " + total; - else return start + "-" + end + " ใน " + total; -}; +/** + * function ปิด popup + */ +function closeDialog() { + modal.value = false; + employeeClass.value = ""; + typeKeyword.value = ""; + Keyword.value = ""; + positionKeyword.value = ""; + rows.value = []; +} - -
- -
+ + + + - - - + -
- - - - - -
- - +
+ + + + +
+ + - + diff --git a/src/modules/04_registryNew/components/detail/Achievement/05_ResultsPerformance.vue b/src/modules/04_registryNew/components/detail/Achievement/05_ResultsPerformance.vue index beb18b59f..2be1c6b2e 100644 --- a/src/modules/04_registryNew/components/detail/Achievement/05_ResultsPerformance.vue +++ b/src/modules/04_registryNew/components/detail/Achievement/05_ResultsPerformance.vue @@ -661,7 +661,6 @@ onMounted(async () => { outlined lazy-rules hide-bottom-space - mask="###" class="inputgreen" v-model="resPerformForm.point1Total" input-class="text-right " @@ -675,7 +674,6 @@ onMounted(async () => { outlined lazy-rules hide-bottom-space - mask="###" class="inputgreen" v-model="resPerformForm.point1" input-class="text-right" @@ -691,7 +689,6 @@ onMounted(async () => { outlined lazy-rules hide-bottom-space - mask="###" class="inputgreen" v-model="resPerformForm.point2Total" input-class="text-right" @@ -705,7 +702,6 @@ onMounted(async () => { outlined lazy-rules hide-bottom-space - mask="###" class="inputgreen" v-model="resPerformForm.point2" input-class="text-right" @@ -721,7 +717,6 @@ onMounted(async () => { outlined lazy-rules hide-bottom-space - mask="###" class="inputgreen" v-model="resPerformForm.pointSumTotal" input-class="text-right" @@ -735,7 +730,6 @@ onMounted(async () => { outlined lazy-rules hide-bottom-space - mask="###" v-model="resPerformForm.pointSum" class="inputgreen" input-class="text-right" diff --git a/src/modules/04_registryNew/components/detail/PersonalInformation/01_Profile.vue b/src/modules/04_registryNew/components/detail/PersonalInformation/01_Profile.vue index 1ec7c9426..6ca2aaab9 100644 --- a/src/modules/04_registryNew/components/detail/PersonalInformation/01_Profile.vue +++ b/src/modules/04_registryNew/components/detail/PersonalInformation/01_Profile.vue @@ -263,13 +263,19 @@ const visibleColumnsHistory = ref([ async function getData() { showLoader(); - await http + http .get(config.API.registryNewByProfileId(profileId.value, empType.value)) - .then((res) => { - informaData.value = res.data.result; + .then(async (res) => { + informaData.value = await res.data.result; if (informaData.value) { id.value = informaData.value.id; - age.value = calculateAge(informaData.value.birthDate); + + if (informaData.value.birthDate) { + console.log("birthDate===>", informaData.value.birthDate); + + age.value = calculateAge(informaData.value.birthDate); + console.log("age===>", age.value); + } } }) .catch((e) => { @@ -309,6 +315,8 @@ async function editData() { function onClickOpenDialog() { if (!informaData.value) return; modal.value = true; + console.log("onClickOpenDialog birthDate===>", informaData.value.birthDate); + id.value = informaData.value.id; age.value = calculateAge(informaData.value.birthDate); formData.citizenId = informaData.value.citizenId; @@ -375,6 +383,8 @@ function changeCardID(citizenId: string | number | null) { watch( () => formData.birthDate, (v) => { + console.log("v===>", v); + if (v) { age.value = calculateAge(v); } @@ -383,21 +393,19 @@ watch( onMounted(async () => { await getData(); - if ( - store.Ops.prefixOps.length === 0 || - store.Ops.genderOps.length === 0 || - store.Ops.bloodOps.length === 0 || - store.Ops.statusOps.length === 0 || - store.Ops.religionOps.length === 0 - ) { - await fetchPerson(); + + if (store.Ops && store.Ops.prefixOps && store.Ops.prefixOps.length === 0) { + fetchPerson(); } - // store.genderOp.length === 0 ? await getGender() : ""; - // store.relationshipOp.length === 0 ? await getRelationship() : ""; - // store.religionOp.length === 0 ? await getReligion() : ""; - // store.bloodGroupOp.length === 0 ? await getBloodGroup() : ""; + + // store.Ops.prefixOps.length === 0 || + // store.Ops.genderOps.length === 0 || + // store.Ops.bloodOps.length === 0 || + // store.Ops.statusOps.length === 0 || + // store.Ops.religionOps.length === 0 }); + diff --git a/src/modules/10_order/components/step/step04.vue b/src/modules/10_order/components/step/step04.vue index c417f63a0..14ab30351 100644 --- a/src/modules/10_order/components/step/step04.vue +++ b/src/modules/10_order/components/step/step04.vue @@ -10,6 +10,7 @@ import http from "@/plugins/http"; import config from "@/app.config"; import axios from "axios"; import genReport from "@/plugins/genreport"; +import genReportXLSX from "@/plugins/genreportxlsx"; import { useOrderPlacementDataStore } from "@/modules/10_order/store"; @@ -127,11 +128,19 @@ const downloadCover = async (type: string) => { // โหลด เอกสารแนบท้าย const downloadAttachment = async (type: string) => { + // if (type === "xlsx") { + // genReportXLSX( + // dataAttachmentxlxs.value, + // `เอกสารแนบท้าย คำสั่ง ${orderName.value}`, + // type + // ); + // } else { genReport( dataAttachment.value, `เอกสารแนบท้าย คำสั่ง ${orderName.value}`, type ); + // } }; const dataCover = ref(); @@ -151,6 +160,7 @@ const fetchReportCover = async (type: string, orderId: string) => { }; const dataAttachment = ref(); +// const dataAttachmentxlxs = ref(); // เรียกไฟล์ เอกสารแนบท้าย const fetchReportAttachment = async (type: string, orderId: string) => { showLoader(); @@ -164,6 +174,17 @@ const fetchReportAttachment = async (type: string, orderId: string) => { messageError($q, e); hideLoader(); }); + + // showLoader(); + // await http + // .get(config.API.reportOrderAttachment("xlsx", orderId, code.value)) + // .then(async (res) => { + // dataAttachmentxlxs.value = res.data.result; + // }) + // .catch(async (e) => { + // messageError($q, e); + // hideLoader(); + // }); }; function genPDf(data: any) { @@ -531,15 +552,15 @@ const viewFileUpload = async (url: string) => { - ไฟล์ .xls + ไฟล์ .docx diff --git a/src/modules/13_salary/components/SalaryEmployeeLists/DialogMoveLevel.vue b/src/modules/13_salary/components/SalaryEmployeeLists/DialogMoveLevel.vue index e170ba5c3..00d8267c0 100644 --- a/src/modules/13_salary/components/SalaryEmployeeLists/DialogMoveLevel.vue +++ b/src/modules/13_salary/components/SalaryEmployeeLists/DialogMoveLevel.vue @@ -23,12 +23,14 @@ const profileId = defineModel("profileId", { required: true }); const props = defineProps({ typeLevel: { type: String, required: true }, isReserve: { type: Boolean, required: true }, + remark: { type: String, required: true }, fetchData: { type: Function, }, }); const type = ref(""); +const note = ref(""); const typeRef = ref(null); const isReadonly = ref(false); // อ่านได้อย่างเดียว const isChange = ref(false); // มีการแก้ไขข้อมูลหรือไม่ @@ -75,6 +77,7 @@ function onSubmit() { profileId: profileId.value, type: type.value, isReserve: isReserve.value, + remark: type.value === "NONE" ? note.value : undefined, }; http .post(config.API.salaryPeriodEmp() + `/change/type`, body) @@ -92,10 +95,15 @@ function onSubmit() { }); } +function chengType() { + note.value = props.typeLevel === "NONE" ? props.remark : ""; +} + watch( () => modal.value, () => { type.value = props.typeLevel == "PENDING" ? "" : props.typeLevel; + note.value = props.typeLevel === "NONE" ? props.remark : ""; isReserve.value = props.isReserve; isChange.value = false; } @@ -132,7 +140,7 @@ function inputEdit(val: boolean) { :rules="[(val) => !!val || `${'กรุณาเลือก ขั้น'}`]" lazy-rules hide-bottom-space - @update:model-value="isChange = true" + @update:model-value="(isChange = true), chengType()" /> @@ -144,6 +152,17 @@ function inputEdit(val: boolean) { v-model="isReserve" @update:model-value="isChange = true" /> + + diff --git a/src/modules/13_salary/components/SalaryEmployeeLists/TabMain.vue b/src/modules/13_salary/components/SalaryEmployeeLists/TabMain.vue index f7a4daa02..ecdb2df61 100644 --- a/src/modules/13_salary/components/SalaryEmployeeLists/TabMain.vue +++ b/src/modules/13_salary/components/SalaryEmployeeLists/TabMain.vue @@ -541,6 +541,7 @@ const updateIsShowRetire = async () => { v-model:formFilter="formFilter" :fetchDataTable="fetchDataPeriodNew" :total="total" + :type="item.type" /> diff --git a/src/modules/13_salary/components/SalaryEmployeeLists/TableTypeOther.vue b/src/modules/13_salary/components/SalaryEmployeeLists/TableTypeOther.vue index 202945bb8..be839176d 100644 --- a/src/modules/13_salary/components/SalaryEmployeeLists/TableTypeOther.vue +++ b/src/modules/13_salary/components/SalaryEmployeeLists/TableTypeOther.vue @@ -36,10 +36,14 @@ const props = defineProps({ total: { type: Number, }, + type: { + type: String, + requird: true, + }, }); /** ข้อมูล Table*/ -const columns = ref([ +const baseColumns = ref([ { name: "no", align: "left", @@ -152,6 +156,15 @@ const columns = ref([ headerStyle: "font-size: 14px", style: "font-size: 14px", }, + { + name: "remark", + align: "center", + label: "หมายเหตุ", + sortable: false, + field: "remark", + headerStyle: "font-size: 14px", + style: "font-size: 14px", + }, ]); const visibleColumns = ref([ @@ -167,8 +180,18 @@ const visibleColumns = ref([ "amountUse", "positionSalaryAmount", "isRetired", + "remark", ]); +const columns = computed(() => { + if (props.type !== "NONE") { + if (baseColumns.value) { + return baseColumns.value.filter((column) => column.name !== "remark"); + } + } + return baseColumns.value; +}); + /** modalDialog*/ const modalDialogAddPerson = ref(false); const modalDialogForm = ref(false); @@ -207,16 +230,24 @@ function onClickMovieGroup(id: string) { const typeLevel = ref(""); const isReserve = ref(false); +const remark = ref(""); + /** * function openPopup ย้ายกขั้น * @param id profileId * */ -function onClickMoveLevel(id: string, typeVal: string, isReserveVal: boolean) { +function onClickMoveLevel( + id: string, + typeVal: string, + isReserveVal: boolean, + remarkVal: string = "" +) { profileId.value = id; modalDialogMoveLeve.value = !modalDialogMoveLeve.value; typeLevel.value = typeVal; isReserve.value = isReserveVal; + remark.value = typeVal === "NONE" ? remarkVal : ""; } /** @@ -306,7 +337,7 @@ watch( store.roundMainCode === 'OCT' ? columns : columns - ? columns.slice(0, 11) + ? columns.filter((e) => e.name !== 'isRetired') : [] " option-value="name" @@ -322,7 +353,7 @@ watch( store.roundMainCode === 'OCT' ? columns : columns - ? columns.slice(0, 11) + ? columns.filter((e) => e.name !== 'isRetired') : [] " :rows="props.rows" @@ -416,7 +447,7 @@ watch( /> -
+
{{ col.value ? col.value : "-" }}
@@ -446,7 +477,8 @@ watch( ? onClickMoveLevel( props.row.id, props.row.type, - props.row.isReserve + props.row.isReserve, + props.row.remark ) : item.type === 'delete' ? onClickDelete(props.row.id) @@ -510,6 +542,7 @@ watch( v-model:profileId="profileId" :fetchData="props.fetchDataTable" :type="store.tabType" + :remark="remark" /> diff --git a/src/modules/13_salary/components/SalaryLists/DialogMoveLevel.vue b/src/modules/13_salary/components/SalaryLists/DialogMoveLevel.vue index f3af5e0c5..acfc11957 100644 --- a/src/modules/13_salary/components/SalaryLists/DialogMoveLevel.vue +++ b/src/modules/13_salary/components/SalaryLists/DialogMoveLevel.vue @@ -29,12 +29,14 @@ const profileId = defineModel("profileId", { required: true }); const props = defineProps({ typeLevel: { type: String, required: true }, isReserve: { type: Boolean, required: true }, + remark: { type: String, required: true }, fetchData: { type: Function, }, }); const type = ref(""); +const note = ref(""); const typeRef = ref(null); const isReadonly = ref(false); // อ่านได้อย่างเดียว const isChange = ref(false); // มีการแก้ไขข้อมูลหรือไม่ @@ -81,6 +83,7 @@ function onSubmit() { profileId: profileId.value, type: type.value, isReserve: isReserve.value, + remark: type.value === "NONE" ? note.value : undefined, }; http .post(config.API.salaryPeriod() + `/change/type`, body) @@ -98,10 +101,15 @@ function onSubmit() { }); } +function chengType() { + note.value = props.typeLevel === "NONE" ? props.remark : ""; +} + watch( () => modal.value, () => { type.value = props.typeLevel == "PENDING" ? "" : props.typeLevel; + note.value = props.typeLevel === "NONE" ? props.remark : ""; isReserve.value = props.isReserve; isChange.value = false; } @@ -138,9 +146,8 @@ function inputEdit(val: boolean) { :rules="[(val) => !!val || `${'กรุณาเลือก ขั้น'}`]" lazy-rules hide-bottom-space - @update:model-value="isChange = true" + @update:model-value="(isChange = true), chengType()" /> - + +
- { v-model:formFilter="formFilter" :fetchDataTable="fetchDataPeriodNew" :total="total" + :type="item.type" /> diff --git a/src/modules/13_salary/components/SalaryLists/TableTypeOther.vue b/src/modules/13_salary/components/SalaryLists/TableTypeOther.vue index d67208118..3479c4bbc 100644 --- a/src/modules/13_salary/components/SalaryLists/TableTypeOther.vue +++ b/src/modules/13_salary/components/SalaryLists/TableTypeOther.vue @@ -36,10 +36,14 @@ const props = defineProps({ total: { type: Number, }, + type: { + type: String, + required: true, + }, }); /** ข้อมูล Table*/ -const columns = ref([ +const baseColumns = ref([ { name: "no", align: "left", @@ -140,6 +144,15 @@ const columns = ref([ headerStyle: "font-size: 14px", style: "font-size: 14px", }, + { + name: "remark", + align: "center", + label: "หมายเหตุ", + sortable: false, + field: "remark", + headerStyle: "font-size: 14px", + style: "font-size: 14px", + }, ]); const visibleColumns = ref([ @@ -154,8 +167,20 @@ const visibleColumns = ref([ "amountUse", "positionSalaryAmount", "isRetired", + "remark", ]); +const columns = computed(() => { + if (props.type !== "NONE") { + if (baseColumns.value) { + return baseColumns.value.filter((column) => column.name !== "remark"); + } + } + console.log(baseColumns.value); + + return baseColumns.value; +}); + /** modalDialog*/ const modalDialogAddPerson = ref(false); const modalDialogForm = ref(false); @@ -194,16 +219,24 @@ function onClickMovieGroup(id: string) { const typeLevel = ref(""); const isReserve = ref(false); +const remark = ref(""); + /** * function openPopup ย้ายกขั้น * @param id profileId * */ -function onClickMoveLevel(id: string, typeVal: string, isReserveVal: boolean) { +function onClickMoveLevel( + id: string, + typeVal: string, + isReserveVal: boolean, + remarkVal: string = "" +) { profileId.value = id; modalDialogMoveLeve.value = !modalDialogMoveLeve.value; typeLevel.value = typeVal; isReserve.value = isReserveVal; + remark.value = typeVal === "NONE" ? remarkVal : ""; } /** @@ -293,7 +326,7 @@ watch( store.roundMainCode === 'OCT' ? columns : columns - ? columns.slice(0, 10) + ? columns.filter((e) => e.name !== 'isRetired') : [] " option-value="name" @@ -309,7 +342,7 @@ watch( store.roundMainCode === 'OCT' ? columns : columns - ? columns.slice(0, 10) + ? columns.filter((e) => e.name !== 'isRetired') : [] " :rows="props.rows" @@ -401,7 +434,7 @@ watch( /> -
+
{{ col.value ? col.value : "-" }}
@@ -431,7 +464,8 @@ watch( ? onClickMoveLevel( props.row.id, props.row.type, - props.row.isReserve + props.row.isReserve, + props.row.remark ) : item.type === 'delete' ? onClickDelete(props.row.id) @@ -495,6 +529,7 @@ watch( v-model:profileId="profileId" :fetchData="props.fetchDataTable" :type="store.tabType" + :remark="remark" /> diff --git a/src/modules/13_salary/views/salaryEmployeeRate.vue b/src/modules/13_salary/views/salaryEmployeeRate.vue index 2b710dd65..a2bbab67a 100644 --- a/src/modules/13_salary/views/salaryEmployeeRate.vue +++ b/src/modules/13_salary/views/salaryEmployeeRate.vue @@ -107,15 +107,18 @@ const pagination = ref({ rowsPerPage: formFilter.pageSize, }); const isActive = ref(false); +const groupSalary = ref(""); function fetchDataDetail() { http .get(config.API.salaryEmployeeChartByid(salaryEmployeeId.value)) .then((res) => { isActive.value = res.data.result.isActive; + groupSalary.value = res.data.result.group; }) - .catch((e) => {}) - .finally(() => {}); + .catch((e) => { + messageError($q, e); + }); } function fetchSalalyEmployeeRate() { @@ -222,9 +225,9 @@ watch( } ); -onMounted(() => { - fetchSalalyEmployeeRate(); - fetchDataDetail(); +onMounted(async () => { + await fetchDataDetail(); + await fetchSalalyEmployeeRate(); });