import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, TemplateRef, ViewChild } from '@angular/core'; import { AppraisalCompentencyModel, AppraisalCompentencyModel2 } from 'src/app/shared/model/appraisal-competency.model'; import { EmployeeModel, MyEmployeeModel } from 'src/app/shared/model/employee.model'; import { MySettingAssessmentModel, SettingAssessmentModel } from 'src/app/shared/model/setting-assessment.model'; import { AppraisalService } from 'src/app/shared/services/appraisal.service'; import { EmployeeService } from 'src/app/shared/services/employee.service'; import { SettingAssessmentService } from 'src/app/shared/services/setting-assessment.service'; import Swal from 'sweetalert2'; export interface BiModel { name: string, tools: string[], degree: string } @Component({ selector: 'app-self-evaluation', templateUrl: './self-evaluation.component.html', styleUrls: ['./self-evaluation.component.scss'] }) export class SelfEvaluationComponent implements OnInit { @Input() pathTitle = ['การประเมินผล', 'ประเมินตนเอง'] @Input() employeeId?: string @Output() sendPathTitle: EventEmitter<string[]> = new EventEmitter<string[]>(); @Output() sendPageEvalution: EventEmitter<string> = new EventEmitter<string>(); hoveredCode: string | null = null; checkSheet: { score: string[], condition: string[] }[] = [{ score: ["หากได้คะแนน 90 - 100% ถือว่า Gap +1", "หากได้คะแนน 80 - 89% ถือว่า ไม่มี Gap", "หากได้คะแนน 60 - 79% ถือว่า Gap - 1", "หากได้คะแนน 40 - 59% ถือว่า Gap -2", "หากได้คะแนน 0 - 39% ถือว่า Gap - 3"], condition: ["1.หากได้คะแนนสูงกว่า 80% แต่มี 3 2 หรือ 1 ด้วย ถือว่า Gap -1", "2.หากได้คะแนนต่ำกว่า 80% แต่มี 4 และ 5 ให้คิด Gap ตาม %", "3.คะแนนต่ำกว่า 80% แต่มี 2 และ 1 ให้คิด Gap ตาม %"], }] @ViewChild('selfEvaluation', { static: true }) selfEvaluation!: TemplateRef<any>; @ViewChild('selfEvaluationEdit', { static: true }) selfEvaluationEdit!: TemplateRef<any>; currentTemplate: TemplateRef<any> = this.selfEvaluation appraisalCompentency: { loading: boolean, select?: AppraisalCompentencyModel, dataList: AppraisalCompentencyModel[] } = { loading: false, select: undefined, dataList: [] } appraisalCompentency2: { loading: boolean, data?: AppraisalCompentencyModel2 } = { loading: false, data: undefined } appraisalPms: { loading: boolean, select: undefined, dataList: { check: boolean, data: undefined }[] } = { loading: false, select: undefined, dataList: [] } employee: { loading: boolean, data: EmployeeModel, evaluate: boolean } = { loading: false, data: new MyEmployeeModel(), evaluate: false } setting: { loading: boolean, data: SettingAssessmentModel } = { loading: false, data: new MySettingAssessmentModel() } currentDate = new Date() constructor(private appraisalService: AppraisalService, private employeeService: EmployeeService, private cdr: ChangeDetectorRef, private settingAssessmentService: SettingAssessmentService ) { } ngOnInit(): void { this.currentTemplate = this.selfEvaluation this.getWorking() this.getAppraisalCompentencyList() this.getSettingList() if (this.pathTitle.find(x => ['การประเมินผล', 'ประเมินโดยหัวหน้า'].includes(x))) { this.returnPageTitle() } } returnPageTitle() { this.sendPathTitle.emit(['การประเมินผล', 'ประเมินโดยหัวหน้า', 'ประเมินลูกน้อง']) } returnPageEvalution() { this.sendPageEvalution.emit("") } getSettingList() { this.setting.loading = true this.settingAssessmentService.get().subscribe({ next: response => { this.setting.data = new MySettingAssessmentModel(response) this.setting.loading = false this.cdr.detectChanges() }, error: error => { this.setting.loading = false this.cdr.detectChanges() } }) } getWorking() { this.employee.loading = true this.employeeService.getWorkingById(this.employeeId).subscribe({ next: response => { this.employee.data = new MyEmployeeModel(response) this.employee.loading = false this.cdr.detectChanges() }, error: error => { this.employee.loading = false this.cdr.detectChanges() } }) } getAppraisalCompentencyList() { this.appraisalCompentency.loading = true this.appraisalService.getCompetencyList().subscribe({ next: response => { this.appraisalCompentency.dataList = JSON.parse(JSON.stringify(response)) if (this.appraisalCompentency.dataList.length) { this.selectAppraisalCompentency(this.appraisalCompentency.dataList[0]) } this.appraisalCompentency.loading = false this.cdr.detectChanges() }, error: error => { this.appraisalCompentency.loading = false this.cdr.detectChanges() } }) } appraisalCompentencyFilter(index: number) { return this.appraisalCompentency.dataList[index].masfromEvaluationAssessment1 } selectAppraisalCompentency(data: AppraisalCompentencyModel) { this.appraisalCompentency.select = JSON.parse(JSON.stringify(data)) } getAppraisalCompentencyForm(typeId: string) { this.appraisalCompentency2.loading = true if (this.appraisalCompentency.select) { this.appraisalService.getFormCompentencyById(this.appraisalCompentency.select.masfromEvaluationRound.evaluationRoundId, this.employee.data.employeeId, typeId).subscribe({ next: response => { this.appraisalCompentency2.data = JSON.parse(JSON.stringify(response)) if (this.appraisalCompentency2.data?.masfromEvaluationAssessment1lList[0]) { switch (this.appraisalCompentency2.data?.currentStep) { case ("0"): { this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsassessyDate = this.currentDate.toISOString().split('T')[0]; this.employee.evaluate = this.employee.data.employeeId == this.appraisalCompentency2.data.apsassessy.employeeId break } case ("1"): { this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove1Date = this.currentDate.toISOString().split('T')[0]; this.employee.evaluate = this.employee.data.employeeId == this.appraisalCompentency2.data.apsapprove1.employeeId break } case ("2"): { this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove2Date = this.currentDate.toISOString().split('T')[0]; this.employee.evaluate = this.employee.data.employeeId == this.appraisalCompentency2.data.apsapprove2.employeeId break } case ("3"): { this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove3Date = this.currentDate.toISOString().split('T')[0]; this.employee.evaluate = this.employee.data.employeeId == this.appraisalCompentency2.data.apsapprove3.employeeId break } case ("4"): { this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove4Date = this.currentDate.toISOString().split('T')[0]; this.employee.evaluate = this.employee.data.employeeId == this.appraisalCompentency2.data.apsapprove4.employeeId break } case ("5"): { this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove5Date = this.currentDate.toISOString().split('T')[0]; this.employee.evaluate = this.employee.data.employeeId == this.appraisalCompentency2.data.apsapprove5.employeeId break } default: { return } } console.log(" 🐒 this.employee.evaluate:", this.employee.evaluate) } this.calnumberCheck() this.appraisalCompentency2.loading = false this.cdr.detectChanges() }, error: error => { this.appraisalCompentency2.loading = false this.cdr.detectChanges() } }) } } appraisalCompentency2Filter() { return this.appraisalCompentency2.data?.masfromEvaluationAssessment1lList[0].masfromEvaluationAssessment2List || [] } appraisalPmsFilter() { return this.appraisalPms.dataList } showTools(data: string[]) { return data.join("/") } saveDraft() { Swal.fire({ iconHtml: ` <div class="flex items-center justify-center rounded-full !h-80px !w-80px" style="background-color: #E8F8EE;"> <svg width="39" height="39" viewBox="0 0 39 39" fill="none" xmlns="http://www.w3.org/2000/svg"> <rect width="39" height="39" fill="#D2D2D2"/> <g id="Component"> <g id="alert cart"> <g id="mdi:file-export"> <circle cx="22.5" cy="19.5" r="33.5" fill="#E8F8EE"/> <path d="M9.75 3.25C8.88805 3.25 8.0614 3.59241 7.4519 4.2019C6.84241 4.8114 6.5 5.63805 6.5 6.5V32.5C6.5 33.362 6.84241 34.1886 7.4519 34.7981C8.0614 35.4076 8.88805 35.75 9.75 35.75H29.25C30.112 35.75 30.9386 35.4076 31.5481 34.7981C32.1576 34.1886 32.5 33.362 32.5 32.5V13L22.75 3.25M21.125 5.6875L30.0625 14.625H21.125M14.5113 19.8575H26V31.3463L22.555 27.9013L17.9563 32.5L13.3575 27.9013L17.9563 23.3188" fill="#1DBE5A"/> </g> </g> </g> </svg> </div> `, title: 'บันทึกแบบร่าง', text: 'คุณต้องการบันทึกแบบร่างของการประเมินนี้ใช่หรือไม่', showCancelButton: true, confirmButtonText: 'ยืนยันการบันทึก', cancelButtonText: 'ย้อนกลับ', customClass: { title: '!swal2-title-mt-20px', actions: '!swal2-actions-mt-20px', icon: '!swal2-icon-no-border', confirmButton: '!swal2-button-bg-green', cancelButton: '!swal2-button-bg-gray', }, }).then((result) => { if (result.isConfirmed && this.appraisalCompentency2) { let body = this.appraisalCompentency2.data switch (this.appraisalCompentency2.data?.currentStep) { case ("0"): { body = { ...this.appraisalCompentency2.data, masfromEvaluationAssessment1lList: [{ ...this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0], apsassessyStatus: '1' }] } break } case ("1"): { body = { ...this.appraisalCompentency2.data, masfromEvaluationAssessment1lList: [{ ...this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0], apsapprove1Status: '1' }] } break } case ("2"): { body = { ...this.appraisalCompentency2.data, masfromEvaluationAssessment1lList: [{ ...this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0], apsapprove2Status: '1' }] } break } case ("3"): { body = { ...this.appraisalCompentency2.data, masfromEvaluationAssessment1lList: [{ ...this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0], apsapprove3Status: '1' }] } break } case ("4"): { body = { ...this.appraisalCompentency2.data, masfromEvaluationAssessment1lList: [{ ...this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0], apsapprove4Status: '1' }] } break } case ("5"): { body = { ...this.appraisalCompentency2.data, masfromEvaluationAssessment1lList: [{ ...this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0], apsapprove5Status: '1' }] } break } default: { return } } this.appraisalService.postCompetency(body).subscribe({ next: response => { if (response.success) { Swal.fire({ title: 'บันทึกสำเร็จ!', text: 'การประเมินของคุณถูกบันทึกแล้ว', icon: 'success', customClass: { confirmButton: '!swal2-button-bg-green', } }); } else { Swal.fire({ title: 'ยกเลิก!', text: 'การบันทึกถูกยกเลิก', icon: 'error', customClass: { confirmButton: '!swal2-button-bg-danger', } }); } }, error: error => { Swal.fire({ title: 'ยกเลิก!', text: 'การบันทึกถูกยกเลิก', icon: 'error', customClass: { confirmButton: '!swal2-button-bg-danger', } }); } }) } else if (result.dismiss === Swal.DismissReason.cancel) { Swal.fire({ title: 'ยกเลิก!', text: 'การบันทึกถูกยกเลิก', icon: 'error', customClass: { confirmButton: '!swal2-button-bg-danger', } }); } }); } save() { Swal.fire({ iconHtml: ` <div class="flex items-center justify-center rounded-full !h-80px !w-80px" style="background-color: #E8F8EE;"> <svg width="39" height="39" viewBox="0 0 39 39" fill="none" xmlns="http://www.w3.org/2000/svg"> <rect width="39" height="39" fill="#D2D2D2"/> <g id="Component"> <g id="alert cart"> <g id="mdi:file-export"> <circle cx="22.5" cy="19.5" r="33.5" fill="#E8F8EE"/> <path d="M9.75 3.25C8.88805 3.25 8.0614 3.59241 7.4519 4.2019C6.84241 4.8114 6.5 5.63805 6.5 6.5V32.5C6.5 33.362 6.84241 34.1886 7.4519 34.7981C8.0614 35.4076 8.88805 35.75 9.75 35.75H29.25C30.112 35.75 30.9386 35.4076 31.5481 34.7981C32.1576 34.1886 32.5 33.362 32.5 32.5V13L22.75 3.25M21.125 5.6875L30.0625 14.625H21.125M14.5113 19.8575H26V31.3463L22.555 27.9013L17.9563 32.5L13.3575 27.9013L17.9563 23.3188" fill="#1DBE5A"/> </g> </g> </g> </svg> </div> `, title: 'บันทึกข้อมูล', text: 'คุณต้องการบันทึกข้อมูลการประเมินนี้ใช่หรือไม่', showCancelButton: true, confirmButtonText: 'ยืนยันการบันทึก', cancelButtonText: 'ย้อนกลับ', customClass: { title: '!swal2-title-mt-20px', actions: '!swal2-actions-mt-20px', icon: '!swal2-icon-no-border', confirmButton: '!swal2-button-bg-green', cancelButton: '!swal2-button-bg-gray', }, }).then((result) => { if (result.isConfirmed) { let body = this.appraisalCompentency2.data switch (this.appraisalCompentency2.data?.currentStep) { case ("0"): { body = { ...this.appraisalCompentency2.data, masfromEvaluationAssessment1lList: [{ ...this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0], apsassessyStatus: '2' }] } break } case ("1"): { body = { ...this.appraisalCompentency2.data, masfromEvaluationAssessment1lList: [{ ...this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0], apsapprove1Status: '2' }] } break } case ("2"): { body = { ...this.appraisalCompentency2.data, masfromEvaluationAssessment1lList: [{ ...this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0], apsapprove2Status: '2' }] } break } case ("3"): { body = { ...this.appraisalCompentency2.data, masfromEvaluationAssessment1lList: [{ ...this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0], apsapprove3Status: '2' }] } break } case ("4"): { body = { ...this.appraisalCompentency2.data, masfromEvaluationAssessment1lList: [{ ...this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0], apsapprove4Status: '2' }] } break } case ("5"): { body = { ...this.appraisalCompentency2.data, masfromEvaluationAssessment1lList: [{ ...this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0], apsapprove5Status: '2' }] } break } default: { return } } this.appraisalService.postCompetency(body).subscribe({ next: response => { if (this.appraisalCompentency2.data) { if (response.success) { this.getAppraisalCompentencyForm(this.appraisalCompentency2.data?.masfromEvaluationAssessment1lList[0].competencyType.competencyTypeId) this.getWorking() Swal.fire({ title: 'บันทึกสำเร็จ!', text: 'การประเมินของคุณถูกบันทึกแล้ว', icon: 'success', customClass: { confirmButton: '!swal2-button-bg-green', } }); } else { Swal.fire({ title: 'ยกเลิก!', text: 'การบันทึกถูกยกเลิก', icon: 'error', customClass: { confirmButton: '!swal2-button-bg-danger', } }); } } }, error: error => { Swal.fire({ title: 'ยกเลิก!', text: 'การบันทึกถูกยกเลิก', icon: 'error', customClass: { confirmButton: '!swal2-button-bg-danger', } }); } }) } else if (result.dismiss === Swal.DismissReason.cancel) { Swal.fire({ title: 'ยกเลิก!', text: 'การบันทึกถูกยกเลิก', icon: 'error', customClass: { confirmButton: '!swal2-button-bg-danger', } }); } }); } convertDate(dateInput?: string | Date): string { let date = new Date() if (dateInput) { if (typeof dateInput === 'string') { const [year, month, day] = dateInput.split('-').map(Number); date = new Date(year, month - 1, day); } else { date = dateInput } } return date?.toLocaleDateString('th-TH', { day: 'numeric', month: 'long', year: 'numeric' }) || '' } calnumberCheck() { if (this.appraisalCompentency2.data?.masfromEvaluationAssessment1lList[0]) { this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].numberCheck1 = this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].masfromEvaluationAssessment2List.map((x: any) => x.groupAssessment1.competencyIndicatorsCourses1Mini.behavioralIndicatorsList.filter((y: any) => y.competencyBehavioral.scoreTopicExpectation == 1).length).reduce((acc: any, num: any) => acc + num, 0) this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].numberCheck2 = this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].masfromEvaluationAssessment2List.map((x: any) => x.groupAssessment1.competencyIndicatorsCourses1Mini.behavioralIndicatorsList.filter((y: any) => y.competencyBehavioral.scoreTopicExpectation == 2).length).reduce((acc: any, num: any) => acc + num, 0) this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].numberCheck3 = this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].masfromEvaluationAssessment2List.map((x: any) => x.groupAssessment1.competencyIndicatorsCourses1Mini.behavioralIndicatorsList.filter((y: any) => y.competencyBehavioral.scoreTopicExpectation == 3).length).reduce((acc: any, num: any) => acc + num, 0) this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].numberCheck4 = this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].masfromEvaluationAssessment2List.map((x: any) => x.groupAssessment1.competencyIndicatorsCourses1Mini.behavioralIndicatorsList.filter((y: any) => y.competencyBehavioral.scoreTopicExpectation == 4).length).reduce((acc: any, num: any) => acc + num, 0) this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].numberCheck5 = this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].masfromEvaluationAssessment2List.map((x: any) => x.groupAssessment1.competencyIndicatorsCourses1Mini.behavioralIndicatorsList.filter((y: any) => y.competencyBehavioral.scoreTopicExpectation == 5).length).reduce((acc: any, num: any) => acc + num, 0) this.calWeightTotal() } this.cdr.detectChanges() } calWeightScore(numberCheck: number) { if (this.appraisalCompentency2.data?.masfromEvaluationAssessment1lList[0]) { switch (numberCheck) { case (1): { return +(this.setting.data.settingScore1) * this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].numberCheck1 } case (2): { return +(this.setting.data.settingScore2) * this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].numberCheck2 } case (3): { return +(this.setting.data.settingScore3) * this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].numberCheck3 } case (4): { return +(this.setting.data.settingScore4) * this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].numberCheck4 } case (5): { return +(this.setting.data.settingScore5) * this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].numberCheck5 } default: { return } } } return } calWeightTotal() { if (this.appraisalCompentency2.data?.masfromEvaluationAssessment1lList[0]) { this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].weightedTotal = 0 this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].weightedTotal = (this.calWeightScore(1) ?? 0) + (this.calWeightScore(2) ?? 0) + (this.calWeightScore(3) ?? 0) + (this.calWeightScore(4) ?? 0) + (this.calWeightScore(5) ?? 0) this.cdr.detectChanges() this.calAverageScore() } } calAverageScore() { if (this.appraisalCompentency2.data?.masfromEvaluationAssessment1lList[0]) { const total = this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].masfromEvaluationAssessment2List.map((x: any) => x.groupAssessment1.competencyIndicatorsCourses1Mini.behavioralIndicatorsList.length).reduce((acc: any, num: any) => acc + num, 0) * 5 if (total) { this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].averageScore = 0 this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].averageScore = (this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].weightedTotal / total) * 100 this.cdr.detectChanges() } } } showNumber(text: number | string) { const num = Number(text); return isNaN(num) ? 0 : +num.toFixed(2); } calGap(score: number | string) { if (this.appraisalCompentency2.data?.masfromEvaluationAssessment1lList[0]) { const roundedScore = this.showNumber(score) % 1 <= 0.5 ? Math.floor(this.showNumber(score)) : Math.round(this.showNumber(score)); if (roundedScore >= 90 && roundedScore <= 100) { if (this.appraisalCompentency2.data?.masfromEvaluationAssessment1lList[0].numberCheck1 || this.appraisalCompentency2.data?.masfromEvaluationAssessment1lList[0].numberCheck2 || this.appraisalCompentency2.data?.masfromEvaluationAssessment1lList[0].numberCheck3) { return "-1"; } return "+1"; } else if (roundedScore >= 80 && roundedScore <= 89) { if (this.appraisalCompentency2.data?.masfromEvaluationAssessment1lList[0].numberCheck1 || this.appraisalCompentency2.data?.masfromEvaluationAssessment1lList[0].numberCheck2 || this.appraisalCompentency2.data?.masfromEvaluationAssessment1lList[0].numberCheck3) { return "-1"; } return "0"; } else if (roundedScore >= 60 && roundedScore <= 79) { return "-1"; } else if (roundedScore >= 40 && roundedScore <= 59) { return "-2"; } else { return "-3"; } } return } calAverage(score: number | string) { const roundedScore = this.showNumber(score) % 1 <= 0.5 ? Math.floor(this.showNumber(score)) : Math.round(this.showNumber(score)); if (roundedScore >= 90 && roundedScore <= 100) { return "5"; } else if (roundedScore >= 80 && roundedScore <= 89) { return "4"; } else if (roundedScore >= 60 && roundedScore <= 79) { return "3"; } else if (roundedScore >= 40 && roundedScore <= 59) { return "2"; } else { return "1"; } } }