All systems / SYS-014
LeaveMaster
Leave Management
system.yml
256 lines# ตัวอย่างระบบ: LeaveMaster — ระบบลางานพนักงาน (SYS-014)
# ใช้เป็น golden example หลักของ SysForge: ครอบคลุม crud, calendar, kanban, kpi-dashboard,
# enum, relation, running number, sensitive field, row-level permission (:own)
system:
code: SYS-014
name: LeaveMaster
title: { th: ระบบลางานพนักงาน, en: Leave Management }
description:
th: ยื่นคำขอลา อนุมัติ และติดตามวันลาคงเหลือของพนักงาน
en: Submit, approve and track employee leave
domain: Enterprise & Business
package: com.sysforge.leavemaster
version: 1.0.0
locale: { default: th }
timezone: Asia/Bangkok
database:
targets: [sqlserver, oracle, mysql, postgresql]
default: postgresql
tablePrefix: lv_
theme: {} # ไม่ล็อก — ให้ Theme Engine เลือกเอง (ตัวอย่างการล็อก: { palette: navy, layout: topnav })
roles:
- code: ADMIN
title: { th: ผู้ดูแลระบบ, en: Administrator }
permissions: ["*"]
- code: HR
title: { th: ฝ่ายบุคคล, en: HR Officer }
permissions:
- "Employee:create"
- "Employee:read"
- "Employee:update"
- "Employee:read:sensitive"
- "LeaveRequest:read"
- "LeaveRequest:approve"
- "LeaveRequest:export"
- code: EMPLOYEE
title: { th: พนักงาน, en: Employee }
permissions:
- "LeaveRequest:create"
- "LeaveRequest:read:own"
- "LeaveRequest:update:own"
enums:
- name: LeaveType
values:
- { code: SICK, th: ลาป่วย, en: Sick, color: info }
- { code: ANNUAL, th: ลาพักร้อน, en: Annual, color: success }
- { code: PERSONAL, th: ลากิจ, en: Personal, color: warning }
- { code: MATERNITY, th: ลาคลอด, en: Maternity, color: primary }
- name: ApprovalStatus
values:
- { code: PENDING, th: รออนุมัติ, en: Pending, color: warning }
- { code: APPROVED, th: อนุมัติแล้ว, en: Approved, color: success }
- { code: REJECTED, th: ไม่อนุมัติ, en: Rejected, color: danger }
- { code: CANCELLED, th: ยกเลิก, en: Cancelled, color: neutral }
entities:
- name: Employee
title: { th: พนักงาน, en: Employee }
display: fullName
fields:
- name: employeeNo
type: string
length: 20
required: true
unique: true
label: { th: รหัสพนักงาน, en: Employee No. }
placeholder: { th: "เช่น EMP001", en: "e.g. EMP001" }
searchable: true
listable: true
- name: fullName
type: string
length: 200
required: true
label: { th: ชื่อ-นามสกุล, en: Full Name }
placeholder: { th: "เช่น สมชาย ใจดี", en: "e.g. Somchai Jaidee" }
searchable: true
listable: true
- name: department
type: string
length: 100
required: true
label: { th: แผนก, en: Department }
placeholder: { th: "เช่น ฝ่ายเทคโนโลยีสารสนเทศ", en: "e.g. Information Technology" }
searchable: true
listable: true
- name: email
type: email
required: true
unique: true
label: { th: อีเมล, en: Email }
placeholder: { th: "เช่น somchai@example.com", en: "e.g. somchai@example.com" }
listable: true
- name: citizenId
type: thaiId
sensitive: true
label: { th: เลขประจำตัวประชาชน, en: Citizen ID }
placeholder: { th: "เช่น 1-2345-67890-12-3", en: "e.g. 1-2345-67890-12-3" }
listable: false
- name: annualLeaveQuota
type: int
required: true
default: 10
min: 0
max: 30
label: { th: สิทธิ์ลาพักร้อน (วัน/ปี), en: Annual Leave Quota (days) }
listable: true
- name: active
type: boolean
default: true
label: { th: ใช้งาน, en: Active }
searchable: true
listable: true
indexes:
- fields: [department]
- name: LeaveRequest
title: { th: คำขอลา, en: Leave Request }
display: requestNo
fields:
- name: requestNo
type: string
length: 20
required: true
unique: true
readonly: true
generated: { pattern: "LV-{yyyy}-{seq:5}" }
label: { th: เลขที่คำขอ, en: Request No. }
placeholder: { th: "สร้างอัตโนมัติ เช่น LV-2026-00001", en: "Auto e.g. LV-2026-00001" }
searchable: true
listable: true
- name: leaveType
type: enum
enum: LeaveType
required: true
default: SICK
label: { th: ประเภทการลา, en: Leave Type }
searchable: true
listable: true
- name: startDate
type: date
required: true
default: "@today"
label: { th: วันที่เริ่มลา, en: Start Date }
searchable: true
listable: true
- name: endDate
type: date
required: true
default: "@today"
label: { th: วันที่สิ้นสุด, en: End Date }
listable: true
- name: days
type: decimal
precision: 4
scale: 1
required: true
default: 1
min: 0.5
max: 180
label: { th: จำนวนวัน, en: Days }
help: { th: "ลาครึ่งวันให้กรอก 0.5", en: "Use 0.5 for half day" }
listable: true
- name: reason
type: text
required: true
label: { th: เหตุผลการลา, en: Reason }
placeholder: { th: "เช่น ไปพบแพทย์ตามนัด", en: "e.g. Doctor appointment" }
ui: { widget: textarea, rows: 3 }
listable: false
- name: approvalStatus
type: enum
enum: ApprovalStatus
required: true
default: PENDING
label: { th: สถานะ, en: Status }
searchable: true
listable: true
- name: approverNote
type: string
length: 500
label: { th: หมายเหตุผู้อนุมัติ, en: Approver Note }
placeholder: { th: "เช่น อนุมัติตามระเบียบ", en: "e.g. Approved per policy" }
listable: false
- name: attachment
type: file
label: { th: เอกสารแนบ, en: Attachment }
placeholder: { th: "เช่น ใบรับรองแพทย์ (PDF/JPG ไม่เกิน 5 MB)", en: "e.g. Medical certificate (PDF/JPG, max 5 MB)" }
listable: false
relations:
- name: employee
type: manyToOne
target: Employee
required: true
label: { th: พนักงาน, en: Employee }
placeholder: { th: "พิมพ์ชื่อหรือรหัส เช่น EMP001", en: "Type name or code e.g. EMP001" }
searchable: true
listable: true
indexes:
- fields: [employee, startDate]
- fields: [approvalStatus]
screens:
- id: leave-requests
type: crud
entity: LeaveRequest
title: { th: คำขอลา, en: Leave Requests }
defaultSort: { field: startDate, dir: desc }
pageSize: 20
options: { formMode: drawer }
- id: leave-calendar
type: calendar
entity: LeaveRequest
title: { th: ปฏิทินการลา, en: Leave Calendar }
options: { start: startDate, end: endDate, title: employee, color: leaveType, views: [month, week] }
- id: approval-board
type: kanban
entity: LeaveRequest
title: { th: บอร์ดอนุมัติ, en: Approval Board }
options: { statusField: approvalStatus, cardTitle: requestNo, cardSubtitle: employee, allowDrag: true }
- id: employees
type: crud
entity: Employee
title: { th: พนักงาน, en: Employees }
defaultSort: { field: employeeNo, dir: asc }
pageSize: 20
- id: home
type: kpi-dashboard
title: { th: ภาพรวม, en: Overview }
menu:
- { screen: home, icon: layout-dashboard }
- { screen: leave-requests, icon: file-text }
- { screen: leave-calendar, icon: calendar }
- { screen: approval-board, icon: columns }
- group: { th: ข้อมูลหลัก, en: Master Data }
items:
- { screen: employees, icon: users }
dashboard:
kpis:
- { title: { th: คำขอรออนุมัติ, en: Pending }, entity: LeaveRequest, aggregate: count, filter: { approvalStatus: PENDING }, color: warning }
- { title: { th: วันลาเดือนนี้, en: Days this month }, entity: LeaveRequest, aggregate: sum, field: days, filter: { startDate: "@thisMonth", approvalStatus: APPROVED }, color: info }
- { title: { th: พนักงานทั้งหมด, en: Employees }, entity: Employee, aggregate: count, filter: { active: true }, color: primary }
charts:
- { type: bar, title: { th: การลาตามประเภท, en: Leave by type }, entity: LeaveRequest, groupBy: leaveType, aggregate: count }
- { type: donut, title: { th: สถานะคำขอ, en: Request status }, entity: LeaveRequest, groupBy: approvalStatus, aggregate: count }
seed:
Employee:
- { employeeNo: EMP001, fullName: สมชาย ใจดี, department: ฝ่ายเทคโนโลยีสารสนเทศ, email: somchai@example.com, annualLeaveQuota: 10, active: true }
- { employeeNo: EMP002, fullName: สมหญิง รักงาน, department: ฝ่ายบุคคล, email: somying@example.com, annualLeaveQuota: 12, active: true }
Details
- Code
- SYS-014
- Domain
- Enterprise & Business
- Entities
- 2
- Source
- Example
- Status
- Ready
- Description
- Submit, approve and track employee leave
Theme
Registered in salt "sysforge-v1": regenerating keeps this look.