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

Graphite Cyan · Top menu · Tinted menu · home page Product · Pill corners · Compact

Registered in salt "sysforge-v1": regenerating keeps this look.

Remove