# Central Plafon: toko online, admin, dan kasir dalam satu platform

Central Plafon menjual plafon dan material interior serta melayani pemasangan di Karawaci, untuk pembeli eceran maupun distributor. Pahat Digital membuatkan toko online, halaman admin, dan aplikasi kasir yang semuanya terhubung dalam satu sistem.

- Klien: Central Plafon
- Jenis: Toko online, admin, dan kasir, Tangerang
- Situs: https://centralplafon.com
- Teknologi: NestJS 11, Drizzle ORM, PostgreSQL, Redis, Next.js 15, Vite + React 19, Electron, Firebase Auth, Turborepo + Bun

## Kebutuhan klien

Central Plafon, unit usaha Aetorix Group, menjual plafon, wall panel, lantai PVC, baja ringan, dan material
interior lain, beserta jasa pemasangan. Penjualan terjadi di toko, lewat distributor (B2B), dan ke pembeli eceran
(B2C), jadi data produk dan pesanan harus sama di semua saluran.

## Yang kami kerjakan

- **Toko online untuk pelanggan,** tempat melihat katalog dan memesan.
- **Halaman admin untuk pengelola toko.**
- **Aplikasi kasir untuk toko,** yang tetap bisa dipakai saat internet putus dan menyamakan datanya begitu internet
  kembali.
- **Satu pusat data.** Ketiganya memakai data yang sama, jadi data produk dan pesanan sama di semua saluran.
- **Pencarian yang mengerti maksud.** Pembeli tetap menemukan produk walaupun kata yang diketik tidak sama persis.

## Hasil

Platform berjalan di centralplafon.com. Di Google Lighthouse, alat ukur mutu website dari Google, toko online-nya mendapat nilai 87 dari 100 untuk kecepatan dan
100 dari 100 untuk SEO.

Rincian pengukuran: Performance 87, Accessibility 96, Best Practices 100, SEO 100, LCP 4,1 detik, dan CLS 0
(diukur 7 November 2026 dari MacBook Pro M1, Lighthouse 13.6.0,
emulasi Moto G Power Slow 4G).

## Untuk yang ingin tahu teknisnya

- **Satu sumber data.** Satu backend, core-api (NestJS 11), melayani semua aplikasi.
- **Aplikasi sesuai penggunanya.** Toko online (Next.js 15), dashboard admin (Vite + React 19), dan aplikasi kasir
  desktop (Electron) yang dirancang offline-first.
- **Data dan login.** PostgreSQL dengan Drizzle ORM, cache di Redis, dan login dengan Firebase Auth.
- **Pencarian.** Pencarian produk semantik berbasis embedding.
- **Satu repositori.** Monorepo Turborepo + Bun dengan tipe data dan komponen bersama.

<figure class="diagram" tabindex="0">
<svg viewBox="0 0 640 260" role="img" aria-labelledby="d-judul d-isi">
<title id="d-judul">Arsitektur platform Central Plafon</title>
<desc id="d-isi">Toko online, dashboard admin, dan aplikasi kasir memanggil satu backend core-api. Core-api menyimpan data di PostgreSQL, memakai Redis sebagai cache, dan memeriksa login lewat Firebase Auth.</desc>
<defs><marker id="panah" viewBox="0 0 8 8" refX="8" refY="4" markerWidth="8" markerHeight="8" markerUnits="userSpaceOnUse" orient="auto-start-reverse"><path class="d-panah" d="M0,0 L8,4 L0,8 z"/></marker></defs>
<rect class="d-kotak" x="20" y="20" width="170" height="52"/>
<text class="d-teks" x="105" y="42" text-anchor="middle">Toko online</text>
<text class="d-kecil" x="105" y="60" text-anchor="middle">Next.js 15 · pelanggan</text>
<rect class="d-kotak" x="20" y="104" width="170" height="52"/>
<text class="d-teks" x="105" y="126" text-anchor="middle">Dashboard admin</text>
<text class="d-kecil" x="105" y="144" text-anchor="middle">Vite + React 19</text>
<rect class="d-kotak" x="20" y="188" width="170" height="52"/>
<text class="d-teks" x="105" y="210" text-anchor="middle">Kasir desktop</text>
<text class="d-kecil" x="105" y="228" text-anchor="middle">Electron · offline-first</text>
<rect class="d-utama" x="245" y="96" width="150" height="68"/>
<text class="d-teks d-terang" x="320" y="126" text-anchor="middle">core-api</text>
<text class="d-kecil d-terang" x="320" y="146" text-anchor="middle">NestJS 11</text>
<rect class="d-kotak" x="450" y="20" width="170" height="52"/>
<text class="d-teks" x="535" y="42" text-anchor="middle">PostgreSQL</text>
<text class="d-kecil" x="535" y="60" text-anchor="middle">Drizzle ORM</text>
<rect class="d-kotak" x="450" y="104" width="170" height="52"/>
<text class="d-teks" x="535" y="126" text-anchor="middle">Redis</text>
<text class="d-kecil" x="535" y="144" text-anchor="middle">cache</text>
<rect class="d-kotak d-putus" x="450" y="188" width="170" height="52"/>
<text class="d-teks" x="535" y="210" text-anchor="middle">Firebase Auth</text>
<text class="d-kecil" x="535" y="228" text-anchor="middle">login</text>
<line class="d-garis" x1="190" y1="46" x2="243" y2="110" marker-end="url(#panah)"/>
<line class="d-garis" x1="190" y1="130" x2="243" y2="130" marker-end="url(#panah)"/>
<line class="d-garis d-putus" x1="190" y1="214" x2="243" y2="150" marker-end="url(#panah)"/>
<line class="d-garis" x1="395" y1="110" x2="448" y2="46" marker-end="url(#panah)"/>
<line class="d-garis" x1="395" y1="130" x2="448" y2="130" marker-end="url(#panah)"/>
<line class="d-garis" x1="395" y1="150" x2="448" y2="214" marker-end="url(#panah)"/>
</svg>
<figcaption>Tiga aplikasi, satu backend. Garis putus-putus: kasir menyinkronkan data saat kembali online.</figcaption>
</figure>

## Peran Pahat Digital

Merancang arsitektur, membangun keempat aplikasi, dan menjalankannya di server grup.

---

Pahat Digital, bagian dari Aetorix Group: https://aetorix.com
Terakhir diperbarui: 2026-11-10 · https://pahatdigital.com/karya/central-plafon
