Commit 085f5b9c by Nattana Chaiyamat

การประเมินสมรรถนะ

ทะเบียนกำหนดชื่อ
ประเภทสมรรถนะ
parent 7fd7a2f9
...@@ -218,6 +218,11 @@ ...@@ -218,6 +218,11 @@
<label for="detail_eng" class="ti-form-label mt-1rem">ระดับความคาดหวัง *</label> <label for="detail_eng" class="ti-form-label mt-1rem">ระดับความคาดหวัง *</label>
<input type="text" id="detail_eng" class="ti-form-input" style="width: 200px;" <input type="text" id="detail_eng" class="ti-form-input" style="width: 200px;"
oninput="this.value = this.value.replace(/\D/g, '')" [(ngModel)]="dataSelect.level"> oninput="this.value = this.value.replace(/\D/g, '')" [(ngModel)]="dataSelect.level">
<label for="detail_eng" class="ti-form-label mt-1rem">น้ำหนัก</label>
<input type="text" id="detail_eng" class="ti-form-input" style="width: 200px;"
oninput="this.value = this.value.replace(/[^\d.]/g, '').replace(/(\..*?)\..*/g, '$1').replace(/(\..*?)(\d{2})./g, '$1$2');"
onchange="this.value = this.value.replace('', '0');this.value = parseFloat(this.value).toFixed(2)"
[(ngModel)]="dataSelect.weight">
<div class="flex justify-end mt-2rem mb-1rem"> <div class="flex justify-end mt-2rem mb-1rem">
<button type="button" <button type="button"
class="hs-dropdown-toggle ti-btn ti-border font-medium bg-white text-gray-700 shadow-sm align-middle hover:bg-gray-50 focus:ring-offset-white focus:ring-primary dark:bg-bgdark dark:hover:bg-black/20 dark:border-white/10 dark:text-white/70 dark:hover:text-white dark:focus:ring-offset-white/10" class="hs-dropdown-toggle ti-btn ti-border font-medium bg-white text-gray-700 shadow-sm align-middle hover:bg-gray-50 focus:ring-offset-white focus:ring-primary dark:bg-bgdark dark:hover:bg-black/20 dark:border-white/10 dark:text-white/70 dark:hover:text-white dark:focus:ring-offset-white/10"
......
...@@ -10,6 +10,7 @@ export interface DataModel { ...@@ -10,6 +10,7 @@ export interface DataModel {
name: string name: string
code: string code: string
level: string level: string
weight: number
checked: boolean checked: boolean
} }
@Component({ @Component({
...@@ -29,7 +30,7 @@ export class TypeRegistration { ...@@ -29,7 +30,7 @@ export class TypeRegistration {
dataSelectList: DataModel[] = []; dataSelectList: DataModel[] = [];
dataLoading = false dataLoading = false
dataSelect: DataModel = { id: "", companyId: "", edesc: "", name: "", code: "", level: "", checked: false } dataSelect: DataModel = { id: "", companyId: "", edesc: "", name: "", code: "", level: "", weight: 0.00, checked: false }
competoncy_typeList: { check: boolean; data: DataModel & { checked?: boolean } }[] = [] competoncy_typeList: { check: boolean; data: DataModel & { checked?: boolean } }[] = []
competoncy_type: CompetencytypeModel = new MyCompetencytypeModel({}) competoncy_type: CompetencytypeModel = new MyCompetencytypeModel({})
modalStatus: 'add' | 'edit' | 'delete' | 'deleteGroup' = 'add' modalStatus: 'add' | 'edit' | 'delete' | 'deleteGroup' = 'add'
...@@ -101,7 +102,7 @@ export class TypeRegistration { ...@@ -101,7 +102,7 @@ export class TypeRegistration {
this.dataLoading = true this.dataLoading = true
this.competencytypeService.getList().subscribe({ this.competencytypeService.getList().subscribe({
next: response => { next: response => {
this.competoncy_typeList = response.map(x => ({ check: false, data: { id: x.competencyTypeId, companyId: x.companyId, edesc: x.edesc, name: x.tdesc, code: x.shortName, level: x.expectationLevel, checked: false } })) this.competoncy_typeList = response.map(x => ({ check: false, data: { id: x.competencyTypeId, companyId: x.companyId, edesc: x.edesc, name: x.tdesc, code: x.shortName, weight: x.weight, level: x.expectationLevel, checked: false } }))
this.dataLoading = false this.dataLoading = false
this.isDataListCheckedAll = false this.isDataListCheckedAll = false
this.dataListCheckAll() this.dataListCheckAll()
...@@ -153,7 +154,7 @@ export class TypeRegistration { ...@@ -153,7 +154,7 @@ export class TypeRegistration {
let body: CompetencytypeModel | CompetencytypeModel[] = []; let body: CompetencytypeModel | CompetencytypeModel[] = [];
if (this.dataSelect.id) { if (this.dataSelect.id) {
body = new MyCompetencytypeModel({ competencyTypeId: this.dataSelect.id, tdesc: this.dataSelect.name, edesc: this.dataSelect.edesc, shortName: this.dataSelect.code, expectationLevel: this.dataSelect.level }); body = new MyCompetencytypeModel({ competencyTypeId: this.dataSelect.id, tdesc: this.dataSelect.name, edesc: this.dataSelect.edesc, shortName: this.dataSelect.code, weight: +(this.dataSelect.weight), expectationLevel: this.dataSelect.level });
} else { } else {
body = this.competoncy_typeList.filter(x => x.check).map(x => new MyCompetencytypeModel({ competencyTypeId: x.data.id, tdesc: x.data.name, edesc: x.data.edesc, shortName: x.data.code, expectationLevel: x.data.level })); body = this.competoncy_typeList.filter(x => x.check).map(x => new MyCompetencytypeModel({ competencyTypeId: x.data.id, tdesc: x.data.name, edesc: x.data.edesc, shortName: x.data.code, expectationLevel: x.data.level }));
} }
...@@ -205,7 +206,7 @@ export class TypeRegistration { ...@@ -205,7 +206,7 @@ export class TypeRegistration {
if (modalStatus == 'add') { if (modalStatus == 'add') {
this.setData() this.setData()
} else if (modalStatus == 'edit') { } else if (modalStatus == 'edit') {
this.setData({ id: this.dataSelect.id, companyId: "", name: "", edesc: "", code: "", level: "", checked: this.dataSelect.checked }) this.setData({ id: this.dataSelect.id, companyId: "", name: "", edesc: "", code: "", level: "", weight: 0.00, checked: this.dataSelect.checked })
} }
} }
} }
......
<!-- <app-page-header [pathTitle]="pathTitle"></app-page-header> <ng-container *ngIf="appraisalCompentency.data">
<div class="bg-card-white"> <div class="pb-2rem px-2rem pt-1.5rem w-full min-height-50px justify-between items-center">
</div> <div class="flex">
<div class="block-main-content"> <button type="button" class="ti-btn ti-btn-outline ti-btn-outline-light h-20px m-0 shadow-md text-blue-500"
<ng-container *ngTemplateOutlet="selfEvaluationEdit"></ng-container> (click)="returnPath()">
</div> <i class="ti ti-chevron-left"></i>
ย้อนกลับ
<ng-template #selfEvaluationEdit> </button>
<ng-container *ngIf="appraisalCompentency2.data"> <div class="font-size-18px font-weight-700 align-center text-primary pl-1rem">
<div class="pb-2rem px-2rem pt-1.5rem w-full min-height-50px justify-between items-center"> ประเมินผลประจำปี {{currentDate.getFullYear()}}
<div class="flex">
<button type="button"
class="ti-btn ti-btn-outline ti-btn-outline-light h-20px m-0 shadow-md text-blue-500"
(click)="returnPath()">
<i class="ti ti-chevron-left"></i>
ย้อนกลับ
</button>
<div class="font-size-18px font-weight-700 align-center text-primary pl-1rem">
ประเมินผลประจำปี {{currentDate.getFullYear()}}
</div>
</div> </div>
</div> </div>
<div class="pb-2rem px-2rem"> </div>
<div class="font-size-18px font-weight-700 text-primary"> <div class="pb-2rem px-2rem">
แบบประเมินสมรรถนะพนักงาน ประจำปี 2024 <div class="font-size-18px font-weight-700 text-primary">
</div> แบบประเมินสมรรถนะพนักงาน {{currentDate.getFullYear()}}
</div> </div>
<div class="pb-2rem px-2rem"> </div>
<div class="p-2 grid grid-cols-6 gap-3"> <div class="pb-2rem px-2rem">
<div class="grid-cols-1"> <div class="p-2 grid grid-cols-6 gap-3">
<div class="text-gray-400">เครื่องมือประเมิน</div> <div class="grid-cols-1">
<div class="text-gray-400">O = แบบสังเกต</div> <div class="text-gray-400">เครื่องมือประเมิน</div>
<div class="text-gray-400">P = แบบการปฏิบัติงาน</div> <div class="text-gray-400">O = แบบสังเกต</div>
<div class="text-gray-400">D = การบันทึก/เอกสาร</div> <div class="text-gray-400">P = แบบการปฏิบัติงาน</div>
<div class="text-gray-400">I = การสัมภาษณ์</div> <div class="text-gray-400">D = การบันทึก/เอกสาร</div>
<div class="text-gray-400">T = แบบทดสอบ</div> <div class="text-gray-400">I = การสัมภาษณ์</div>
</div> <div class="text-gray-400">T = แบบทดสอบ</div>
<div class="grid-cols-1"> </div>
<div class="text-gray-400">คำชี้แจง</div> <div class="grid-cols-1">
<div class="text-gray-400">- ใช้วิธีประเมินโดย ผู้บังคับบัญชา = 100 %</div> <div class="text-gray-400">คำชี้แจง</div>
</div> <div class="text-gray-400">- ใช้วิธีประเมินโดย ผู้บังคับบัญชา = 100 %</div>
<div class="col-span-3 grid-cols-1"> </div>
<div class="text-gray-400">ระดับความสามารถ (Target Degree)</div> <div class="col-span-3 grid-cols-1">
<div class="text-gray-400">ระดับ 1 = ไม่มีความรู้พื้นฐานเลย ขาดทักษะในงาน</div> <div class="text-gray-400">ระดับความสามารถ (Target Degree)</div>
<div class="text-gray-400">ระดับ 2 = มีความรู้ในงานบ้างแต่ยังไม่สามารถ ประยุกต์ใช้ในงานได้</div> <div class="text-gray-400">ระดับ 1 = ไม่มีความรู้พื้นฐานเลย ขาดทักษะในงาน</div>
<div class="text-gray-400">ระดับ 3 = นำความรู้มาประยุกต์ใช้ในงานได้ ปฏิบัติงานเองได้ด้วยตัวเอง <div class="text-gray-400">ระดับ 2 = มีความรู้ในงานบ้างแต่ยังไม่สามารถ ประยุกต์ใช้ในงานได้</div>
แก้ไขปัญหาหน้างานได้</div> <div class="text-gray-400">ระดับ 3 = นำความรู้มาประยุกต์ใช้ในงานได้ ปฏิบัติงานเองได้ด้วยตัวเอง
<div class="text-gray-400">ระดับ 4 = สอนผู้อื่นได้ มีความคล่องตัว เชื่อมโยง ความรู้ในงานได้</div> แก้ไขปัญหาหน้างานได้</div>
<div class="text-gray-400">ระดับ 5 = มีความชำนาญ เชี่ยวชาญ เป็นที่ยอมรับ ในองค์กร</div> <div class="text-gray-400">ระดับ 4 = สอนผู้อื่นได้ มีความคล่องตัว เชื่อมโยง ความรู้ในงานได้</div>
</div> <div class="text-gray-400">ระดับ 5 = มีความชำนาญ เชี่ยวชาญ เป็นที่ยอมรับ ในองค์กร</div>
</div> </div>
</div> </div>
<div class="pb-2rem px-2rem"> </div>
<div class="overflow-auto rounded-top-0.65rem"> <div class="pb-2rem px-2rem">
<table class="ti-custom-table ti-custom-table-head ti-custom-table-hover2"> <div class="overflow-auto rounded-top-0.65rem">
<thead class="height-50px"> <table class="ti-custom-table ti-custom-table-head ti-custom-table-hover2">
<tr class="font-size-12px"> <thead class="height-50px">
<ng-container <tr class="font-size-12px">
*ngFor="let item of ['ลำดับที่','รหัสสมรรถนะ','ชื่อสมรรถนะ','Behavior Indicator (BI)','เครื่องมือประเมิน\n(ตัวย่อ)\n(O,P,D,I,T)']"> <ng-container
<th scope="col" rowspan="2" *ngFor="let item of ['ลำดับที่','รหัสสมรรถนะ','ชื่อสมรรถนะ','Behavior Indicator (BI)','เครื่องมือประเมิน\n(ตัวย่อ)\n(O,P,D,I,T)']">
class="relative px-10px py-10px bg-soft-secondary text-primary !text-center"> <th scope="col" rowspan="2"
<span class="font-size-12px font-weight-700 ">{{ item }}</span>
<div class="absolute top-1/2 transform -translate-y-1/2 right-0">
<i class="ti ti-dots-vertical fs-l"></i>
</div>
</th>
</ng-container>
<th scope="col" colspan="5"
class="relative px-10px py-10px bg-soft-secondary text-primary !text-center"> class="relative px-10px py-10px bg-soft-secondary text-primary !text-center">
ระดับความสามารถ (Target Degree) <span class="font-size-12px font-weight-700 ">{{ item }}</span>
</th> <div class="absolute top-1/2 transform -translate-y-1/2 right-0">
</tr> <i class="ti ti-dots-vertical fs-l"></i>
<tr class="font-size-12px">
<ng-container *ngFor="let item of [5,4,3,2,1]">
<th scope="col"
class="relative px-10px py-10px bg-soft-secondary text-primary !text-center">
{{item}}
</th>
</ng-container>
</tr>
</thead>
<tbody *ngIf="appraisalCompentency2.loading">
<tr>
<td class="text-center" colspan="100%">
<div *ngFor="let item of [1,2,3]" class="ti-spinner w-8 h-8 text-secondary mx-1"
role="status" aria-label="loading">
<span class="sr-only">Loading...</span>
</div> </div>
</th>
</ng-container>
<th scope="col" colspan="5"
class="relative px-10px py-10px bg-soft-secondary text-primary !text-center">
ระดับความสามารถ (Target Degree)
</th>
</tr>
<tr class="font-size-12px">
<ng-container *ngFor="let item of [5,4,3,2,1]">
<th scope="col"
class="relative px-10px py-10px bg-soft-secondary text-primary !text-center">
{{item}}
</th>
</ng-container>
</tr>
</thead>
<tbody *ngIf="appraisalCompentency.loading">
<tr>
<td class="text-center" colspan="100%">
<div *ngFor="let item of [1,2,3]" class="ti-spinner w-8 h-8 text-secondary mx-1"
role="status" aria-label="loading">
<span class="sr-only">Loading...</span>
</div>
</td>
</tr>
</tbody>
<tbody *ngIf="!appraisalCompentency.loading&&!appraisalCompentencyFilter().length">
<tr>
<td class="text-center" colspan="100%">
ไม่พบข้อมูล
</td>
</tr>
</tbody>
<tbody *ngIf="!appraisalCompentency.loading&&appraisalCompentencyFilter().length">
<ng-container *ngFor="let item2 of appraisalCompentencyFilter();let i = index">
<tr *ngFor="let bi of item2.groupAssessment1.competencyIndicatorsCourses1Mini.behavioralIndicatorsList;let i2 = index;let f = first"
(mouseenter)="hoveredCode = item2.groupAssessment1.competencyIndicatorsCourses1Mini.competencyCourseId"
(mouseleave)="hoveredCode = null"
[ngClass]="{ 'table-hover2': item2.groupAssessment1.competencyIndicatorsCourses1Mini.competencyCourseId === hoveredCode ,'border-none':!f }">
<td class="align-start text-center">
<ng-container *ngIf="f">
{{i+1}}
</ng-container>
</td> </td>
</tr> <td class="align-start text-center">
</tbody> <ng-container *ngIf="f">
<tbody *ngIf="!appraisalCompentency2.loading&&!appraisalCompentency2Filter().length"> {{item2.groupAssessment1.competencyIndicatorsCourses1Mini.competencyIndicatorsCourses0.competencyTopic.competencyTopicId}}
<tr> </ng-container>
<td class="text-center" colspan="100%"> </td>
ไม่พบข้อมูล <td class="align-start !white-space-normal">
<ng-container *ngIf="f">
{{item2.groupAssessment1.competencyIndicatorsCourses1Mini.competencyIndicatorsCourses0.tdesc}}
</ng-container>
</td>
<td class="align-start !white-space-normal">
{{bi.behavioralIndicators}}
</td>
<td class="align-center text-center">
{{bi.assessmentId}}
</td>
<td class="align-center text-center" *ngFor="let value of [5,4,3,2,1]; let i3=index">
<input type="radio" [name]="'radio'+i+''+i2" class="ti-form-radio"
[id]="'radio'+i+''+i2+''+i3" [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [value]="value" [disabled]="!canEdit"
[(ngModel)]="bi.competencyBehavioral.scoreTopicExpectation"
(ngModelChange)="calnumberCheck()">
</td> </td>
</tr> </tr>
</tbody> </ng-container>
<tbody *ngIf="!appraisalCompentency2.loading&&appraisalCompentency2Filter().length"> </tbody>
<ng-container *ngFor="let item2 of appraisalCompentency2Filter();let i = index"> </table>
<tr *ngFor="let bi of item2.groupAssessment1.competencyIndicatorsCourses1Mini.behavioralIndicatorsList;let i2 = index;let f = first"
(mouseenter)="hoveredCode = item2.groupAssessment1.competencyIndicatorsCourses1Mini.competencyCourseId"
(mouseleave)="hoveredCode = null"
[ngClass]="{ 'table-hover2': item2.groupAssessment1.competencyIndicatorsCourses1Mini.competencyCourseId === hoveredCode ,'border-none':!f }">
<td class="align-start text-center">
<ng-container *ngIf="f">
{{i+1}}
</ng-container>
</td>
<td class="align-start text-center">
<ng-container *ngIf="f">
{{item2.groupAssessment1.competencyIndicatorsCourses1Mini.competencyIndicatorsCourses0.competencyTopic.competencyTopicId}}
</ng-container>
</td>
<td class="align-start !white-space-normal">
<ng-container *ngIf="f">
{{item2.groupAssessment1.competencyIndicatorsCourses1Mini.competencyIndicatorsCourses0.tdesc}}
</ng-container>
</td>
<td class="align-start !white-space-normal">
{{bi.behavioralIndicators}}
</td>
<td class="align-center text-center">
{{bi.assessmentId}}
</td>
<td class="align-center text-center" *ngFor="let value of [5,4,3,2,1]; let i3=index">
<input type="radio" [name]="'radio'+i+''+i2" class="ti-form-radio cursor-pointer"
[id]="'radio'+i+''+i2+''+i3" [value]="value" [disabled]="!employee.evaluate"
[(ngModel)]="bi.competencyBehavioral.scoreTopicExpectation"
(ngModelChange)="calnumberCheck()">
</td>
</tr>
</ng-container>
</tbody>
</table>
</div>
</div> </div>
</div>
<div class="pb-1rem px-2rem"> <div class="pb-1rem px-2rem">
<div class="py-2 grid grid-cols-11"> <div class="py-2 grid grid-cols-11">
<div class="col-span-8">ระดับความสามารถ (Target Degree)</div> <div class="col-span-8">ระดับความสามารถ (Target Degree)</div>
<div class="col-span-3 grid grid-cols-5"> <div class="col-span-3 grid grid-cols-5">
<div class="col-span-1 text-center" *ngFor="let item of [5,4,3,2,1]">{{item}}</div> <div class="col-span-1 text-center" *ngFor="let item of [5,4,3,2,1]">{{item}}</div>
</div>
</div> </div>
<div class="py-2 grid grid-cols-11"> </div>
<div class="col-span-8">รวมจำนวนเครื่องหมายแต่ละช่อง (1)</div> <div class="py-2 grid grid-cols-11">
<div class="col-span-3 grid grid-cols-5"> <div class="col-span-8">รวมจำนวนเครื่องหมายแต่ละช่อง (1)</div>
<div class="col-span-1 text-center"> <div class="col-span-3 grid grid-cols-5">
{{appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].numberCheck5}}</div> <div class="col-span-1 text-center">
<div class="col-span-1 text-center"> {{appraisalCompentency.data.masfromEvaluationAssessment1lList[0].numberCheck5}}</div>
{{appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].numberCheck4}}</div> <div class="col-span-1 text-center">
<div class="col-span-1 text-center"> {{appraisalCompentency.data.masfromEvaluationAssessment1lList[0].numberCheck4}}</div>
{{appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].numberCheck3}}</div> <div class="col-span-1 text-center">
<div class="col-span-1 text-center"> {{appraisalCompentency.data.masfromEvaluationAssessment1lList[0].numberCheck3}}</div>
{{appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].numberCheck2}}</div> <div class="col-span-1 text-center">
<div class="col-span-1 text-center"> {{appraisalCompentency.data.masfromEvaluationAssessment1lList[0].numberCheck2}}</div>
{{appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].numberCheck1}}</div> <div class="col-span-1 text-center">
</div> {{appraisalCompentency.data.masfromEvaluationAssessment1lList[0].numberCheck1}}</div>
</div> </div>
<div class="py-2 grid grid-cols-11"> </div>
<div class="col-span-8">ตัวคูณคะแนนในแต่ละช่อง (2)</div> <div class="py-2 grid grid-cols-11">
<div class="col-span-3 grid grid-cols-5"> <div class="col-span-8">ตัวคูณคะแนนในแต่ละช่อง (2)</div>
<div class="col-span-1 text-center">{{setting.data.settingScore5}}</div> <div class="col-span-3 grid grid-cols-5">
<div class="col-span-1 text-center">{{setting.data.settingScore4}}</div> <div class="col-span-1 text-center">{{setting.data.settingScore5}}</div>
<div class="col-span-1 text-center">{{setting.data.settingScore3}}</div> <div class="col-span-1 text-center">{{setting.data.settingScore4}}</div>
<div class="col-span-1 text-center">{{setting.data.settingScore2}}</div> <div class="col-span-1 text-center">{{setting.data.settingScore3}}</div>
<div class="col-span-1 text-center">{{setting.data.settingScore1}}</div> <div class="col-span-1 text-center">{{setting.data.settingScore2}}</div>
</div> <div class="col-span-1 text-center">{{setting.data.settingScore1}}</div>
</div> </div>
<div class="py-2 grid grid-cols-11"> </div>
<div class="col-span-8">ถ่วงน้ำหนักผลรวม 1X2</div> <div class="py-2 grid grid-cols-11">
<div class="col-span-3 grid grid-cols-5"> <div class="col-span-8">ถ่วงน้ำหนักผลรวม 1X2</div>
<div class="col-span-1 text-center" *ngFor="let item of [5,4,3,2,1]">{{calWeightScore(item)}}</div> <div class="col-span-3 grid grid-cols-5">
</div> <div class="col-span-1 text-center" *ngFor="let item of [5,4,3,2,1]">{{calWeightScore(item)}}</div>
</div> </div>
<div class="py-2 grid grid-cols-11"> </div>
<div class="col-span-8">คะแนนรวมหลังถ่วงน้ำ</div> <div class="py-2 grid grid-cols-11">
<div class="col-span-3 grid grid-cols-5"> <div class="col-span-8">คะแนนรวมหลังถ่วงน้ำ</div>
<div class="col-span-5 text-center"> <div class="col-span-3 grid grid-cols-5">
{{appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].weightedTotal}}</div> <div class="col-span-5 text-center">
</div> {{appraisalCompentency.data.masfromEvaluationAssessment1lList[0].weightedTotal}}</div>
</div> </div>
<div class="py-2 grid grid-cols-11"> </div>
<div class="col-span-8">คะแนนเฉลี่ยคิดเป็น</div> <div class="py-2 grid grid-cols-11">
<div class="col-span-3 grid grid-cols-5"> <div class="col-span-8">คะแนนเฉลี่ยคิดเป็น</div>
<div class="col-span-5 text-center"> <div class="col-span-3 grid grid-cols-5">
{{showNumber(appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].averageScore)}} <div class="col-span-5 text-center">
</div> {{showNumber(appraisalCompentency.data.masfromEvaluationAssessment1lList[0].averageScore)}}
</div> </div>
</div> </div>
</div> </div>
</div>
<div class="pb-2rem px-2rem"> <div class="pb-2rem px-2rem">
<div class="overflow-auto rounded-top-0.65rem"> <div class="overflow-auto rounded-top-0.65rem">
<table class="ti-custom-table ti-custom-table-head ti-custom-table-hover"> <table class="ti-custom-table ti-custom-table-head ti-custom-table-hover">
<thead class="height-50px"> <thead class="height-50px">
<tr class="font-size-12px"> <tr class="font-size-12px">
<ng-container <ng-container
*ngFor="let item of ['เกณฑ์การให้คะแนนการประประเมิน Check Sheet E01','ผลประเมิน (A)','สรุปผล Gap'];let f = first ;let l = last"> *ngFor="let item of ['เกณฑ์การให้คะแนนการประประเมิน Check Sheet E01','ผลประเมิน (A)','สรุปผล Gap'];let f = first ;let l = last">
<th scope="col" [attr.rowspan]="f?'1':'2'" [attr.colspan]="f?'2':'1'" <th scope="col" [attr.rowspan]="f?'1':'2'" [attr.colspan]="f?'2':'1'"
class="relative px-10px py-10px bg-soft-secondary text-primary !text-center"> class="relative px-10px py-10px bg-soft-secondary text-primary !text-center">
<span class="font-size-12px font-weight-700 ">{{ item }}</span> <span class="font-size-12px font-weight-700 ">{{ item }}</span>
<div *ngIf="!f&&!l" class="absolute top-1/2 transform -translate-y-1/2 right-0"> <div *ngIf="!f&&!l" class="absolute top-1/2 transform -translate-y-1/2 right-0">
<i class="ti ti-dots-vertical fs-l"></i> <i class="ti ti-dots-vertical fs-l"></i>
</div>
</th>
<th *ngIf="f" scope="col" rowspan="2"
class="relative bg-soft-secondary text-primary !text-center !p-0">
<div class="absolute top-1/2 transform -translate-y-1/2 right-0">
<i class="ti ti-dots-vertical fs-l"></i>
</div>
</th>
</ng-container>
</tr>
<tr class="font-size-12px">
<ng-container *ngFor="let item of ['เกณฑ์การให้คะแนน','เงื่อนไข']">
<th scope="col"
class="relative px-10px py-10px bg-soft-secondary text-primary !text-center">
{{item}}
</th>
</ng-container>
</tr>
</thead>
<tbody *ngIf="checkSheet.length">
<tr *ngFor="let item of checkSheet;let i = index">
<td class="align-start" rowspan="2">
<div *ngFor="let item2 of item.score">
<span>{{item2}} </span><br>
</div> </div>
</td> </th>
<td class="align-start" rowspan="2"> <th *ngIf="f" scope="col" rowspan="2"
<div *ngFor="let item2 of item.condition"> class="relative bg-soft-secondary text-primary !text-center !p-0">
<span>{{item2}} </span><br> <div class="absolute top-1/2 transform -translate-y-1/2 right-0">
<i class="ti ti-dots-vertical fs-l"></i>
</div> </div>
</td> </th>
<td class="!p-0"></td> </ng-container>
<td class="align-start text-center"> </tr>
{{calAverage(appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].averageScore)}} <tr class="font-size-12px">
</td> <ng-container *ngFor="let item of ['เกณฑ์การให้คะแนน','เงื่อนไข']">
<td class="align-start text-center"> <th scope="col"
{{calGap(appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].averageScore)}} class="relative px-10px py-10px bg-soft-secondary text-primary !text-center">
</td> {{item}}
</tr> </th>
<tr> </ng-container>
<td class="align-start !white-space-normal" colspan="4"> </tr>
หมายเหตุ<br> </thead>
ผลการประเมินอาจมีการเปลี่ยนแปลงเงื่อนไขข้อ 1-3 เนื่องจากมีคะแนนต่ำกว่าเกณฑ์ในบางข้อ <tbody *ngIf="checkSheet.length">
</td> <tr *ngFor="let item of checkSheet;let i = index">
</tr> <td class="align-start" rowspan="2">
</tbody> <div *ngFor="let item2 of item.score">
</table> <span>{{item2}} </span><br>
</div>
</td>
<td class="align-start" rowspan="2">
<div *ngFor="let item2 of item.condition">
<span>{{item2}} </span><br>
</div>
</td>
<td class="!p-0"></td>
<td class="align-start text-center">
{{calAverage(appraisalCompentency.data.masfromEvaluationAssessment1lList[0].averageScore)}}
</td>
<td class="align-start text-center">
{{calGap(appraisalCompentency.data.masfromEvaluationAssessment1lList[0].averageScore)}}
</td>
</tr>
<tr>
<td class="align-start !white-space-normal" colspan="4">
หมายเหตุ<br>
ผลการประเมินอาจมีการเปลี่ยนแปลงเงื่อนไขข้อ 1-3 เนื่องจากมีคะแนนต่ำกว่าเกณฑ์ในบางข้อ
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="py-1rem px-2rem">
<div class="py-2 grid grid-cols-7 gap-3">
<div class="col-span-1">ผู้ถูกประเมิน</div>
<div class="col-span-1">
{{appraisalCompentency.data.apsassessy.thFullName}}</div>
<div class="col-span-1">
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none "
[checked]="appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsassessyStatus=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalCompentency.data||appraisalCompentency.data.currentStep!='0'||!canEdit"
[readonly]="!appraisalCompentency.data||appraisalCompentency.data.currentStep!='0'||!canEdit"
[(ngModel)]="appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsassessyComment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsassessyDate)}}
</span>
</div> </div>
</div> </div>
<div class="py-1rem px-2rem"> <div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalCompentency.data.apsapprove1.employeeId">
<div class="py-2 grid grid-cols-7 gap-3"> <div class="col-span-1">
<div class="col-span-1">ผู้ถูกประเมิน</div> {{appraisalCompentency.data.apsapprove2.employeeId?'ผู้ประเมิน1':'ผู้อนุมัติ'}}
<div class="col-span-1">
{{appraisalCompentency2.data.apsassessy.thFullName}}</div>
<div class="col-span-1">
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none "
[checked]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsassessyStatus=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='0'||!employee.evaluate"
[readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='0'||!employee.evaluate"
[(ngModel)]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsassessyComment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsassessyDate)}}
</span>
</div>
</div> </div>
<div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalCompentency2.data.apsapprove1.employeeId"> <div class="col-span-1">
<div class="col-span-1"> {{appraisalCompentency.data.apsapprove1.thFullName}}</div>
{{appraisalCompentency2.data.apsapprove2.employeeId?'ผู้ประเมิน1':'ผู้อนุมัติ'}} <div class="col-span-1">
</div> <input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
<div class="col-span-1"> checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
{{appraisalCompentency2.data.apsapprove1.thFullName}}</div> [checked]="appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsapprove1Status=='2'">
<div class="col-span-1"> <label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
[checked]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove1Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='1'||!employee.evaluate"
[readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='1'||!employee.evaluate"
[(ngModel)]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove1Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove1Date)}}
</span>
</div>
</div> </div>
<div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalCompentency2.data.apsapprove2.employeeId"> <div class="col-span-2">
<div class="col-span-1"> <textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
{{appraisalCompentency2.data.apsapprove3.employeeId?'ผู้ประเมิน2':'ผู้อนุมัติ'}} [class.!bg-input-readonly]="!appraisalCompentency.data||appraisalCompentency.data.currentStep!='1'||!canEdit"
</div> [readonly]="!appraisalCompentency.data||appraisalCompentency.data.currentStep!='1'||!canEdit"
<div class="col-span-1"> [(ngModel)]="appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsapprove1Comment"></textarea>
{{appraisalCompentency2.data.apsapprove2.thFullName}}</div> <span class="pt-2">
<div class="col-span-1"> วันที่ :
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600 {{convertDate(appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsapprove1Date)}}
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none" </span>
[checked]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove2Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='2'||!employee.evaluate"
[readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='2'||!employee.evaluate"
[(ngModel)]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove2Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove2Date)}}
</span>
</div>
</div> </div>
<div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalCompentency2.data.apsapprove3.employeeId"> </div>
<div class="col-span-1"> <div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalCompentency.data.apsapprove2.employeeId">
{{appraisalCompentency2.data.apsapprove4.employeeId?'ผู้ประเมิน3':'ผู้อนุมัติ'}} <div class="col-span-1">
</div> {{appraisalCompentency.data.apsapprove3.employeeId?'ผู้ประเมิน2':'ผู้อนุมัติ'}}
<div class="col-span-1">
{{appraisalCompentency2.data.apsapprove3.thFullName}}</div>
<div class="col-span-1">
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
[checked]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove3Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='3'||!employee.evaluate"
[readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='3'||!employee.evaluate"
[(ngModel)]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove3Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove3Date)}}
</span>
</div>
</div> </div>
<div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalCompentency2.data.apsapprove4.employeeId"> <div class="col-span-1">
<div class="col-span-1"> {{appraisalCompentency.data.apsapprove2.thFullName}}</div>
{{appraisalCompentency2.data.apsapprove5.employeeId?'ผู้ประเมิน4':'ผู้อนุมัติ'}} <div class="col-span-1">
</div> <input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
<div class="col-span-1"> checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
{{appraisalCompentency2.data.apsapprove4.thFullName}}</div> [checked]="appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsapprove2Status=='2'">
<div class="col-span-1"> <label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
[checked]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove4Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='4'||!employee.evaluate"
[readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='4'||!employee.evaluate"
[(ngModel)]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove4Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove4Date)}}
</span>
</div>
</div> </div>
<div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalCompentency2.data.apsapprove5.employeeId"> <div class="col-span-2">
<div class="col-span-1"> <textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
ผู้อนุมัติ [class.!bg-input-readonly]="!appraisalCompentency.data||appraisalCompentency.data.currentStep!='2'||!canEdit"
</div> [readonly]="!appraisalCompentency.data||appraisalCompentency.data.currentStep!='2'||!canEdit"
<div class="col-span-1"> [(ngModel)]="appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsapprove2Comment"></textarea>
{{appraisalCompentency2.data.apsapprove5.thFullName}}</div> <span class="pt-2">
<div class="col-span-1"> วันที่ :
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600 {{convertDate(appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsapprove2Date)}}
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none" </span>
[checked]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove5Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='5'||!employee.evaluate"
[readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='5'||!employee.evaluate"
[(ngModel)]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove5Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove5Date)}}
</span>
</div>
</div> </div>
</div> </div>
<div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalCompentency.data.apsapprove3.employeeId">
<div class="flex justify-center mb-1rem pb-2rem" *ngIf="employee.evaluate"> <div class="col-span-1">
<button type="submit" class="ti-btn ti-btn-success mx-2rem" (click)="saveDraft()"> {{appraisalCompentency.data.apsapprove4.employeeId?'ผู้ประเมิน3':'ผู้อนุมัติ'}}
บันทึกร่าง </div>
</button> <div class="col-span-1">
<button type="submit" class="ti-btn ti-btn-success mx-2rem" (click)="save()"> {{appraisalCompentency.data.apsapprove3.thFullName}}</div>
บันทึกข้อมูล <div class="col-span-1">
</button> <input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
[checked]="appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsapprove3Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalCompentency.data||appraisalCompentency.data.currentStep!='3'||!canEdit"
[readonly]="!appraisalCompentency.data||appraisalCompentency.data.currentStep!='3'||!canEdit"
[(ngModel)]="appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsapprove3Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsapprove3Date)}}
</span>
</div>
</div>
<div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalCompentency.data.apsapprove4.employeeId">
<div class="col-span-1">
{{appraisalCompentency.data.apsapprove5.employeeId?'ผู้ประเมิน4':'ผู้อนุมัติ'}}
</div>
<div class="col-span-1">
{{appraisalCompentency.data.apsapprove4.thFullName}}</div>
<div class="col-span-1">
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
[checked]="appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsapprove4Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalCompentency.data||appraisalCompentency.data.currentStep!='4'||!canEdit"
[readonly]="!appraisalCompentency.data||appraisalCompentency.data.currentStep!='4'||!canEdit"
[(ngModel)]="appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsapprove4Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsapprove4Date)}}
</span>
</div>
</div> </div>
</ng-container> <div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalCompentency.data.apsapprove5.employeeId">
</ng-template> --> <div class="col-span-1">
\ No newline at end of file ผู้อนุมัติ
</div>
<div class="col-span-1">
{{appraisalCompentency.data.apsapprove5.thFullName}}</div>
<div class="col-span-1">
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
[checked]="appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsapprove5Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalCompentency.data||appraisalCompentency.data.currentStep!='5'||!canEdit"
[readonly]="!appraisalCompentency.data||appraisalCompentency.data.currentStep!='5'||!canEdit"
[(ngModel)]="appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsapprove5Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsapprove5Date)}}
</span>
</div>
</div>
</div>
<div class="flex justify-center mb-1rem pb-2rem" *ngIf="canEdit">
<button type="submit" class="ti-btn ti-btn-success mx-2rem" (click)="save('draft')">
บันทึกร่าง
</button>
<button type="submit" class="ti-btn ti-btn-success mx-2rem" (click)="save()">
บันทึกข้อมูล
</button>
</div>
</ng-container>
\ No newline at end of file
import { ChangeDetectorRef, Component, EventEmitter, OnInit, Output, TemplateRef, ViewChild } from '@angular/core'; import { ChangeDetectorRef, Component, Input, OnInit } from '@angular/core';
import { AppraisalCompentencyModel2 } from 'src/app/shared/model/appraisal-competency.model'; import { AppraisalCompentencyModel2 } from 'src/app/shared/model/appraisal-competency.model';
import { SettingAssessmentModel, MySettingAssessmentModel } from 'src/app/shared/model/setting-assessment.model';
import { AppraisalService } from 'src/app/shared/services/appraisal.service'; import { AppraisalService } from 'src/app/shared/services/appraisal.service';
import { EmployeeService } from 'src/app/shared/services/employee.service'; import { EmployeeService } from 'src/app/shared/services/employee.service';
import { SettingAssessmentService } from 'src/app/shared/services/setting-assessment.service'; import { SettingAssessmentService } from 'src/app/shared/services/setting-assessment.service';
...@@ -10,11 +11,24 @@ import Swal from 'sweetalert2'; ...@@ -10,11 +11,24 @@ import Swal from 'sweetalert2';
styleUrls: ['./evaluation.component.scss'] styleUrls: ['./evaluation.component.scss']
}) })
export class EvaluationComponent implements OnInit { export class EvaluationComponent implements OnInit {
appraisalCompentency2: { loading: boolean, data?: AppraisalCompentencyModel2 } = { loading: false, data: undefined } @Input() evaluationRoundId = ""
@Input() evaluateeId = ""
@Input() evaluaterId = ""
@Input() competencyTypeId = ""
canEdit = false
hoveredCode: string | null = null;
currentDate = new Date()
evaluationRoundId = "" appraisalCompentency: { loading: boolean, data?: AppraisalCompentencyModel2 } = { loading: false, data: undefined }
employeeId = "" setting: { loading: boolean, data: SettingAssessmentModel } = { loading: false, data: new MySettingAssessmentModel() }
typeId = ""
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 ตาม %"],
}]
constructor(private appraisalService: AppraisalService, constructor(private appraisalService: AppraisalService,
private employeeService: EmployeeService, private employeeService: EmployeeService,
private cdr: ChangeDetectorRef, private cdr: ChangeDetectorRef,
...@@ -22,62 +36,326 @@ export class EvaluationComponent implements OnInit { ...@@ -22,62 +36,326 @@ export class EvaluationComponent implements OnInit {
) { ) {
} }
ngOnInit(): void { ngOnInit(): void {
// this.getEvaluatee() this.getAppraisalCompentencyForm()
// this.getAppraisalCompentencyList() this.getSettingList()
// this.getSettingList() }
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()
}
})
}
getAppraisalCompentencyForm() {
this.appraisalCompentency.loading = true
this.appraisalService.getFormCompentencyById(this.evaluationRoundId, this.evaluateeId, this.competencyTypeId).subscribe({
next: response => {
this.appraisalCompentency.data = JSON.parse(JSON.stringify(response))
if (this.appraisalCompentency.data?.masfromEvaluationAssessment1lList[0]) {
switch (this.appraisalCompentency.data?.currentStep) {
case ("0"): {
this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsassessyDate = this.currentDate.toISOString().split('T')[0];
this.canEdit = this.evaluaterId == this.appraisalCompentency.data.apsassessy.employeeId
break
}
case ("1"): {
this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsapprove1Date = this.currentDate.toISOString().split('T')[0];
this.canEdit = this.evaluaterId == this.appraisalCompentency.data.apsapprove1.employeeId
break
}
case ("2"): {
this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsapprove2Date = this.currentDate.toISOString().split('T')[0];
this.canEdit = this.evaluaterId == this.appraisalCompentency.data.apsapprove2.employeeId
break
}
case ("3"): {
this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsapprove3Date = this.currentDate.toISOString().split('T')[0];
this.canEdit = this.evaluaterId == this.appraisalCompentency.data.apsapprove3.employeeId
break
}
case ("4"): {
this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsapprove4Date = this.currentDate.toISOString().split('T')[0];
this.canEdit = this.evaluaterId == this.appraisalCompentency.data.apsapprove4.employeeId
break
}
case ("5"): {
this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0].apsapprove5Date = this.currentDate.toISOString().split('T')[0];
this.canEdit = this.evaluaterId == this.appraisalCompentency.data.apsapprove5.employeeId
break
}
default: { return }
}
}
this.calnumberCheck()
this.appraisalCompentency.loading = false
this.cdr.detectChanges()
}, error: error => {
this.appraisalCompentency.loading = false
this.cdr.detectChanges()
}
})
}
appraisalCompentencyFilter() {
return this.appraisalCompentency.data?.masfromEvaluationAssessment1lList[0].masfromEvaluationAssessment2List || []
} }
getAppraisalCompentencyForm(typeId: string) { calnumberCheck() {
// this.appraisalCompentency2.loading = true if (this.appraisalCompentency.data?.masfromEvaluationAssessment1lList[0]) {
// const evaluationRoundId = this.appraisalCompentency.select?.masfromEvaluationRound.evaluationRoundId || "test1" this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0].numberCheck1 = this.appraisalCompentency.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)
// if (evaluationRoundId || this.byBoss) { this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0].numberCheck2 = this.appraisalCompentency.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.appraisalService.getFormCompentencyById(this.evaluationRoundId, employeeId, typeId).subscribe({ this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0].numberCheck3 = this.appraisalCompentency.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)
// next: response => { this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0].numberCheck4 = this.appraisalCompentency.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 = JSON.parse(JSON.stringify(response)) this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0].numberCheck5 = this.appraisalCompentency.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)
// if (this.appraisalCompentency2.data?.masfromEvaluationAssessment1lList[0]) { this.calWeightTotal()
// switch (this.appraisalCompentency2.data?.currentStep) { }
// case ("0"): { this.cdr.detectChanges()
// this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsassessyDate = this.currentDate.toISOString().split('T')[0]; }
// this.employee.evaluate = this.employee.data.employeeId == this.appraisalCompentency2.data.apsassessy.employeeId calWeightScore(numberCheck: number) {
// break if (this.appraisalCompentency.data?.masfromEvaluationAssessment1lList[0]) {
// } switch (numberCheck) {
// case ("1"): { case (1): {
// this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove1Date = this.currentDate.toISOString().split('T')[0]; return +(this.setting.data.settingScore1) * this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0].numberCheck1
// this.employee.evaluate = this.employee.data.employeeId == this.appraisalCompentency2.data.apsapprove1.employeeId }
// break case (2): {
// } return +(this.setting.data.settingScore2) * this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0].numberCheck2
// case ("2"): { }
// this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove2Date = this.currentDate.toISOString().split('T')[0]; case (3): {
// this.employee.evaluate = this.employee.data.employeeId == this.appraisalCompentency2.data.apsapprove2.employeeId return +(this.setting.data.settingScore3) * this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0].numberCheck3
// break }
// } case (4): {
// case ("3"): { return +(this.setting.data.settingScore4) * this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0].numberCheck4
// this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove3Date = this.currentDate.toISOString().split('T')[0]; }
// this.employee.evaluate = this.employee.data.employeeId == this.appraisalCompentency2.data.apsapprove3.employeeId case (5): {
// break return +(this.setting.data.settingScore5) * this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0].numberCheck5
// } }
// case ("4"): { default: { return }
// 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 return
// } }
// case ("5"): { calWeightTotal() {
// this.appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove5Date = this.currentDate.toISOString().split('T')[0]; if (this.appraisalCompentency.data?.masfromEvaluationAssessment1lList[0]) {
// this.employee.evaluate = this.employee.data.employeeId == this.appraisalCompentency2.data.apsapprove5.employeeId this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0].weightedTotal = 0
// break this.appraisalCompentency.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()
// default: { return } this.calAverageScore()
// } }
// } }
// this.calnumberCheck() calAverageScore() {
// this.appraisalCompentency2.loading = false if (this.appraisalCompentency.data?.masfromEvaluationAssessment1lList[0]) {
// this.cdr.detectChanges() const total = this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0].masfromEvaluationAssessment2List.map((x: any) => x.groupAssessment1.competencyIndicatorsCourses1Mini.behavioralIndicatorsList.length).reduce((acc: any, num: any) => acc + num, 0) * 5
// }, error: error => { if (total) {
// this.appraisalCompentency2.loading = false this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0].averageScore = 0
// this.cdr.detectChanges() this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0].averageScore = (this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0].weightedTotal / total) * 100
// } this.cdr.detectChanges()
// }) }
}
}
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";
}
}
calGap(score: number | string) {
if (this.appraisalCompentency.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.appraisalCompentency.data?.masfromEvaluationAssessment1lList[0].numberCheck1 || this.appraisalCompentency.data?.masfromEvaluationAssessment1lList[0].numberCheck2 || this.appraisalCompentency.data?.masfromEvaluationAssessment1lList[0].numberCheck3) {
return "-1";
}
return "+1";
} else if (roundedScore >= 80 && roundedScore <= 89) {
if (this.appraisalCompentency.data?.masfromEvaluationAssessment1lList[0].numberCheck1 || this.appraisalCompentency.data?.masfromEvaluationAssessment1lList[0].numberCheck2 || this.appraisalCompentency.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
}
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' }) || ''
}
showNumber(text: number | string) {
const num = Number(text);
return isNaN(num) ? 0 : +num.toFixed(2);
}
returnPath() {
// if (this.byBoss) {
// this.returnPageEvalution()
// } else {
// this.currentTemplate = this.selfEvaluation;
// this.pathTitle = ['การประเมินผล', 'ประเมินตนเอง']
// } // }
} }
save(status?: string) {
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: status == 'draft' ? 'บันทึกแบบร่าง' : 'บันทึกข้อมูล',
text: status == 'draft' ? 'คุณต้องการบันทึกแบบร่างของการประเมินนี้ใช่หรือไม่' : 'คุณต้องการบันทึกข้อมูลการประเมินนี้ใช่หรือไม่',
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.appraisalCompentency) {
this.saveApi(status)
} else if (result.dismiss === Swal.DismissReason.cancel) {
Swal.fire({
title: 'ยกเลิก!',
text: 'การบันทึกถูกยกเลิก',
icon: 'error',
customClass: {
confirmButton: '!swal2-button-bg-danger',
}
})
}
})
}
saveApi(status?: string) {
let body = this.appraisalCompentency.data
switch (this.appraisalCompentency.data?.currentStep) {
case ("0"): {
body = {
...this.appraisalCompentency.data, masfromEvaluationAssessment1lList: [{
...this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0],
apsassessyStatus: status == 'draft' ? '1' : '2'
}]
}
break
}
case ("1"): {
body = {
...this.appraisalCompentency.data, masfromEvaluationAssessment1lList: [{
...this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0],
apsapprove1Status: status == 'draft' ? '1' : '2'
}]
}
break
}
case ("2"): {
body = {
...this.appraisalCompentency.data, masfromEvaluationAssessment1lList: [{
...this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0],
apsapprove2Status: status == 'draft' ? '1' : '2'
}]
}
break
}
case ("3"): {
body = {
...this.appraisalCompentency.data, masfromEvaluationAssessment1lList: [{
...this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0],
apsapprove3Status: status == 'draft' ? '1' : '2'
}]
}
break
}
case ("4"): {
body = {
...this.appraisalCompentency.data, masfromEvaluationAssessment1lList: [{
...this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0],
apsapprove4Status: status == 'draft' ? '1' : '2'
}]
}
break
}
case ("5"): {
body = {
...this.appraisalCompentency.data, masfromEvaluationAssessment1lList: [{
...this.appraisalCompentency.data.masfromEvaluationAssessment1lList[0],
apsapprove5Status: status == 'draft' ? '1' : '2'
}]
}
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',
}
});
this.getAppraisalCompentencyForm()
} 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',
}
});
}
})
}
} }
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
</div> </div>
<ng-template #selfEvaluation> <ng-template #selfEvaluation>
<div class="font-size-18px font-weight-700 pt-1.5rem text-primary px-2rem" *ngIf="!byBoss"> <div class="font-size-18px font-weight-700 pt-1.5rem text-primary px-2rem">
ประเมินผลประจำปี {{currentDate.getFullYear()}} ประเมินผลประจำปี {{currentDate.getFullYear()}}
</div> </div>
<div class="pt-0.75rem"> <div class="pt-0.75rem">
...@@ -117,7 +117,7 @@ ...@@ -117,7 +117,7 @@
{{masfromEvaluationAssessment1.masfromStatusType.tdesc}} {{masfromEvaluationAssessment1.masfromStatusType.tdesc}}
</td> </td>
<td class="flex justify-center items-center"> <td class="flex justify-center items-center">
<span class="rounded-md bg-success text-white px-3 py-1 cursor-pointer" (click)="getAppraisalCompentencyForm(masfromEvaluationAssessment1.competencyType.competencyTypeId);currentTemplate = selfEvaluationEdit ; <span class="rounded-md bg-success text-white px-3 py-1 cursor-pointer" (click)="selectCompentencyForm(masfromEvaluationAssessment1.competencyType.competencyTypeId);currentTemplate = selfEvaluationEdit ;
pathTitle = ['การประเมินผล', 'ประเมินตนเอง','ประเมินผล']"> pathTitle = ['การประเมินผล', 'ประเมินตนเอง','ประเมินผล']">
ประเมิน ประเมิน
</span> </span>
...@@ -201,398 +201,7 @@ ...@@ -201,398 +201,7 @@
<ng-template #selfEvaluationEdit> <ng-template #selfEvaluationEdit>
<ng-container *ngIf="appraisalCompentency2.data"> <app-evaluation [evaluationRoundId]="appraisalCompentency.select?.masfromEvaluationRound?.evaluationRoundId || ''"
<div class="pb-2rem px-2rem pt-1.5rem w-full min-height-50px justify-between items-center"> [evaluaterId]="evaluatee.data.employeeId" [evaluateeId]="evaluatee.data.employeeId"
<div class="flex"> [competencyTypeId]="competencyTypeId"></app-evaluation>
<button type="button"
class="ti-btn ti-btn-outline ti-btn-outline-light h-20px m-0 shadow-md text-blue-500"
(click)="returnPath()">
<i class="ti ti-chevron-left"></i>
ย้อนกลับ
</button>
<div class="font-size-18px font-weight-700 align-center text-primary pl-1rem">
ประเมินผลประจำปี {{currentDate.getFullYear()}}
</div>
</div>
</div>
<div class="pb-2rem px-2rem">
<div class="font-size-18px font-weight-700 text-primary">
แบบประเมินสมรรถนะพนักงาน ประจำปี 2024
</div>
</div>
<div class="pb-2rem px-2rem">
<div class="p-2 grid grid-cols-6 gap-3">
<div class="grid-cols-1">
<div class="text-gray-400">เครื่องมือประเมิน</div>
<div class="text-gray-400">O = แบบสังเกต</div>
<div class="text-gray-400">P = แบบการปฏิบัติงาน</div>
<div class="text-gray-400">D = การบันทึก/เอกสาร</div>
<div class="text-gray-400">I = การสัมภาษณ์</div>
<div class="text-gray-400">T = แบบทดสอบ</div>
</div>
<div class="grid-cols-1">
<div class="text-gray-400">คำชี้แจง</div>
<div class="text-gray-400">- ใช้วิธีประเมินโดย ผู้บังคับบัญชา = 100 %</div>
</div>
<div class="col-span-3 grid-cols-1">
<div class="text-gray-400">ระดับความสามารถ (Target Degree)</div>
<div class="text-gray-400">ระดับ 1 = ไม่มีความรู้พื้นฐานเลย ขาดทักษะในงาน</div>
<div class="text-gray-400">ระดับ 2 = มีความรู้ในงานบ้างแต่ยังไม่สามารถ ประยุกต์ใช้ในงานได้</div>
<div class="text-gray-400">ระดับ 3 = นำความรู้มาประยุกต์ใช้ในงานได้ ปฏิบัติงานเองได้ด้วยตัวเอง
แก้ไขปัญหาหน้างานได้</div>
<div class="text-gray-400">ระดับ 4 = สอนผู้อื่นได้ มีความคล่องตัว เชื่อมโยง ความรู้ในงานได้</div>
<div class="text-gray-400">ระดับ 5 = มีความชำนาญ เชี่ยวชาญ เป็นที่ยอมรับ ในองค์กร</div>
</div>
</div>
</div>
<div class="pb-2rem px-2rem">
<div class="overflow-auto rounded-top-0.65rem">
<table class="ti-custom-table ti-custom-table-head ti-custom-table-hover2">
<thead class="height-50px">
<tr class="font-size-12px">
<ng-container
*ngFor="let item of ['ลำดับที่','รหัสสมรรถนะ','ชื่อสมรรถนะ','Behavior Indicator (BI)','เครื่องมือประเมิน\n(ตัวย่อ)\n(O,P,D,I,T)']">
<th scope="col" rowspan="2"
class="relative px-10px py-10px bg-soft-secondary text-primary !text-center">
<span class="font-size-12px font-weight-700 ">{{ item }}</span>
<div class="absolute top-1/2 transform -translate-y-1/2 right-0">
<i class="ti ti-dots-vertical fs-l"></i>
</div>
</th>
</ng-container>
<th scope="col" colspan="5"
class="relative px-10px py-10px bg-soft-secondary text-primary !text-center">
ระดับความสามารถ (Target Degree)
</th>
</tr>
<tr class="font-size-12px">
<ng-container *ngFor="let item of [5,4,3,2,1]">
<th scope="col"
class="relative px-10px py-10px bg-soft-secondary text-primary !text-center">
{{item}}
</th>
</ng-container>
</tr>
</thead>
<tbody *ngIf="appraisalCompentency2.loading">
<tr>
<td class="text-center" colspan="100%">
<div *ngFor="let item of [1,2,3]" class="ti-spinner w-8 h-8 text-secondary mx-1"
role="status" aria-label="loading">
<span class="sr-only">Loading...</span>
</div>
</td>
</tr>
</tbody>
<tbody *ngIf="!appraisalCompentency2.loading&&!appraisalCompentency2Filter().length">
<tr>
<td class="text-center" colspan="100%">
ไม่พบข้อมูล
</td>
</tr>
</tbody>
<tbody *ngIf="!appraisalCompentency2.loading&&appraisalCompentency2Filter().length">
<ng-container *ngFor="let item2 of appraisalCompentency2Filter();let i = index">
<tr *ngFor="let bi of item2.groupAssessment1.competencyIndicatorsCourses1Mini.behavioralIndicatorsList;let i2 = index;let f = first"
(mouseenter)="hoveredCode = item2.groupAssessment1.competencyIndicatorsCourses1Mini.competencyCourseId"
(mouseleave)="hoveredCode = null"
[ngClass]="{ 'table-hover2': item2.groupAssessment1.competencyIndicatorsCourses1Mini.competencyCourseId === hoveredCode ,'border-none':!f }">
<td class="align-start text-center">
<ng-container *ngIf="f">
{{i+1}}
</ng-container>
</td>
<td class="align-start text-center">
<ng-container *ngIf="f">
{{item2.groupAssessment1.competencyIndicatorsCourses1Mini.competencyIndicatorsCourses0.competencyTopic.competencyTopicId}}
</ng-container>
</td>
<td class="align-start !white-space-normal">
<ng-container *ngIf="f">
{{item2.groupAssessment1.competencyIndicatorsCourses1Mini.competencyIndicatorsCourses0.tdesc}}
</ng-container>
</td>
<td class="align-start !white-space-normal">
{{bi.behavioralIndicators}}
</td>
<td class="align-center text-center">
{{bi.assessmentId}}
</td>
<td class="align-center text-center" *ngFor="let value of [5,4,3,2,1]; let i3=index">
<input type="radio" [name]="'radio'+i+''+i2" class="ti-form-radio cursor-pointer"
[id]="'radio'+i+''+i2+''+i3" [value]="value" [disabled]="!employee.evaluate"
[(ngModel)]="bi.competencyBehavioral.scoreTopicExpectation"
(ngModelChange)="calnumberCheck()">
</td>
</tr>
</ng-container>
</tbody>
</table>
</div>
</div>
<div class="pb-1rem px-2rem">
<div class="py-2 grid grid-cols-11">
<div class="col-span-8">ระดับความสามารถ (Target Degree)</div>
<div class="col-span-3 grid grid-cols-5">
<div class="col-span-1 text-center" *ngFor="let item of [5,4,3,2,1]">{{item}}</div>
</div>
</div>
<div class="py-2 grid grid-cols-11">
<div class="col-span-8">รวมจำนวนเครื่องหมายแต่ละช่อง (1)</div>
<div class="col-span-3 grid grid-cols-5">
<div class="col-span-1 text-center">
{{appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].numberCheck5}}</div>
<div class="col-span-1 text-center">
{{appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].numberCheck4}}</div>
<div class="col-span-1 text-center">
{{appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].numberCheck3}}</div>
<div class="col-span-1 text-center">
{{appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].numberCheck2}}</div>
<div class="col-span-1 text-center">
{{appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].numberCheck1}}</div>
</div>
</div>
<div class="py-2 grid grid-cols-11">
<div class="col-span-8">ตัวคูณคะแนนในแต่ละช่อง (2)</div>
<div class="col-span-3 grid grid-cols-5">
<div class="col-span-1 text-center">{{setting.data.settingScore5}}</div>
<div class="col-span-1 text-center">{{setting.data.settingScore4}}</div>
<div class="col-span-1 text-center">{{setting.data.settingScore3}}</div>
<div class="col-span-1 text-center">{{setting.data.settingScore2}}</div>
<div class="col-span-1 text-center">{{setting.data.settingScore1}}</div>
</div>
</div>
<div class="py-2 grid grid-cols-11">
<div class="col-span-8">ถ่วงน้ำหนักผลรวม 1X2</div>
<div class="col-span-3 grid grid-cols-5">
<div class="col-span-1 text-center" *ngFor="let item of [5,4,3,2,1]">{{calWeightScore(item)}}</div>
</div>
</div>
<div class="py-2 grid grid-cols-11">
<div class="col-span-8">คะแนนรวมหลังถ่วงน้ำ</div>
<div class="col-span-3 grid grid-cols-5">
<div class="col-span-5 text-center">
{{appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].weightedTotal}}</div>
</div>
</div>
<div class="py-2 grid grid-cols-11">
<div class="col-span-8">คะแนนเฉลี่ยคิดเป็น</div>
<div class="col-span-3 grid grid-cols-5">
<div class="col-span-5 text-center">
{{showNumber(appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].averageScore)}}
</div>
</div>
</div>
</div>
<div class="pb-2rem px-2rem">
<div class="overflow-auto rounded-top-0.65rem">
<table class="ti-custom-table ti-custom-table-head ti-custom-table-hover">
<thead class="height-50px">
<tr class="font-size-12px">
<ng-container
*ngFor="let item of ['เกณฑ์การให้คะแนนการประประเมิน Check Sheet E01','ผลประเมิน (A)','สรุปผล Gap'];let f = first ;let l = last">
<th scope="col" [attr.rowspan]="f?'1':'2'" [attr.colspan]="f?'2':'1'"
class="relative px-10px py-10px bg-soft-secondary text-primary !text-center">
<span class="font-size-12px font-weight-700 ">{{ item }}</span>
<div *ngIf="!f&&!l" class="absolute top-1/2 transform -translate-y-1/2 right-0">
<i class="ti ti-dots-vertical fs-l"></i>
</div>
</th>
<th *ngIf="f" scope="col" rowspan="2"
class="relative bg-soft-secondary text-primary !text-center !p-0">
<div class="absolute top-1/2 transform -translate-y-1/2 right-0">
<i class="ti ti-dots-vertical fs-l"></i>
</div>
</th>
</ng-container>
</tr>
<tr class="font-size-12px">
<ng-container *ngFor="let item of ['เกณฑ์การให้คะแนน','เงื่อนไข']">
<th scope="col"
class="relative px-10px py-10px bg-soft-secondary text-primary !text-center">
{{item}}
</th>
</ng-container>
</tr>
</thead>
<tbody *ngIf="checkSheet.length">
<tr *ngFor="let item of checkSheet;let i = index">
<td class="align-start" rowspan="2">
<div *ngFor="let item2 of item.score">
<span>{{item2}} </span><br>
</div>
</td>
<td class="align-start" rowspan="2">
<div *ngFor="let item2 of item.condition">
<span>{{item2}} </span><br>
</div>
</td>
<td class="!p-0"></td>
<td class="align-start text-center">
{{calAverage(appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].averageScore)}}
</td>
<td class="align-start text-center">
{{calGap(appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].averageScore)}}
</td>
</tr>
<tr>
<td class="align-start !white-space-normal" colspan="4">
หมายเหตุ<br>
ผลการประเมินอาจมีการเปลี่ยนแปลงเงื่อนไขข้อ 1-3 เนื่องจากมีคะแนนต่ำกว่าเกณฑ์ในบางข้อ
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="py-1rem px-2rem">
<div class="py-2 grid grid-cols-7 gap-3">
<div class="col-span-1">ผู้ถูกประเมิน</div>
<div class="col-span-1">
{{appraisalCompentency2.data.apsassessy.thFullName}}</div>
<div class="col-span-1">
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none "
[checked]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsassessyStatus=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='0'||!employee.evaluate"
[readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='0'||!employee.evaluate"
[(ngModel)]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsassessyComment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsassessyDate)}}
</span>
</div>
</div>
<div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalCompentency2.data.apsapprove1.employeeId">
<div class="col-span-1">
{{appraisalCompentency2.data.apsapprove2.employeeId?'ผู้ประเมิน1':'ผู้อนุมัติ'}}
</div>
<div class="col-span-1">
{{appraisalCompentency2.data.apsapprove1.thFullName}}</div>
<div class="col-span-1">
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
[checked]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove1Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='1'||!employee.evaluate"
[readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='1'||!employee.evaluate"
[(ngModel)]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove1Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove1Date)}}
</span>
</div>
</div>
<div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalCompentency2.data.apsapprove2.employeeId">
<div class="col-span-1">
{{appraisalCompentency2.data.apsapprove3.employeeId?'ผู้ประเมิน2':'ผู้อนุมัติ'}}
</div>
<div class="col-span-1">
{{appraisalCompentency2.data.apsapprove2.thFullName}}</div>
<div class="col-span-1">
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
[checked]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove2Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='2'||!employee.evaluate"
[readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='2'||!employee.evaluate"
[(ngModel)]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove2Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove2Date)}}
</span>
</div>
</div>
<div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalCompentency2.data.apsapprove3.employeeId">
<div class="col-span-1">
{{appraisalCompentency2.data.apsapprove4.employeeId?'ผู้ประเมิน3':'ผู้อนุมัติ'}}
</div>
<div class="col-span-1">
{{appraisalCompentency2.data.apsapprove3.thFullName}}</div>
<div class="col-span-1">
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
[checked]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove3Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='3'||!employee.evaluate"
[readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='3'||!employee.evaluate"
[(ngModel)]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove3Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove3Date)}}
</span>
</div>
</div>
<div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalCompentency2.data.apsapprove4.employeeId">
<div class="col-span-1">
{{appraisalCompentency2.data.apsapprove5.employeeId?'ผู้ประเมิน4':'ผู้อนุมัติ'}}
</div>
<div class="col-span-1">
{{appraisalCompentency2.data.apsapprove4.thFullName}}</div>
<div class="col-span-1">
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
[checked]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove4Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='4'||!employee.evaluate"
[readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='4'||!employee.evaluate"
[(ngModel)]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove4Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove4Date)}}
</span>
</div>
</div>
<div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalCompentency2.data.apsapprove5.employeeId">
<div class="col-span-1">
ผู้อนุมัติ
</div>
<div class="col-span-1">
{{appraisalCompentency2.data.apsapprove5.thFullName}}</div>
<div class="col-span-1">
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
[checked]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove5Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='5'||!employee.evaluate"
[readonly]="!appraisalCompentency2.data||appraisalCompentency2.data.currentStep!='5'||!employee.evaluate"
[(ngModel)]="appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove5Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalCompentency2.data.masfromEvaluationAssessment1lList[0].apsapprove5Date)}}
</span>
</div>
</div>
</div>
<div class="flex justify-center mb-1rem pb-2rem" *ngIf="employee.evaluate">
<button type="submit" class="ti-btn ti-btn-success mx-2rem" (click)="saveDraft()">
บันทึกร่าง
</button>
<button type="submit" class="ti-btn ti-btn-success mx-2rem" (click)="save()">
บันทึกข้อมูล
</button>
</div>
</ng-container>
</ng-template> </ng-template>
\ No newline at end of file
import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, SimpleChanges, TemplateRef, ViewChild } from '@angular/core'; import { ChangeDetectorRef, Component, OnInit, TemplateRef, ViewChild } from '@angular/core';
import { AppraisalCompentencyModel, AppraisalCompentencyModel2 } from 'src/app/shared/model/appraisal-competency.model'; import { AppraisalCompentencyModel } from 'src/app/shared/model/appraisal-competency.model';
import { EmployeeModel, MyEmployeeModel } from 'src/app/shared/model/employee.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 { AppraisalService } from 'src/app/shared/services/appraisal.service';
import { EmployeeService } from 'src/app/shared/services/employee.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 { export interface BiModel {
name: string, name: string,
tools: string[], tools: string[],
...@@ -19,11 +15,7 @@ export interface BiModel { ...@@ -19,11 +15,7 @@ export interface BiModel {
styleUrls: ['./self-evaluation.component.scss'] styleUrls: ['./self-evaluation.component.scss']
}) })
export class SelfEvaluationComponent implements OnInit { export class SelfEvaluationComponent implements OnInit {
@Input() pathTitle = ['การประเมินผล', 'ประเมินตนเอง'] pathTitle = ['การประเมินผล', 'ประเมินตนเอง']
@Input() employeeId?: string
@Input() byBoss: boolean = false
@Output() sendPathTitle: EventEmitter<string[]> = new EventEmitter<string[]>();
@Output() sendPageEvalution: EventEmitter<string> = new EventEmitter<string>();
hoveredCode: string | null = null; hoveredCode: string | null = null;
checkSheet: { checkSheet: {
score: string[], score: string[],
...@@ -36,57 +28,24 @@ export class SelfEvaluationComponent implements OnInit { ...@@ -36,57 +28,24 @@ export class SelfEvaluationComponent implements OnInit {
@ViewChild('selfEvaluationEdit', { static: true }) selfEvaluationEdit!: TemplateRef<any>; @ViewChild('selfEvaluationEdit', { static: true }) selfEvaluationEdit!: TemplateRef<any>;
currentTemplate: TemplateRef<any> = this.selfEvaluation currentTemplate: TemplateRef<any> = this.selfEvaluation
appraisalCompentency: { loading: boolean, select?: AppraisalCompentencyModel, dataList: AppraisalCompentencyModel[] } = { loading: false, select: undefined, dataList: [] } 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: [] } 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 }
evaluatee: { loading: boolean, data: EmployeeModel } = { loading: false, data: new MyEmployeeModel() } evaluatee: { loading: boolean, data: EmployeeModel } = { loading: false, data: new MyEmployeeModel() }
setting: { loading: boolean, data: SettingAssessmentModel } = { loading: false, data: new MySettingAssessmentModel() }
currentDate = new Date() currentDate = new Date()
competencyTypeId = ""
constructor(private appraisalService: AppraisalService, constructor(private appraisalService: AppraisalService,
private employeeService: EmployeeService, private employeeService: EmployeeService,
private cdr: ChangeDetectorRef, private cdr: ChangeDetectorRef
private settingAssessmentService: SettingAssessmentService ) { }
) {
}
ngOnInit(): void { ngOnInit(): void {
this.currentTemplate = this.selfEvaluation this.currentTemplate = this.selfEvaluation
this.getWorking()
this.getEvaluatee() this.getEvaluatee()
this.getAppraisalCompentencyList() this.getAppraisalCompentencyList()
this.getSettingList()
}
returnPageTitle() {
this.sendPathTitle.emit(['การประเมินผล', 'ประเมินโดยหัวหน้า', 'ประเมินลูกน้อง'])
}
returnPageEvalution() {
this.sendPathTitle.emit(['การประเมินผล', 'ประเมินโดยหัวหน้า'])
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()
}
})
} }
getEvaluatee() { getEvaluatee() {
this.evaluatee.loading = true this.evaluatee.loading = true
this.employeeService.getWorkingById(this.employeeId).subscribe({ this.employeeService.getWorking().subscribe({
next: response => { next: response => {
this.evaluatee.data = new MyEmployeeModel(response) this.evaluatee.data = new MyEmployeeModel(response)
if (this.byBoss) {
this.currentTemplate = this.selfEvaluationEdit
this.returnPageTitle()
this.getAppraisalCompentencyForm("02")
}
this.evaluatee.loading = false this.evaluatee.loading = false
this.cdr.detectChanges() this.cdr.detectChanges()
}, error: error => { }, error: error => {
...@@ -95,22 +54,9 @@ export class SelfEvaluationComponent implements OnInit { ...@@ -95,22 +54,9 @@ export class SelfEvaluationComponent implements OnInit {
} }
}) })
} }
getWorking() {
this.employee.loading = true
this.employeeService.getWorking().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() { getAppraisalCompentencyList() {
this.appraisalCompentency.loading = true this.appraisalCompentency.loading = true
this.appraisalService.getCompetencyList(this.employeeId).subscribe({ this.appraisalService.getCompetencyList().subscribe({
next: response => { next: response => {
this.appraisalCompentency.dataList = JSON.parse(JSON.stringify(response)) this.appraisalCompentency.dataList = JSON.parse(JSON.stringify(response))
if (this.appraisalCompentency.dataList.length) { if (this.appraisalCompentency.dataList.length) {
...@@ -130,61 +76,8 @@ export class SelfEvaluationComponent implements OnInit { ...@@ -130,61 +76,8 @@ export class SelfEvaluationComponent implements OnInit {
selectAppraisalCompentency(data: AppraisalCompentencyModel) { selectAppraisalCompentency(data: AppraisalCompentencyModel) {
this.appraisalCompentency.select = JSON.parse(JSON.stringify(data)) this.appraisalCompentency.select = JSON.parse(JSON.stringify(data))
} }
getAppraisalCompentencyForm(typeId: string) { selectCompentencyForm(typeId: string) {
this.appraisalCompentency2.loading = true this.competencyTypeId = typeId
const evaluationRoundId = this.appraisalCompentency.select?.masfromEvaluationRound.evaluationRoundId || "test1"
if (evaluationRoundId || this.byBoss) {
this.appraisalService.getFormCompentencyById(evaluationRoundId, this.evaluatee.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 }
}
}
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 || []
} }
...@@ -195,281 +88,6 @@ export class SelfEvaluationComponent implements OnInit { ...@@ -195,281 +88,6 @@ export class SelfEvaluationComponent implements OnInit {
return data.join("/") 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 { convertDate(dateInput?: string | Date): string {
let date = new Date() let date = new Date()
if (dateInput) { if (dateInput) {
...@@ -482,109 +100,4 @@ export class SelfEvaluationComponent implements OnInit { ...@@ -482,109 +100,4 @@ export class SelfEvaluationComponent implements OnInit {
} }
return date?.toLocaleDateString('th-TH', { day: 'numeric', month: 'long', year: 'numeric' }) || '' 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";
}
}
returnPath() {
if (this.byBoss) {
this.returnPageEvalution()
} else {
this.currentTemplate = this.selfEvaluation;
this.pathTitle = ['การประเมินผล', 'ประเมินตนเอง']
}
}
} }
\ No newline at end of file
...@@ -103,19 +103,10 @@ ...@@ -103,19 +103,10 @@
<td class="text-center"> <td class="text-center">
<div class="flex"> <div class="flex">
<button type="button" class="ti-btn rounded-sm ti-btn-soft-success" <button type="button" class="ti-btn rounded-sm ti-btn-soft-success"
*ngFor="let type of item.typeList"
style="height: 15px; width: 45px; font-size: 12px; display: flex; align-items: center; justify-content: center;margin-left:4px;" style="height: 15px; width: 45px; font-size: 12px; display: flex; align-items: center; justify-content: center;margin-left:4px;"
(click)="selectSubordinate(item);pageEvalution='evaluation'"> (click)="selectSubordinate(item,type.shortName,type.shortName);pageEvalution='evaluation'">
PC {{type.shortName}}
</button>
<button type="button" class="ti-btn rounded-sm ti-btn-soft-secondary"
style="height: 15px; width: 45px; font-size: 12px; display: flex; align-items: center; justify-content: center;margin-left:4px;"
(click)="selectSubordinate(item);pageEvalution='evaluation'">
MC
</button>
<button type="button" class="ti-btn rounded-sm ti-btn-soft-danger"
style="height: 15px; width: 45px; font-size: 12px; display: flex; align-items: center; justify-content: center;margin-left:4px;"
(click)="selectSubordinate(item);pageEvalution='evaluation'">
CC
</button> </button>
</div> </div>
</td> </td>
...@@ -127,8 +118,7 @@ ...@@ -127,8 +118,7 @@
</td> </td>
<td class="text-center"> <td class="text-center">
<button type="button" class="ti-btn rounded-sm ti-btn-soft-success" <button type="button" class="ti-btn rounded-sm ti-btn-soft-success"
style="height: 15px; width: 45px; font-size: 12px; display: flex; align-items: center; justify-content: center;margin-left:4px;" style="height: 15px; width: 45px; font-size: 12px; display: flex; align-items: center; justify-content: center;margin-left:4px;">
(click)="selectSubordinate(item);pageEvalution='evaluation'">
ประเมิน ประเมิน
</button> </button>
</td> </td>
...@@ -196,8 +186,7 @@ ...@@ -196,8 +186,7 @@
<ng-container *ngIf="pageEvalution=='pms'"> <ng-container *ngIf="pageEvalution=='pms'">
<app-pms-evalution (sendPageEvalution)="pageEvalution=$event"></app-pms-evalution> <app-pms-evalution (sendPageEvalution)="pageEvalution=$event"></app-pms-evalution>
</ng-container> </ng-container>
<ng-container *ngIf="pageEvalution=='evaluation'&&subordinate.select.apsassessy.employeeId"> <ng-container *ngIf="pageEvalution=='evaluation'">
<app-self-evaluation [byBoss]="true" [pathTitle]="pathTitle" (sendPageEvalution)="pageEvalution=$event" <app-evaluation [evaluationRoundId]="evaluationRoundId" [evaluaterId]="evaluaterId" [evaluateeId]="evaluateeId"
(sendPathTitle)="pathTitle=$event" [competencyTypeId]="competencyTypeId"></app-evaluation>
[employeeId]="subordinate.select.apsassessy.employeeId"></app-self-evaluation>
</ng-container> </ng-container>
\ No newline at end of file
...@@ -14,11 +14,17 @@ export class SupervisorEvaluationComponent { ...@@ -14,11 +14,17 @@ export class SupervisorEvaluationComponent {
subordinate: { loading: false, select: AppraisalSubordinateModel, dataList: AppraisalSubordinateModel[], dataListRound: AppraisalSubordinateModel[][] } = { loading: false, select: new MyAppraisalSubordinateModel(), dataListRound: [], dataList: [] } subordinate: { loading: false, select: AppraisalSubordinateModel, dataList: AppraisalSubordinateModel[], dataListRound: AppraisalSubordinateModel[][] } = { loading: false, select: new MyAppraisalSubordinateModel(), dataListRound: [], dataList: [] }
search = "" search = ""
currentPage = 1 currentPage = 1
page = Array.from({ length: 1 }, (_, i) => i + 1); page = Array.from({ length: 1 }, (_, i) => i + 1)
evaluateeId = ""
evaluaterId = ""
competencyTypeId = ""
evaluationRoundId = ""
constructor(private appraisalService: AppraisalService, constructor(private appraisalService: AppraisalService,
private cdr: ChangeDetectorRef) { private cdr: ChangeDetectorRef) {
} }
ngOnInit(): void { ngOnInit(): void {
this.evaluaterId = this.decodeJWT(sessionStorage.getItem("accessToken") || '').employeeid
this.getBossList() this.getBossList()
} }
getBossList() { getBossList() {
...@@ -42,8 +48,12 @@ export class SupervisorEvaluationComponent { ...@@ -42,8 +48,12 @@ export class SupervisorEvaluationComponent {
this.currentPage = 1 this.currentPage = 1
this.page = Array.from({ length: Math.ceil(this.subordinateFilter().length / 10) }, (_, i) => i + 1); this.page = Array.from({ length: Math.ceil(this.subordinateFilter().length / 10) }, (_, i) => i + 1);
} }
selectSubordinate(data: AppraisalSubordinateModel) { selectSubordinate(data: AppraisalSubordinateModel, competencyTypeId: string, evaluationRoundId: string) {
this.subordinate.select = new MyAppraisalSubordinateModel(data) this.subordinate.select = new MyAppraisalSubordinateModel(data)
this.evaluateeId = this.subordinate.select.apsassessy.employeeId
this.competencyTypeId = competencyTypeId
this.evaluationRoundId = evaluationRoundId
this.cdr.detectChanges() this.cdr.detectChanges()
} }
selectDataListRound(data: AppraisalSubordinateModel[]) { selectDataListRound(data: AppraisalSubordinateModel[]) {
...@@ -51,4 +61,13 @@ export class SupervisorEvaluationComponent { ...@@ -51,4 +61,13 @@ export class SupervisorEvaluationComponent {
this.searchChange() this.searchChange()
this.cdr.detectChanges() this.cdr.detectChanges()
} }
decodeJWT(token: string) {
let base64Url = token.split('.')[1]; // ดึงส่วนที่เป็น Payload
let base64 = base64Url.replace('-', '+').replace('_', '/'); // แก้ไข base64 ให้ถูกต้อง
let jsonPayload = decodeURIComponent(atob(base64).split('').map(function (c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
return JSON.parse(jsonPayload);
}
} }
...@@ -9,6 +9,10 @@ export interface AppraisalSubordinateModel { ...@@ -9,6 +9,10 @@ export interface AppraisalSubordinateModel {
apsassessy: EmployeeModel apsassessy: EmployeeModel
gread: string gread: string
sumScore: number sumScore: number
typeList: {
competencyTypeId: string,
shortName: string
}[]
} }
export class MyAppraisalSubordinateModel implements AppraisalSubordinateModel { export class MyAppraisalSubordinateModel implements AppraisalSubordinateModel {
companyId: string companyId: string
...@@ -18,6 +22,10 @@ export class MyAppraisalSubordinateModel implements AppraisalSubordinateModel { ...@@ -18,6 +22,10 @@ export class MyAppraisalSubordinateModel implements AppraisalSubordinateModel {
apsassessy: EmployeeModel apsassessy: EmployeeModel
gread: string gread: string
sumScore: number sumScore: number
typeList: {
competencyTypeId: string,
shortName: string
}[]
constructor(data?: Partial<AppraisalSubordinateModel>) { constructor(data?: Partial<AppraisalSubordinateModel>) {
this.companyId = data?.companyId || "" this.companyId = data?.companyId || ""
this.active = data?.active ?? false this.active = data?.active ?? false
...@@ -26,6 +34,9 @@ export class MyAppraisalSubordinateModel implements AppraisalSubordinateModel { ...@@ -26,6 +34,9 @@ export class MyAppraisalSubordinateModel implements AppraisalSubordinateModel {
this.apsassessy = new MyEmployeeModel(data?.apsassessy) this.apsassessy = new MyEmployeeModel(data?.apsassessy)
this.gread = data?.gread || "" this.gread = data?.gread || ""
this.sumScore = data?.sumScore ?? 0 this.sumScore = data?.sumScore ?? 0
this.typeList = data?.typeList?.map(x => ({
competencyTypeId: x.competencyTypeId || "",
shortName: x.shortName || ""
})) || []
} }
} }
...@@ -5,6 +5,7 @@ export interface CompetencytypeModel { ...@@ -5,6 +5,7 @@ export interface CompetencytypeModel {
tdesc: string tdesc: string
shortName: string shortName: string
expectationLevel: string expectationLevel: string
weight: number
} }
...@@ -15,6 +16,7 @@ export class MyCompetencytypeModel implements CompetencytypeModel { ...@@ -15,6 +16,7 @@ export class MyCompetencytypeModel implements CompetencytypeModel {
tdesc: string tdesc: string
shortName: string shortName: string
expectationLevel: string expectationLevel: string
weight: number
constructor(data?: Partial<CompetencytypeModel>) { constructor(data?: Partial<CompetencytypeModel>) {
this.competencyTypeId = data?.competencyTypeId || "" this.competencyTypeId = data?.competencyTypeId || ""
this.companyId = data?.companyId || "" this.companyId = data?.companyId || ""
...@@ -22,6 +24,7 @@ export class MyCompetencytypeModel implements CompetencytypeModel { ...@@ -22,6 +24,7 @@ export class MyCompetencytypeModel implements CompetencytypeModel {
this.tdesc = data?.tdesc || "" this.tdesc = data?.tdesc || ""
this.shortName = data?.shortName || "" this.shortName = data?.shortName || ""
this.expectationLevel = data?.expectationLevel || "" this.expectationLevel = data?.expectationLevel || ""
this.weight = data?.weight ?? 0
} }
} }
...@@ -24922,3 +24922,7 @@ div:where(.swal2-container) div:where(.swal2-validation-message) { ...@@ -24922,3 +24922,7 @@ div:where(.swal2-container) div:where(.swal2-validation-message) {
.masked-input { .masked-input {
-webkit-text-security: disc; /* Safari, Chrome */ -webkit-text-security: disc; /* Safari, Chrome */
} }
.cursor-not-allowed{
cursor: not-allowed
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment