This commit is contained in:
@@ -73,6 +73,7 @@ func AutoMigrate(db *gorm.DB) error {
|
||||
&models.GuideLink{},
|
||||
&models.AppDownload{},
|
||||
&models.AppGuide{},
|
||||
&models.LocalLeaveRequest{},
|
||||
); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -565,11 +565,40 @@ func GetLeaveRequestsHandler(db *gorm.DB, qldtClient *qldt.Client) fiber.Handler
|
||||
return c.Status(fiber.StatusBadGateway).JSON(fiber.Map{"error": err.Error()})
|
||||
}
|
||||
|
||||
var data any
|
||||
var data []map[string]interface{}
|
||||
if err := json.Unmarshal(body, &data); err != nil {
|
||||
var fallback any
|
||||
if errFallback := json.Unmarshal(body, &fallback); errFallback == nil {
|
||||
return c.JSON(fallback)
|
||||
}
|
||||
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Failed to parse QLDT response"})
|
||||
}
|
||||
|
||||
// Ghi đè trạng thái duyệt local nếu có
|
||||
var localReqs []models.LocalLeaveRequest
|
||||
if err := db.Find(&localReqs).Error; err == nil && len(localReqs) > 0 {
|
||||
localMap := make(map[int64]string)
|
||||
for _, lr := range localReqs {
|
||||
localMap[lr.LeaveID] = lr.Status
|
||||
}
|
||||
for i, item := range data {
|
||||
if idVal, ok := item["id"]; ok {
|
||||
var idInt int64
|
||||
switch v := idVal.(type) {
|
||||
case float64:
|
||||
idInt = int64(v)
|
||||
case int64:
|
||||
idInt = v
|
||||
case int:
|
||||
idInt = int64(v)
|
||||
}
|
||||
if localStatus, found := localMap[idInt]; found {
|
||||
data[i]["status"] = localStatus
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return c.JSON(data)
|
||||
}
|
||||
}
|
||||
@@ -594,15 +623,24 @@ func UpdateLeaveStatusHandler(db *gorm.DB, qldtClient *qldt.Client) fiber.Handle
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Trạng thái phê duyệt không hợp lệ"})
|
||||
}
|
||||
|
||||
token := GetQldtToken(db)
|
||||
if token == "" {
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "QLDT_TOKEN chưa cấu hình"})
|
||||
}
|
||||
|
||||
// 1. Gửi lệnh cập nhật status qua QLDT Portal API
|
||||
body, err := qldtClient.UpdateLeaveStatus(context.Background(), token, leaveID, req.Status)
|
||||
if err != nil {
|
||||
return c.Status(fiber.StatusBadGateway).JSON(fiber.Map{"error": err.Error(), "body": string(body)})
|
||||
// 1. Lưu trạng thái đơn phép vào database local thay vì gọi QLDT Portal API
|
||||
var localLeave models.LocalLeaveRequest
|
||||
errLocal := db.Where("leave_id = ?", leaveID).First(&localLeave).Error
|
||||
if errLocal == gorm.ErrRecordNotFound {
|
||||
localLeave = models.LocalLeaveRequest{
|
||||
LeaveID: leaveID,
|
||||
Status: req.Status,
|
||||
}
|
||||
if err := db.Create(&localLeave).Error; err != nil {
|
||||
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Lỗi lưu đơn phép local: " + err.Error()})
|
||||
}
|
||||
} else if errLocal == nil {
|
||||
localLeave.Status = req.Status
|
||||
if err := db.Save(&localLeave).Error; err != nil {
|
||||
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Lỗi cập nhật đơn phép local: " + err.Error()})
|
||||
}
|
||||
} else {
|
||||
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": errLocal.Error()})
|
||||
}
|
||||
|
||||
// 2. Nếu status là "Phê duyệt", tự động cập nhật điểm danh trong hệ thống của chúng ta thành "Nghỉ có phép"
|
||||
|
||||
@@ -255,4 +255,16 @@ type AppGuide struct {
|
||||
|
||||
func (AppGuide) TableName() string { return "app_guides" }
|
||||
|
||||
// LocalLeaveRequest lưu trạng thái phê duyệt đơn xin nghỉ phép trên hệ thống nội bộ thay vì call QLĐT
|
||||
type LocalLeaveRequest struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
CreatedAt time.Time `json:"createdAt"`
|
||||
UpdatedAt time.Time `json:"updatedAt"`
|
||||
LeaveID int64 `gorm:"column:leave_id;uniqueIndex;not null" json:"leaveId"`
|
||||
Status string `gorm:"column:status;size:32;not null" json:"status"` // "Phê duyệt" hoặc "Từ chối"
|
||||
}
|
||||
|
||||
func (LocalLeaveRequest) TableName() string { return "local_leave_requests" }
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user