Skip to Content

Employees (Karyawan)

CodeSET-EMP
ModuleSettings
TypeMaster data
StatusImplemented
PriorityP0 — MVP
ProcessSetup tenant
API[URL Postman]

1. Overview

Karyawan adalah data orang yang bekerja di tenant dan ditugaskan ke satu atau lebih toko. Karyawan punya kode (dibuat BE), profil (nama, email, telepon, jenis kelamin), status aktif, dan daftar toko penugasan. Karyawan terhubung ke sebuah entitas. Bila entitas yang sama juga punya akun pengguna, karyawan itu bisa login dan bertindak sebagai dirinya, misalnya sebagai PIC Pesanan Pembelian.

Karyawan bisa dibuat dari awal (entitas baru dibuat otomatis) atau dari entitas yang sudah ada, misalnya dari pengguna yang belum tercatat sebagai karyawan.

Hasil yang diharapkan: tenant tahu siapa bekerja di toko mana, dan data karyawan bisa dipakai sebagai penanggung jawab di transaksi.

2. Problem

  • Transaksi seperti PO butuh penanggung jawab yang jelas dan terbatas pada karyawan toko terkait.
  • Karyawan sering berpindah atau merangkap di beberapa cabang.
  • Karyawan yang sudah keluar tidak boleh dipilih lagi, tetapi riwayatnya harus tetap ada.

3. Goals & Non-goals

Goals

  • Admin bisa mendaftarkan karyawan dan menugaskannya ke toko. Indikator: karyawan muncul di pilihan penanggung jawab transaksi toko tersebut.
  • Tidak ada duplikasi identitas. Indikator: karyawan bisa dibuat dari entitas yang sudah ada.
  • Karyawan nonaktif bisa dibedakan. Indikator: status tampil di daftar dan di combobox pemilihan.

Non-goals

  • Jabatan, gaji, jadwal kerja, dan absensi
  • Hak akses (diatur lewat Pengguna dan Peran)
  • Riwayat mutasi antar toko (selain log aktivitas)

4. User Scenarios

RoleScenario
OwnerMendaftarkan kasir baru dan menugaskannya ke dua cabang
AdminMenjadikan pengguna yang sudah ada sebagai karyawan tanpa mengetik ulang nama dan email
Kepala TokoMemindahkan karyawan dari cabang A ke cabang B
OwnerMenonaktifkan karyawan yang sudah keluar

5. User Flow

  1. Pilih sumber — Dialog muncul saat membuka Tambah Karyawan:

    • Buat dari Awal: formulir kosong.
    • Buat dari Entitas: tabel entitas yang belum punya data karyawan (bisa dicari dan diurutkan, 10 per halaman). Nama lengkap dan email diisi otomatis dari entitas terpilih.

    Tombol Selanjutnya aktif setelah sumber dipilih (dan entitas dipilih bila sumbernya entitas). Tombol Kembali mengarah ke daftar karyawan.

  2. Profil — Status (Aktif / Tidak Aktif, wajib), nama lengkap, jenis kelamin (Laki-laki / Perempuan), email, dan nomor telepon; semuanya wajib.

  3. Toko — Pilih satu atau lebih toko dari daftar semua toko (kartu dengan checkbox).

  4. Tinjauan — Ringkasan beserta error BE bila ada.

  5. Simpan — Bila sumbernya entitas, dikirim ke endpoint by-party dengan party_id.

  6. Tersimpan — Toast sukses, kembali ke daftar karyawan.

  7. Detail / Ubah — Tab Profil menampilkan kode karyawan (read-only) dan profil. Tab Toko menampilkan toko penugasan. Kedua tab disimpan terpisah.

Alternative paths

  • Tinggalkan wizard tanpa simpan — muncul konfirmasi perubahan belum disimpan.
  • Hapus karyawan — hanya dari daftar (satuan atau massal), setelah konfirmasi.

6. User Stories

Prioritas: P0 wajib untuk rilis, P1 penting, P2 kalau sempat.

US-01 — Membuat karyawan dari awal (P0)

Sebagai owner, saya ingin mendaftarkan karyawan baru, agar bisa ditugaskan ke toko.

IDKriteria penerimaan
AC-01.1Membuka Tambah Karyawan menampilkan dialog pilihan sumber; memilih “Buat dari Awal” membuka wizard Profil → Toko → Tinjauan.
AC-01.2Status, nama lengkap, jenis kelamin, email (format valid), dan telepon wajib diisi.
AC-01.3Minimal satu toko wajib dipilih.
AC-01.4Setelah berhasil, toast sukses tampil dan pengguna diarahkan ke daftar karyawan.
AC-01.5Error BE tampil di langkah Tinjauan dan pada field terkait.

US-02 — Membuat karyawan dari entitas (P1)

Sebagai admin, saya ingin membuat karyawan dari entitas yang sudah ada, agar tidak terjadi duplikasi identitas.

IDKriteria penerimaan
AC-02.1Tabel entitas hanya menampilkan entitas yang belum punya data karyawan.
AC-02.2Setelah entitas dipilih dan klik Selanjutnya, nama lengkap dan email terisi dari entitas.
AC-02.3Data dikirim dengan party_id entitas terpilih; tidak ada entitas baru yang dibuat.

US-03 — Mengubah profil karyawan (P0)

Sebagai admin, saya ingin memperbarui profil dan status karyawan, agar data tetap akurat.

IDKriteria penerimaan
AC-03.1Tombol Ubah Data hanya tampil untuk pengguna dengan izin update.
AC-03.2Kode karyawan tampil tetapi tidak bisa diubah.
AC-03.3Validasi sama dengan pembuatan (AC-01.2); tombol simpan aktif hanya jika ada perubahan.

US-04 — Mengubah penugasan toko (P0)

Sebagai kepala toko, saya ingin mengubah toko penugasan karyawan, agar sesuai tempat kerjanya.

IDKriteria penerimaan
AC-04.1Tab Toko di mode lihat hanya menampilkan toko penugasan; di mode ubah menampilkan semua toko dengan checkbox.
AC-04.2Minimal satu toko harus tetap terpilih.
AC-04.3Daftar toko penugasan diganti seluruhnya dengan pilihan baru saat disimpan.

US-05 — Daftar dan filter karyawan (P0)

Sebagai owner, saya ingin melihat dan menyaring karyawan, agar mudah menemukan karyawan tertentu.

IDKriteria penerimaan
AC-05.1Kolom: kode, nama lengkap, jenis kelamin, toko, sebagai pengguna (email, tautan ke detail pengguna), sebagai pemasok (kode, tautan ke detail pemasok), dan status.
AC-05.2Pencarian kata kunci; filter lanjutan jenis kelamin dan status; paginasi; urutan default nama A–Z.
AC-05.3Aksi baris: Lihat, Ubah, Hapus sesuai izin; hapus massal dari baris terpilih.

US-06 — Menghapus karyawan (P1)

Sebagai owner, saya ingin menghapus karyawan yang salah dibuat.

IDKriteria penerimaan
AC-06.1Hapus satuan dan massal memerlukan konfirmasi dan izin delete.
AC-06.2Bila BE menolak, pesan error tampil sebagai toast.

US-07 — Riwayat aktivitas (P2)

Sebagai auditor, saya ingin melihat log aktivitas karyawan.

IDKriteria penerimaan
AC-07.1Log tersedia untuk semua karyawan (di daftar) dan per karyawan (di detail), dengan filter event, pelaku, dan rentang tanggal.

7. Document Structure

Header (Profil)

FieldRequiredDefaultNotes
KodeOtomatisDibuat BERead-only
Status (is_active)YaBelum dipilih (buat)Aktif / Tidak Aktif
Nama LengkapYaDari entitas (jika sumber entitas)Disimpan di entitas
Jenis KelaminYamale / female
EmailYaDari entitas (jika sumber entitas)Format email valid
Nomor TeleponYaTeks bebas

Lines (Toko penugasan)

FieldRequiredDefaultNotes
TokoYa, minimal 1Dikirim sebagai array id toko (stores: string[])

8. Status Lifecycle

StatusLabel UIMeaningEditableNext status
is_active: trueAktifKaryawan bekerja; bisa dipilih di transaksiYaTidak Aktif, dihapus
is_active: falseTidak AktifKaryawan tidak bekerja; ditandai di combobox pemilihanYaAktif, dihapus

9. Permissions & Actions

Permissions

ActionPermissionSyarat tambahan
Lihat daftar dan log semua karyawansettings:employee:list:any
Lihat detail karyawansettings:employee:view:any
Buat karyawansettings:employee:create:any
Ubah profil / tokosettings:employee:update:any
Hapus karyawansettings:employee:delete:any

FE menyembunyikan aksi yang tidak diizinkan; BE tetap menolaknya.

10. Business Rules

Aturan bisnis adalah ketentuan yang berlaku di semua layar dan semua aksi, siapa pun yang melakukannya. FE memakainya sebagai validasi di form, BE memakainya sebagai sumber kebenaran; jika keduanya berbeda, perilaku BE yang dianggap benar dan FE menyesuaikan.

  • BR-01 Kode karyawan dibuat oleh BE dan tidak bisa diubah.
  • BR-02 Status, nama lengkap, jenis kelamin, email, dan telepon wajib diisi.
  • BR-03 Karyawan wajib ditugaskan ke minimal satu toko.
  • BR-04 Satu entitas maksimal punya satu data karyawan; membuat dari entitas hanya bisa memakai entitas yang belum punya karyawan.
  • BR-05 Karyawan hanya bisa dipilih sebagai penanggung jawab transaksi pada toko tempat ia ditugaskan.
  • BR-06 Setiap perubahan dicatat di log aktivitas.

11. Edge Cases

Edge case adalah kondisi yang jarang terjadi tetapi pasti muncul di operasional nyata. Perilaku yang diharapkan ditetapkan di sini agar tidak diputuskan sendiri-sendiri saat implementasi.

IDCaseExpected behavior
EC-01Karyawan dibuat dari entitas lalu nama/email diubah di wizardNilai baru dikirim bersama party_id; apakah data entitas ikut diperbarui ditentukan BE
EC-02Email karyawan sama dengan email entitas lainDitentukan BE (validasi unik); error tampil pada field email
EC-03Karyawan dicabut dari toko tempat ia menjadi PIC POPO yang sudah ada tetap menyimpan PIC tersebut; ia tidak lagi muncul di pilihan PIC toko itu
EC-04Karyawan dinonaktifkanTetap tampil di pilihan dengan penanda status; perilaku terhadap transaksi berjalan ditentukan BE
EC-05Menghapus karyawan yang menjadi PIC transaksiDitentukan BE; bila ditolak, pesan error tampil sebagai toast
EC-06Toko ditampilkan tanpa alamat pada pilihan tokoAlamat toko belum dikirim BE; placeholder ”-” ditampilkan
EC-07Tidak ada entitas tanpa karyawan saat memilih “Dari Entitas”Tabel kosong; pengguna bisa kembali memilih “Dari Awal”

12. API Contract

ActionMethodEndpointRef
Daftar karyawan (paginasi, cari, filter)GET/api/employees/paginateUS-05
Daftar karyawan (cursor)GET/api/employees/cursor
Detail karyawanGET/api/employees/:idUS-03
Buat karyawan dari awalPOST/api/employeesUS-01
Buat karyawan dari entitasPOST/api/employees/by-partyUS-02
Ubah profil karyawanPUT/api/employees/:idUS-03
Daftar toko penugasanGET/api/employees/:id/storesUS-04
Ubah toko penugasanPOST/api/employees/:id/storesUS-04
Hapus karyawanDELETE/api/employees/:idUS-06
Hapus karyawan massalDELETE/api/employees/bulkUS-06
Log aktivitas semua karyawanGET/api/employees/activity-logs/cursorUS-07
Log aktivitas satu karyawanGET/api/employees/:id/activity-logs/cursorUS-07
Entitas tanpa karyawan (filter: doesnt_have=employee)GET/api/parties/paginateUS-02
Semua toko (pilihan penugasan)GET/api/stores?is_with_address=trueUS-04

13. Dependencies

PRD terkait

  • Entities — identitas karyawan dan sinkronisasi dengan pengguna/pemasok.
  • Stores — toko penugasan.
  • Users — karyawan yang juga pengguna bisa login dan bertindak sebagai PIC.
  • Purchase Order — penanggung jawab dipilih dari karyawan toko.
  • Activity Logs — sumber log aktivitas.

Efek ke modul lain

  • Pilihan penanggung jawab di transaksi diambil dari karyawan toko (/api/stores/:id/employees/cursor).
Last updated on