Commit f7c9eb37 by Nattana Chaiyamat

การจัดการหัวข้อการประเมินเวลาทำงาน

parent 56fbcd85
...@@ -156,6 +156,7 @@ import { EventgrpService } from 'src/app/shared/services/eventgrp.service'; ...@@ -156,6 +156,7 @@ import { EventgrpService } from 'src/app/shared/services/eventgrp.service';
import { PmsEvaluationCycleService } from 'src/app/shared/services/pms-evaluation-cycle.service'; import { PmsEvaluationCycleService } from 'src/app/shared/services/pms-evaluation-cycle.service';
import { PmsEvaluationAssessmentService } from 'src/app/shared/services/pms-evaluation-assessment.service'; import { PmsEvaluationAssessmentService } from 'src/app/shared/services/pms-evaluation-assessment.service';
import { TimeAttendanceComponent } from '../performance-management-evaluation/time-attendance/time-attendance.component'; import { TimeAttendanceComponent } from '../performance-management-evaluation/time-attendance/time-attendance.component';
import { PmsWorkingTimeService } from 'src/app/shared/services/pms-working-time.service';
export const MY_DATE_FORMATS = { export const MY_DATE_FORMATS = {
parse: { parse: {
...@@ -342,6 +343,7 @@ export class CustomDateAdapter extends NativeDateAdapter { ...@@ -342,6 +343,7 @@ export class CustomDateAdapter extends NativeDateAdapter {
EventgrpService, EventgrpService,
PmsEvaluationCycleService, PmsEvaluationCycleService,
PmsEvaluationAssessmentService, PmsEvaluationAssessmentService,
PmsWorkingTimeService,
{ {
provide: HTTP_INTERCEPTORS, provide: HTTP_INTERCEPTORS,
useClass: HttpRequestInterceptor, useClass: HttpRequestInterceptor,
......
import { ChangeDetectorRef, Component } from '@angular/core'; import { ChangeDetectorRef, Component } from '@angular/core';
import { ToastrService } from 'ngx-toastr'; import { ToastrService } from 'ngx-toastr';
import { EventgrpModel, MyEventgrpModel } from 'src/app/shared/model/eventgrp.model'; import { MyEmeventgrpModel } from 'src/app/shared/model/emeventgrp.model';
import { EventgrpModel, MyEventgrpModel, } from 'src/app/shared/model/eventgrp.model';
import { PmsWorkingTimeModel, MyPmsWorkingTimeModel } from 'src/app/shared/model/pms-working-time.model';
import { EventgrpService } from 'src/app/shared/services/eventgrp.service'; import { EventgrpService } from 'src/app/shared/services/eventgrp.service';
import { FileService } from 'src/app/shared/services/file.service'; import { FileService } from 'src/app/shared/services/file.service';
import { PmsWorkingTimeService } from 'src/app/shared/services/pms-working-time.service';
interface table { interface table {
currentPage: number, currentPage: number,
page: number[], page: number[],
...@@ -31,16 +34,66 @@ export class TimeAttendanceComponent { ...@@ -31,16 +34,66 @@ export class TimeAttendanceComponent {
eventgrp: { loading: boolean, selectIndex: number, selectList: EventgrpModel[], dataList: { check: boolean, data: EventgrpModel }[] } = { loading: false, selectIndex: -1, selectList: [new MyEventgrpModel()], dataList: [] } eventgrp: { loading: boolean, selectIndex: number, selectList: EventgrpModel[], dataList: { check: boolean, data: EventgrpModel }[] } = { loading: false, selectIndex: -1, selectList: [new MyEventgrpModel()], dataList: [] }
pmsWorkingTime: { loading: boolean, select: PmsWorkingTimeModel, dataList: { check: boolean, data: PmsWorkingTimeModel }[] } = { loading: false, select: new MyPmsWorkingTimeModel(), dataList: [] }
constructor( constructor(
private toastr: ToastrService, private toastr: ToastrService,
private cdr: ChangeDetectorRef, private cdr: ChangeDetectorRef,
private fileService: FileService, private fileService: FileService,
private eventgrpService: EventgrpService private eventgrpService: EventgrpService,
private pmsWorkingTimeService: PmsWorkingTimeService,
) { } ) { }
ngOnInit(): void { ngOnInit(): void {
this.getEventgrpList() this.getEventgrpList()
this.getPmsWorkingTimeList()
} }
getPmsWorkingTimeList() {
this.pmsWorkingTime.loading = true
this.pmsWorkingTimeService.getList().subscribe({
next: response => {
this.pmsWorkingTime.dataList = response.map(x => ({ check: false, data: new MyPmsWorkingTimeModel(x) }))
this.pmsWorkingTime.loading = false
this.isDataListCheckedAll = false
this.dataListCheckAll()
this.searchChange()
this.cdr.detectChanges();
}, error: error => {
this.pmsWorkingTime.loading = false
this.cdr.detectChanges()
}
})
}
pmsWorkingTimeFilter() {
return this.pmsWorkingTime.dataList.filter((x) => {
const data = x.data
const match = data.pmsWorkingTimeId.toLowerCase().includes(this.search.toLowerCase()) ||
data.tdesc.toLowerCase().includes(this.search.toLowerCase()) ||
data.detailUnit.toLowerCase().includes(this.search.toLowerCase()) ||
(data.weight + "").toLowerCase().includes(this.search.toLowerCase())
return match;
});
}
searchChange() {
this.currentPage = 1;
const filteredData = this.pmsWorkingTimeFilter();
this.page = Array.from({ length: Math.ceil(filteredData.length / 10) }, (_, i) => i + 1);
this.dataListCheck();
}
selectData(data?: PmsWorkingTimeModel) {
this.pmsWorkingTime.select = new MyPmsWorkingTimeModel(data)
}
dataListCheckAll() {
const selectAll = this.isDataListCheckedAll;
this.pmsWorkingTimeFilter().forEach(x => x.check = selectAll);
this.dataListCheck();
}
dataListCheck() {
const dataCheck = this.pmsWorkingTimeFilter();
this.isDataListCheckedAll = dataCheck.length ? dataCheck.every(x => x.check) : false;
this.numDataListChecked = this.pmsWorkingTime.dataList.filter(x => x.check).length;
this.isDataListChecked = Boolean(this.numDataListChecked)
}
getEventgrpList() { getEventgrpList() {
this.eventgrp.loading = true this.eventgrp.loading = true
this.eventgrpService.getList().subscribe({ this.eventgrpService.getList().subscribe({
...@@ -66,53 +119,18 @@ export class TimeAttendanceComponent { ...@@ -66,53 +119,18 @@ export class TimeAttendanceComponent {
} }
selectEventgrp(data?: EventgrpModel) { selectEventgrp(data?: EventgrpModel) {
if (!data) { if (!data) {
this.eventgrp.selectList.splice(this.eventgrp.selectIndex, 1); this.pmsWorkingTime.select.emeventgrp.splice(this.eventgrp.selectIndex, 1);
return; return;
} }
this.eventgrp.selectList[this.eventgrp.selectIndex] = new MyEventgrpModel(data); this.pmsWorkingTime.select.emeventgrp.push(new MyEmeventgrpModel(data))
if (this.eventgrp.selectIndex === this.eventgrp.selectList.length - 1) {
this.eventgrp.selectList.push(new MyEventgrpModel());
}
}
dataListFilter() {
// return this.pmsGrade.dataList.filter((x) => {
// const data = x.data
// const match = data.gradeId.toLowerCase().includes(this.search.toLowerCase()) || data.tdesc.toLowerCase().includes(this.search.toLowerCase()) || data.edesc.toLowerCase().includes(this.search.toLowerCase());
// return match;
// });
return []
}
dataListCheckAll() {
// const selectAll = this.isDataListCheckedAll;
// this.dataListFilter().forEach(x => x.check = selectAll);
// this.dataListCheck();
} }
dataListCheck() {
// const dataCheck = this.dataListFilter();
// this.isDataListCheckedAll = dataCheck.length ? dataCheck.every(x => x.check) : false;
// this.numDataListChecked = this.pmsGrade.dataList.filter(x => x.check).length;
// this.isDataListChecked = Boolean(this.numDataListChecked)
}
searchChange() {
this.currentPage = 1;
const filteredData = this.dataListFilter();
this.page = Array.from({ length: Math.ceil(filteredData.length / 10) }, (_, i) => i + 1);
this.dataListCheck();
}
selectData() {
}
clearData(modalStatus: string) { clearData(modalStatus: string) {
if (modalStatus == 'add') { if (modalStatus == 'add') {
this.pmsWorkingTime.select = new MyPmsWorkingTimeModel()
} else if (modalStatus == 'edit') { } else if (modalStatus == 'edit') {
this.pmsWorkingTime.select = new MyPmsWorkingTimeModel({ pmsWorkingTimeId: this.pmsWorkingTime.select.pmsWorkingTimeId })
} }
this.eventgrp.selectList = [new MyEventgrpModel()] this.eventgrp.selectList = [new MyEventgrpModel()]
} }
...@@ -121,4 +139,55 @@ export class TimeAttendanceComponent { ...@@ -121,4 +139,55 @@ export class TimeAttendanceComponent {
this.modal.currentPage = 1 this.modal.currentPage = 1
this.modal.page = Array.from({ length: Math.ceil(dataList.length / 10) }, (_, i) => i + 1); this.modal.page = Array.from({ length: Math.ceil(dataList.length / 10) }, (_, i) => i + 1);
} }
updatePmsWorkingTime() {
this.pmsWorkingTime.loading = true
this.pmsWorkingTimeService.post(new MyPmsWorkingTimeModel(this.pmsWorkingTime.select)).subscribe({
next: response => {
if (response.success) {
this.showAlert(response.message, 'success')
this.getPmsWorkingTimeList()
this.searchChange()
} else {
this.showAlert(response.message, 'error')
this.pmsWorkingTime.loading = false
}
this.cdr.detectChanges()
}, error: error => {
this.showAlert(error.message, 'error')
this.pmsWorkingTime.loading = false
this.cdr.detectChanges()
}
})
}
deletePmsWorkingTime() {
let body: PmsWorkingTimeModel[] = []
if (this.modalStatus == "deleteGroup") {
body = this.pmsWorkingTime.dataList.filter(x => x.check).map(x => new MyPmsWorkingTimeModel(x.data))
} else {
body = [new MyPmsWorkingTimeModel(this.pmsWorkingTime.select)]
}
this.pmsWorkingTime.loading = true
this.pmsWorkingTimeService.delete(body).subscribe({
next: response => {
if (response.success) {
this.showAlert(response.message, 'success')
this.getPmsWorkingTimeList()
} else {
this.showAlert(response.message, 'error')
this.pmsWorkingTime.loading = false
this.cdr.detectChanges()
}
}, error: error => {
this.showAlert(error.message, 'error')
this.pmsWorkingTime.loading = false
this.cdr.detectChanges()
}
})
}
showAlert(text: string, type: 'success' | 'error') {
this.toastr[type](text, 'แจ้งเตือน', {
timeOut: 3000,
positionClass: 'toast-top-right',
})
}
} }
export interface EmeventgrpModel {
eventgrpId: string
companyId: string
tdesc: string
edesc: string
event_status: number
limits: number
daytype: string
datebeforerequest: number
service_year: number
limit_times: number
clear_leave: number
privilege_event: string
limit_probation: number
sex_type: string
guarantee: string
guarantee_date: number
remarks: string
display_order: number
display: number
displayEss: number
event_desc: string
display_limit: number
lvpastlimit: number
lvfuturelimit: number
day_leave_stat: number
fhalf_leave_stat: number
shalf_leave_stat: number
hour_leave_stat: number
month_limit0: number
month_limit1: number
month_limit2: number
month_limit3: number
leaverounding: string
clear_leave_month: number
limit_hours: string
sharelimit_event: string
needapprovedate: number
min_limit_hours: string
advance_approve: string
approve_before: number
approve_after: number
tsdesc: string
esdesc: string
dctsal: string
dctsvc: string
prev_last: string
yos: string
ispay: number
limit_per_request: number
}
export class MyEmeventgrpModel implements EmeventgrpModel {
eventgrpId: string
companyId: string
tdesc: string
edesc: string
event_status: number
limits: number
daytype: string
datebeforerequest: number
service_year: number
limit_times: number
clear_leave: number
privilege_event: string
limit_probation: number
sex_type: string
guarantee: string
guarantee_date: number
remarks: string
display_order: number
display: number
displayEss: number
event_desc: string
display_limit: number
lvpastlimit: number
lvfuturelimit: number
day_leave_stat: number
fhalf_leave_stat: number
shalf_leave_stat: number
hour_leave_stat: number
month_limit0: number
month_limit1: number
month_limit2: number
month_limit3: number
leaverounding: string
clear_leave_month: number
limit_hours: string
sharelimit_event: string
needapprovedate: number
min_limit_hours: string
advance_approve: string
approve_before: number
approve_after: number
tsdesc: string
esdesc: string
dctsal: string
dctsvc: string
prev_last: string
yos: string
ispay: number
limit_per_request: number
constructor(data?: Partial<EmeventgrpModel>) {
this.eventgrpId = data?.eventgrpId || ""
this.companyId = data?.companyId || ""
this.tdesc = data?.tdesc || ""
this.edesc = data?.edesc || ""
this.event_status = data?.event_status ?? 0
this.limits = data?.limits ?? 0
this.daytype = data?.daytype || ""
this.datebeforerequest = data?.datebeforerequest ?? 0
this.service_year = data?.service_year ?? 0
this.limit_times = data?.limit_times ?? 0
this.clear_leave = data?.clear_leave ?? 0
this.privilege_event = data?.privilege_event || ""
this.limit_probation = data?.limit_probation ?? 0
this.sex_type = data?.sex_type || ""
this.guarantee = data?.guarantee || ""
this.guarantee_date = data?.guarantee_date ?? 0
this.remarks = data?.remarks || ""
this.display_order = data?.display_order ?? 0
this.display = data?.display ?? 0
this.displayEss = data?.displayEss ?? 0
this.event_desc = data?.event_desc || ""
this.display_limit = data?.display_limit ?? 0
this.lvpastlimit = data?.lvpastlimit ?? 0
this.lvfuturelimit = data?.lvfuturelimit ?? 0
this.day_leave_stat = data?.day_leave_stat ?? 0
this.fhalf_leave_stat = data?.fhalf_leave_stat ?? 0
this.shalf_leave_stat = data?.shalf_leave_stat ?? 0
this.hour_leave_stat = data?.hour_leave_stat ?? 0
this.month_limit0 = data?.month_limit0 ?? 0
this.month_limit1 = data?.month_limit1 ?? 0
this.month_limit2 = data?.month_limit2 ?? 0
this.month_limit3 = data?.month_limit3 ?? 0
this.leaverounding = data?.leaverounding || ""
this.clear_leave_month = data?.clear_leave_month ?? 0
this.limit_hours = data?.limit_hours || ""
this.sharelimit_event = data?.sharelimit_event || ""
this.needapprovedate = data?.needapprovedate ?? 0
this.min_limit_hours = data?.min_limit_hours || ""
this.advance_approve = data?.advance_approve || ""
this.approve_before = data?.approve_before ?? 0
this.approve_after = data?.approve_after ?? 0
this.tsdesc = data?.tsdesc || ""
this.esdesc = data?.esdesc || ""
this.dctsal = data?.dctsal || ""
this.dctsvc = data?.dctsvc || ""
this.prev_last = data?.prev_last || ""
this.yos = data?.yos || ""
this.ispay = data?.ispay ?? 0
this.limit_per_request = data?.limit_per_request ?? 0
}
}
import { EmeventgrpModel, MyEmeventgrpModel } from "./emeventgrp.model"
export interface PmsWorkingTimeModel {
pmsWorkingTimeId: string
companyId: string
meventgrpId: string
tdesc: string
edesc: string
weight: number
detailUnit: string
performanceTargets: string
targetADetail: string
conditionAMin: string
conditionAMax: string
targetBDetail: string
conditionBMin: string
conditionBMax: string
targetCDetail: string
conditionCMin: string
conditionCMax: string
targetDDetail: string
conditionDMin: string
conditionDMax: string
targetEDetail: string
conditionEMin: string
conditionEMax: string
emeventgrp: EmeventgrpModel[]
}
export class MyPmsWorkingTimeModel implements PmsWorkingTimeModel {
pmsWorkingTimeId: string
companyId: string
meventgrpId: string
tdesc: string
edesc: string
weight: number
detailUnit: string
performanceTargets: string
targetADetail: string
conditionAMin: string
conditionAMax: string
targetBDetail: string
conditionBMin: string
conditionBMax: string
targetCDetail: string
conditionCMin: string
conditionCMax: string
targetDDetail: string
conditionDMin: string
conditionDMax: string
targetEDetail: string
conditionEMin: string
conditionEMax: string
emeventgrp: EmeventgrpModel[]
constructor(data?: Partial<PmsWorkingTimeModel>) {
this.pmsWorkingTimeId = data?.pmsWorkingTimeId || ""
this.companyId = data?.companyId || ""
this.meventgrpId = data?.meventgrpId || ""
this.tdesc = data?.tdesc || ""
this.edesc = data?.edesc || ""
this.weight = data?.weight ?? 0
this.detailUnit = data?.detailUnit || ""
this.performanceTargets = data?.performanceTargets || ""
this.targetADetail = data?.targetADetail || ""
this.conditionAMin = data?.conditionAMin || ""
this.conditionAMax = data?.conditionAMax || ""
this.targetBDetail = data?.targetBDetail || ""
this.conditionBMin = data?.conditionBMin || ""
this.conditionBMax = data?.conditionBMax || ""
this.targetCDetail = data?.targetCDetail || ""
this.conditionCMin = data?.conditionCMin || ""
this.conditionCMax = data?.conditionCMax || ""
this.targetDDetail = data?.targetDDetail || ""
this.conditionDMin = data?.conditionDMin || ""
this.conditionDMax = data?.conditionDMax || ""
this.targetEDetail = data?.targetEDetail || ""
this.conditionEMin = data?.conditionEMin || ""
this.conditionEMax = data?.conditionEMax || ""
this.emeventgrp = data?.emeventgrp?.map(x => new MyEmeventgrpModel(x)) || []
}
}
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { environment } from 'src/environments/environment';
import { AlertModel } from '../model/alert.model';
import { PmsWorkingTimeModel } from '../model/pms-working-time.model';
@Injectable({
providedIn: 'root'
})
export class PmsWorkingTimeService {
api = "/pms-working-time"
urlApi = environment.baseUrl + this.api
constructor(private http: HttpClient) {
}
getById(pmsWorkingTimeId: string): Observable<PmsWorkingTimeModel> {
return this.http.get<PmsWorkingTimeModel>(this.urlApi + "/" + pmsWorkingTimeId)
}
getList(): Observable<PmsWorkingTimeModel[]> {
return this.http.get<PmsWorkingTimeModel[]>(this.urlApi + "/lists")
}
post(body: PmsWorkingTimeModel): Observable<AlertModel> {
return this.http.post<AlertModel>(this.urlApi, body)
}
delete(body: PmsWorkingTimeModel[]): Observable<AlertModel> {
const options = {
headers: new HttpHeaders({
"Content-Type": "application/json",
}),
body: body
};
return this.http.delete<AlertModel>(this.urlApi, options)
}
}
\ No newline at end of file
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