Kembali ke Proyek
Sistem Internal
PT. Noxus Ideata Prima

Layanan Backend CRM BUMN

Platform microservices CRM enterprise untuk sebuah BUMN besar, memigrasikan sistem billing lama ke arsitektur berbasis approval workflow.

Java
Spring Boot
Spring Security
Oracle DB
Apache Kafka
Microservices

Ringkasan

Layanan backend untuk sebuah BUMN besar, dibangun sebagai bagian dari PT. Noxus Ideata Prima. Sistem ini adalah platform Customer Relationship Management (CRM) enterprise, dibangun untuk menggantikan sistem billing lama dengan arsitektur modular yang modern — mencakup manajemen akun, manajemen pengguna, dan manajemen produk & promo.

flowchart TB
    subgraph Client["Klien"]
        FE["React SPA<br/>satu shell untuk semua modul bisnis"]
    end

    subgraph Gateway["Reverse Proxy (Nginx)"]
        NG["Rute berdasarkan path prefix<br/>per domain bisnis"]
    end

    subgraph Services["Microservices Bisnis (Spring Boot)"]
        ACC["Layanan Manajemen Akun"]
        UM["Layanan Manajemen Pengguna"]
        PP["Layanan Produk & Promo"]
        NOTIF["Layanan Notifikasi"]
    end

    subgraph Shared["Shared Libraries (Maven)"]
        COMMON["Common Library<br/>security, JWT/LDAP, approval engine, notification client"]
        CRM["Common CRM Library<br/>entity + repository JPA untuk seluruh skema"]
        BASE["Common Base Library<br/>base entity, generic filter/spec framework"]
    end

    subgraph Infra["Infrastruktur"]
        ORA[("Oracle DB")]
        KAFKA{{"Kafka<br/>topic notifikasi"}}
        MINIO[("Object Storage<br/>lampiran")]
        LDAP[("LDAP / Active Directory")]
    end

    FE --> NG
    NG --> ACC & UM & PP & NOTIF

    ACC --> COMMON & CRM
    UM --> COMMON & CRM
    PP --> COMMON & CRM
    CRM --> BASE

    ACC & UM & PP & CRM --> ORA
    ACC & UM & PP -->|publish event| KAFKA --> NOTIF
    NOTIF -->|push real-time| FE
    ACC & UM & PP --> MINIO
    UM --> LDAP

Setiap layanan bisnis di-deploy dan di-scale secara independen (Helm chart-nya masing-masing di Kubernetes), namun ketiganya berbagi satu skema Oracle yang sama melalui shared JPA library, bukan mendefinisikan entity sendiri-sendiri — sehingga model data dan sebagian besar logika security/approval terpusat di satu tempat, bukan terduplikasi di tiap layanan.

Masalah

  • Sistem billing lama bersifat rigid dan sulit dikembangkan seiring pertumbuhan bisnis.
  • Data sensitif (akun, harga, promo, kontrak) membutuhkan proses approval berjenjang yang bisa dilacak sebelum perubahan apa pun bisa diterapkan.
  • Data billing lama selama bertahun-tahun harus dipindahkan ke sistem baru tanpa mengganggu operasional harian.

Solusi

  • Layanan modular, masing-masing bertanggung jawab atas satu area bisnis (akun, pengguna, produk & promo), sehingga tim bisa membangun dan merilis secara independen.
  • Approval workflow bawaan: setiap perubahan sensitif diarahkan ke approver yang tepat sebelum berlaku, lengkap dengan audit trail.
  • Notifikasi real-time sehingga approver dan requester langsung mendapat info begitu keputusan dibutuhkan atau dibuat.
  • Migrasi data bertahap yang memindahkan data lama ke sistem baru secara aman, menandai data yang perlu ditinjau manual alih-alih memblokir keseluruhan proses.

Approval Workflow (dipakai bersama di semua modul)

sequenceDiagram
    participant U as Pengguna
    participant SVC as Layanan Bisnis<br/>(Account/Product/User)
    participant APR as Approval Engine<br/>(Common Library)
    participant DB as Oracle DB
    participant KAFKA as Kafka
    participant NOTIF as Layanan Notifikasi
    participant APV as Approver

    U->>SVC: Kirim perubahan
    SVC->>DB: Simpan/update record bisnis (pending)
    SVC->>APR: Daftarkan permintaan approval
    APR->>DB: Insert record approval (WAITING_FOR_APPROVAL)
    APR->>KAFKA: publish notification.create
    KAFKA->>NOTIF: consume event
    NOTIF-->>APV: notifikasi real-time
    APV->>SVC: Buka detail record
    SVC->>APR: Cek apakah user saat ini adalah approver
    APR-->>SVC: true / false
    SVC-->>APV: Tampilkan detail approval (hanya jika approver yang berwenang)
    APV->>SVC: Approve / Reject
    SVC->>DB: Update riwayat approval + status record
    SVC->>KAFKA: publish notification.broadcast (keputusan)
    KAFKA->>NOTIF: consume
    NOTIF-->>U: beri tahu requester atas keputusan

Engine yang sama menangani approval untuk semua domain — approver di level saat ini ditentukan dengan mencocokkan posisi yang dibutuhkan oleh approval hierarchy dengan posisi user yang mengajukan/menyetujui, sehingga aksi approval hanya muncul untuk user yang memang berwenang di level tersebut.

Model Data Sederhana

erDiagram
    CUSTOMER ||--o{ ACCOUNT : "memiliki"
    ACCOUNT ||--o{ SERVICE_AGREEMENT : "memiliki"
    ACCOUNT ||--o{ PROMO : "menerima"
    PRODUCT ||--o{ PRODUCT_VERSION : "versioned (copy-on-write)"
    PRODUCT_VERSION ||--o{ PRICING : "diberi harga"
    PRODUCT_VERSION ||--o{ TERMS_OF_SERVICE : "diatur oleh"
    EMPLOYEE ||--o{ POSITION_ASSIGNMENT : "ditugaskan"
    POSITION_ASSIGNMENT }o--|| POSITION : "menempati"
    POSITION ||--o{ APPROVAL_HIERARCHY : "level approval"
    APPROVAL ||--o{ APPROVAL_HISTORY : "jejak keputusan"
    ACCOUNT ||--o{ APPROVAL : "butuh approval (via kategori)"
    PRODUCT_VERSION ||--o{ APPROVAL : "butuh approval (via kategori)"
    PROMO ||--o{ APPROVAL : "butuh approval (via kategori)"

Relasi ke APPROVAL bersifat konseptual, bukan foreign key literal — tabel approval menyimpan record ID generik plus kolom kategori yang menandai domain asalnya, dipakai bersama oleh semua modul bisnis. Produk mengikuti pola copy-on-write versioning: setiap perubahan membuat baris product-version baru, bukan mengubah baris yang sudah ada.

Kontribusi Utama

  • Membangun API endpoint inti untuk manajemen akun, service agreement, dan harga/promo.
  • Menyelesaikan masalah sinkronisasi data antar layanan yang berbagi data yang sama.
  • Berkontribusi pada upaya migrasi data dari sistem lama ke sistem baru.
  • Memenuhi standar keamanan dan kualitas kode tingkat enterprise yang disyaratkan untuk klien BUMN.