Lab Praktikum

BAB 10
Human Resource
Management

Configure HR Module dan Process Payroll Indonesia untuk UMKM Mitra

Minggu 11 120 Menit Individu / Pasangan

Modul: Employees · Attendances · Time Off · Payroll · Expenses
Sistem Informasi Enterprise — ERP Odoo 19.0

Timeline 120 min

01
HR Configuration
Departments · Job Positions · Working Hours · Attendance Settings
20 min
02
Employee Data Entry
5 employee records (Work Info + Private Info) · Contracts PKWT/PKWTT
30 min
03
Leave Management Setup
3 Leave Types · Public Holidays · Mass Allocation · Leave Request
25 min
04
Payroll Setup & Payslip
Salary Structure + Rules (BPJS + PPh 21) · Payslip Compute · Cross-check · Journal
35 min
05
Employee Portal Access
Grant portal · Demo payslip & leave dari sisi karyawan
10 min

🎯 Output: 10 screenshots wajib (80 poin) + 2 bonus (20 poin) → ZIP file Lab10_[NIM]_[Nama].zip

⚠️ Cek Data & Prasyarat

Prasyarat Teknis

  • Odoo 19 aktif + modul Employees, Attendances, Time Off, Payroll terinstall
  • Accounting aktif (Bab 8) — payroll butuh CoA: Biaya Gaji, Utang Gaji, Utang BPJS, Utang PPh 21
  • Data karyawan UMKM mitra: 5 orang (nama, jabatan, departemen, PTKP, gaji)

Data yang Dibutuhkan

  • NIK + NPWP karyawan (dummy OK)
  • Status PTKP: TK/0, K/0, K/1, K/2
  • Tarif BPJS terkini (verifikasi bpjs-kesehatan.go.id)
  • PTKP terkini (verifikasi pajak.go.id)

⚠️ Data belum lengkap? Gunakan 5 karyawan dummy Moda Indah Fashion dari tabel di Step 2. UMKM solo tanpa karyawan? → Pilih Alternatif A (data dummy) atau C (kalkulator BPJS).

Tujuan Lab

🔧 T1 — Mengkonfigurasi struktur organisasi HR: Departments, Job Positions, Working Hours

📋 T2 — Membuat employee records lengkap (Work Info + Private Info) & contracts PKWT/PKWTT

📅 T3 — Mengkonfigurasi leave types, public holidays, mass allocation & approval workflow

💰 T4 — Memproses payslip dengan Salary Rules (BPJS + PPh 21), cross-check manual, & verify journal entry

Step 1 · 20 menit

HR
Configuration

🎯 Buat 3 Departments, 3 Job Positions, Working Hours, aktifkan Overtime

01

Struktur Organisasi & Working Hours

1.1 Buat Departments

Employees → Configuration → Departments → New

  1. Sales
  2. Kasir & Operasional
  3. Finance & Admin

1.2 Buat Job Positions

Employees → Configuration → Job Positions → New

  1. Sales Associate → dept. Sales
  2. Store Supervisor → dept. Kasir & Op
  3. Admin & Finance → dept. Finance

1.3 Working Hours

Employees → Configuration → Working Schedules

  • Nama: Standar 8 Jam (Retail)
  • Senin–Sabtu, 08:00–16:00 (1 jam istirahat)

1.4 Aktifkan Overtime

Attendances → Configuration → Settings

  • Scroll ke "Overtime" → ☑ Enable Overtime
  • Klik Save

📸 SCREENSHOT 10.1: Halaman Departments dengan minimal 3 departemen terbuat

Step 2 · 30 menit

Employee
Data Entry

🎯 5 Employee Records + Contracts PKWT/PKWTT

02

Data Karyawan

NamaDepartemenJabatanPTKPGaji PokokKontrak
Budi SantosoSalesSales AssociateK/1Rp 4.500.000PKWT
Dewi LestariSalesSales AssociateTK/0Rp 4.500.000PKWT
Andi PrasetyoKasir & OpStore SupervisorK/2Rp 6.000.000PKWTT
Siti RahayuFinanceAdmin & FinanceK/0Rp 5.000.000PKWTT
Bu Rina HartatiFinanceHR ManagerK/1Rp 7.000.000PKWTT

Substitusi: Jika punya data UMKM mitra sendiri (min 5 karyawan), boleh substitusi. Pastikan ada variasi: minimal 2 status PTKP berbeda dan campuran PKWT/PKWTT.

Input Employee + Buat Contract

Per Karyawan

  1. Employees → New
  2. Tab Work Info: Department, Job Position, Manager, Working Hours
  3. Tab Private Info: NIK (dummy 3273+10 digit), NPWP (dummy), Marital Status, Dependent Children, Nationality: Indonesia
  4. Tab HR Settings: Attendance Method: Manual
  5. Save

Contract Types + Contract

⚠️ Wajib dulu: Employees → Configuration → Contract Types → New → buat PKWT dan PKWTT (tidak default di Odoo 19)

  1. Dari employee → smart button ContractsCreate
  2. Contract Type: PKWT atau PKWTT
  3. Wage: sesuai tabel · Working Schedule: Standar 8 Jam
  4. Confirm → status "Open"

📸 SCREENSHOT 10.2: Employee record (tab Private Info) · 📸 10.3: Contract status "Open"

Step 3 · 25 menit

Leave
Management

🎯 3 Leave Types + Public Holidays + Mass Allocation + Leave Request

03

3.1 Buat Leave Types + Public Holidays

Time Off → Configuration → Leave Types

Leave TypeApprovalDocument?Unpaid?
Cuti TahunanBy Employee's ApproverTidakTidak
Cuti SakitNo Validation (notifikasi)Ya (surat dokter)Tidak
Cuti Tidak DibayarSet by Time Off OfficerTidakYa ✅

3.2 Public Holidays 2026

Time Off → Configuration → Public Holidays → New

Input minimal: Tahun Baru (1 Jan) · Hari Buruh (1 Mei) · Hari Lahir Pancasila (1 Jun) · HUT RI (17 Agt) · Natal (25 Des)

⚠️ Cuti Tidak Dibayar harus di-centang Unpaid — penting agar payroll otomatis potong gaji proporsional!

3.3 Mass Allocation + Leave Request

Mass Allocation

Time Off → Managers → Allocation Requests → New

  1. Leave Type: Cuti Tahunan
  2. Allocation Type: Fixed by HR
  3. Number of Days: 12
  4. Validity: 1 Jan – 31 Des 2026
  5. Employees: Pilih semua 5 karyawan
  6. Confirm (Approve)

Simulasi Leave Request

  1. Buka Budi Santoso → smart button Time Off → New
  2. Leave Type: Cuti Tahunan
  3. Duration: 3 hari kerja
  4. Description: "Pernikahan saudara"
  5. Submit → ganti role Manager → Approve
  6. Verifikasi: saldo Budi 12 → 9 hari

📸 10.4: Leave Types (3, Unpaid tercentang) · 📸 10.5: Mass Allocation 12 hari · 📸 10.6: Leave Request Budi "Approved"

✅ Checkpoint Step 3

  • 3 Leave Types terbuat (Tahunan, Sakit, Tidak Dibayar)
  • Public Holidays 2026: minimal 5 hari tercatat
  • 12 hari cuti tahunan dialokasikan ke 5 karyawan
  • Leave Request Budi: "Approved", saldo 12 → 9

Leave request error "Insufficient balance"? → Pastikan allocation sudah di-confirm, dan validity dates mencakup tanggal request cuti.

Step 4 · 35 menit

Payroll
Setup & Payslip

🎯 Salary Structure + Rules (BPJS + PPh 21) · Compute · Cross-check · Journal

04

4.1–4.3 Salary Structure & Rules

Payroll → Configuration → Salary Structures → Buat: "Gaji Karyawan Indonesia Simplified"

Rule NameKodeKategoriFormula
Gaji PokokBASICBasiccontract.wage
Tunj. TransportTRANSPAllowance500000
Tunj. MakanMEALAllowance500000
BPJS Kesehatan (1%)BPJSKDeduction-(BASIC+TRANSP+MEAL)*0.01
BPJS JHT (2%)JHTDeduction-BASIC*0.02
BPJS JP (1%)JPDeduction-BASIC*0.01
PPh 21 EstimasiPPH21Deductionmanual input

4.3 Assign ke Contract: Buka contract setiap karyawan → Salary Structure → pilih "Gaji Karyawan Indonesia Simplified"

⚠️ PPh 21: lab ini pakai simplified approach — input manual dari perhitungan teori. Implementasi production butuh formula Python yang akurat + konsultan.

4.4–4.5 Generate Payslip + PPh 21 Manual

Payslip Budi Santoso

Payroll → Payslips → New

  1. Employee: Budi · Date: 1–28 Feb 2026
  2. Klik Compute Sheet
  3. Verifikasi breakdown:
Gaji PokokRp 4.500.000
Tunj. Transport + MakanRp 1.000.000
BPJS Kes (1%)−Rp 55.000
JHT (2%)−Rp 90.000
JP (1%)−Rp 45.000
Net (sebelum PPh)Rp 5.310.000

PPh 21 Manual — Budi (K/1)

Gross/thnRp 66.000.000
Pengurang (JHT+JP+B.Jabatan)−Rp 4.920.000
Neto/thnRp 61.080.000
PTKP K/1Rp 63.000.000
PKP−Rp 1.920.000
PPh 21Rp 0 (PKP negatif)

💡 Budi tidak kena PPh 21! Neto di bawah PTKP K/1.

4.6 Validate Payslip & Cross-Check

Validate + Journal Entry

  1. Klik Validate pada payslip Budi
  2. Status berubah → Done
  3. Accounting → Journal Entries → filter tanggal
  4. Cari jurnal payroll → verifikasi:
    Debit: Biaya Gaji · Kredit: Utang Gaji + Utang BPJS

Cross-Check BPJS (Deliverable #8)

KomponenOdooManualSelisih
BPJS Kes 1%Rp ___Rp 55.000Rp ___
JHT 2%Rp ___Rp 90.000Rp ___
JP 1%Rp ___Rp 45.000Rp ___
THP (pre-PPh)Rp ___Rp 5.310.000Rp ___

Isi tabel ini di deliverables!

📸 10.7: Payslip Budi "Compute Sheet" (breakdown) · 📸 10.8: Cross-check tabel · 📸 10.9: Journal Entry payroll

✅ Checkpoint Step 4

  • Salary Structure + 7 Salary Rules terbuat
  • Structure di-assign ke semua 5 contracts
  • Payslip Budi: Compute Sheet menampilkan breakdown lengkap
  • PPh 21 Budi = Rp 0 (PKP negatif, dikonfirmasi manual)
  • Payslip Validated → Journal Entry otomatis di Accounting
  • Tabel cross-check BPJS terisi: Odoo vs Manual → selisih Rp 0

Payslip Compute Sheet semua Rp 0? → Salary Structure belum di-assign ke contract. Buka contract → pilih structure → save → compute ulang.

Step 5 · 10 menit

Employee
Portal

🎯 Grant Portal Access + Demo Payslip & Leave dari sisi karyawan

05

5.1–5.2 Grant Access + Demo Portal

5.1 Grant Portal Access

  1. Buka employee record Budi Santoso
  2. Action → Grant Portal Access
  3. Pastikan email terisi (dummy: budi.santoso@test.com)
  4. Odoo kirim email invitation

5.2 Demo Portal (Incognito)

  1. Buka browser incognito → URL portal Odoo
  2. Login sebagai Budi
  3. My Payslips → download payslip Feb 2026
  4. My Time Off → saldo cuti: 9 hari
  5. New Leave Request → demo bisa request dari portal

📸 SCREENSHOT 10.10: Tampilan employee portal (halaman Payslips atau Time Off)

Portal access gagal / email tidak terkirim? → SMTP belum dikonfigurasi di lab. Share portal link secara manual atau reset password via admin.

Adaptasi per Tipe UMKM

AspekF&B / KafeGarment / ManufakturJasa / KonsultanRetail Multi-Outlet
Working Hours3 shift (pagi/siang/malam)2 grup (kantor/pabrik)Standar + WFHMulti-lokasi
Contract MixPKWT part-timer + PKWTTPKWTT operator + PKWT seasonalPKWTT + freelancePKWT per toko
Salary StructureStandar + tip pool2 struktur (staff vs operator + insentif)Gaji tinggi + komisiStandar seragam
JKK Rate0,24% (retail)Lebih tinggi (tekstil)0,24% (jasa)0,24% (retail)
Key ChallengeOvertime weekend + shiftInsentif produksi → PPh 21Expense reimburse + billableAttendance multi-toko

F&B: Part-timer Rp 800k/bln — apakah wajib BPJS? Ya! Sejak hari pertama kerja. Konsekuensi hukum jika tidak.

🧵 Garment: Insentif produksi Rp 2.500/lembar di atas target → masuk gross → mempengaruhi PPh 21.

📦 Deliverables

Kumpulkan: Lab10_[NIM]_[Nama].zip

📸 10.1 — Departments (min 3) & Job Positions

📸 10.2 — Employee record (tab Private Information) · 📸 10.3 — Contract "Open"

📸 10.4 — Leave Types (3, Unpaid tercentang) · 📸 10.5 — Mass Allocation 12 hari

📸 10.6 — Leave Request Budi "Approved"

📸 10.7 — Payslip Budi Compute Sheet · 📸 10.8 — Cross-check BPJS tabel

📸 10.9 — Journal Entry payroll · 📸 10.10 — Employee Portal

Bonus: B1 — Hitung PPh 21 Dewi (TK/0) vs Budi (K/1), jelaskan perbedaan (+10 poin) · B2 — Batch payslip 5 karyawan semua "Done" (+10 poin)

Rubrik Penilaian

KriteriaPoinBaik (100%)Kurang (<70%)
Step 1: Config (Dept + Jobs + WH)83 dept + 3 jobs + scheduleKurang dari 3
Step 2: Employee + Contract165 records lengkap + contracts OpenPrivate Info tidak lengkap
Step 3: Leave Types + Allocation243 types + holidays + allocation + request approvedAllocation belum confirm
Step 4: Payroll (utama)24Rules benar + payslip + cross-check + JEBPJS formula salah
Step 5: Portal8Portal aktif, payslip terlihatPortal tidak demo'd

Total: 80 poin wajib + 20 poin bonus = 100 poin.

🔧 Troubleshooting Quick Ref

Payslip semua Rp 0? → Salary Structure belum di-assign ke contract. Buka contract → pilih structure → save.

BPJS tidak terhitung / salah? → Cek formula salary rule. BPJS Kes = -(BASIC+TRANSP+MEAL)*0.01, bukan hanya BASIC.

Leave allocation tidak muncul? → Allocation belum di-confirm, atau validity dates tidak mencakup tanggal request. Cek kedua hal ini.

Journal entry payroll tidak ada? → Accounting module belum aktif, atau payroll journal belum dikonfigurasi di Payroll → Configuration → Settings.

Contract tidak bisa dibuat? → Employee belum di-save. Atau belum buat Contract Types PKWT/PKWTT di Configuration.

Preview Minggu Depan

Bab 11: CRM & Project Management

🤝 Customer Relationship Management — Pipeline, Lead, Opportunity

📋 Project Management — Tasks, Milestones, Timesheets

🔗 Integrasi CRM → Sales → Project → Invoicing

Selamat Praktikum! 🎉

Sistem Informasi Enterprise — ERP Odoo 19.0
dengan Real UMKM Partner Program