PROMPT SPESIFIKASI PROYEK: RUANGKARIR PORTAL HUB
Bertindaklah sebagai Senior Google Apps Script Developer dan Front-End Architect (Tailwind & Alpine.js/Vanilla JS Expert). Saya sedang mengembangkan aplikasi web RuangKarir, yaitu platform portal/marketplace modern yang menghubungkan alumni vokasi (SMK/Politeknik), freelancer umum, dan kreator digital dengan mitra industri/perusahaan nasional.
Aplikasi ini menggunakan basis data Google Spreadsheet (dengan nama spreadsheet verbatim: ruangkarir) dan dideploy menggunakan metode Bound Script.
I. ARSITEKTUR DATABASE SPREADSHEET (ruangkarir)
Terdapat 5 sheet dengan skema relasional yang bersih:
tbl_talents:talent_id(PK, formatTLN-YYYYMMDD-RAND),nama_lengkap,email,role_keahlian,kategori(Teknologi|Desain|Kreator|Penulis),badge(Alumni Vokasi|Kreator Digital|Freelancer),rating,proyek_selesai,rate_harga,skills(comma-separated),bio,avatar_url,created_at.tbl_companies:company_id(PK, formatCMP-YYYYMMDD-RAND),nama_perusahaan,email,industri,lokasi,logo_url,created_at.tbl_jobs:job_id(PK, formatJOB-YYYYMMDD-RAND),company_id(FK),judul_pekerjaan,kategori,budget,lokasi,persyaratan,status(Aktif|Selesai|Draf),created_at.tbl_applications:application_id(PK),job_id(FK),talent_id(FK),company_id(FK),tipe_aksi,status,applied_at.tbl_messages:message_id(PK),sender_id(FK),receiver_id(FK),isi_pesan,sent_at.
II. STRUKTUR BERKAS APLIKASI (BOUND SCRIPT)
Sistem menggunakan metode modularisasi file terpisah di Apps Script menggunakan fungsi include() sisi server:
1. Code.gs (Backend Controller)
Fungsi
doGet()untuk mengevaluasi templateIndex.htmldengan XFrameOptions modeALLOWALL.Fungsi
include(filename)untuk menyisipkan HTML/CSS/JS pendukung.Fungsi
normalizeData(headers, rowData): Melakukan normalisasi data ketat di sisi server (mengonversi objek Date menjadi string ISO/format standar, memvalidasi angka integer/float sepertirating&proyek_selesai, serta memastikan nilai Boolean aman sebelum dikonversi menjadi JSON).Fungsi CRUD Relasional:
getDashboardData(): Memuat dan menormalisasi seluruh data dari 5 sheet.addTalentServer(talentData): Pendaftaran talent baru dengan generate ID acak.addOrUpdateCompanyServer(companyData): Menyimpan atau mengedit profil perusahaan berdasarkan keberadaancompany_id.addOrUpdateJobServer(jobData): Menyimpan atau mengedit lowongan kerja aktif.sendMessageServer(messageData): Mengirimkan riwayat pesan penawaran.
2. Index.html (Main Layout & UI)
Mengintegrasikan Tailwind CSS, Chart.js, Google Fonts (Poppins, Inter), dan Lucide Icons.
Menampilkan panel Navigasi Tab dinamis (Direktori Talent, Mitra Perusahaan, Lowongan Kerja).
Menyediakan kartu statistik visual (Total Talent, Loker, Mitra, Aksi Rekrutmen).
Menyisipkan modal formulir modular:
modalTalent,modalMessage, dan menyertakan berkascompany.htmlsertaloker.htmlsecara server-side include.
3. css.html (Desain & Tema)
Menyediakan visualisasi modern SaaS: border rounded 20px, efek Glassmorphism ringan, transisi mikro-interaksi pada hover.
Memiliki kustomisasi penuh dukungan Dark Mode / Light Mode yang merespons preferensi tombol toggle di header.
4. JavaScript.html (Client-Side Controller)
Mengelola state global aplikasi (
appState) secara dinamis.Melakukan komunikasi AJAX asinkronus ke server menggunakan
google.script.runyang aman dengan visualisasi state pemuatan (loading spin).Fitur pencarian live-filtering pada direktori tab aktif tanpa perlu memuat ulang halaman (real-time client-side search).
Menggambar visualisasi grafik Chart.js (Donut Chart & Bar Chart) secara resilient: melacak referensi grafik global, menghancurkan instansi chart lama sebelum render ulang, dan menampilkan fallback otomatis jika basis data kosong.
5. company.html (Modul Perusahaan)
Form dialog modular untuk pendaftaran atau pembaruan profil mitra industri secara inline tanpa reload.
6. loker.html (Modul Lowongan Kerja)
Form dialog lowongan kerja aktif yang secara dinamis memetakan dropdown instansi penerbit langsung dari basis data
tbl_companiesterbaru.
III. INSTRUKSI PENGEMBANGAN DAN PEMBARUAN
Jika saya meminta Anda untuk melakukan modifikasi, penambahan fitur, debugging, atau pembuatan fitur baru, pastikan Anda:
Tetap mematuhi struktur pemisahan berkas di atas (
Code.gs,Index.html,JavaScript.html,css.html,company.html,loker.html).Selalu gunakan penanganan kesalahan (error handling) yang tangguh menggunakan blok
try...catchbaik di sisi server Apps Script maupun di sisi klien JavaScript.Gunakan kelas Tailwind CSS murni untuk menjaga tampilan antarmuka yang modern, responsif mobile-first, bersih, dan konsisten di setiap mode tema (Gelap/Terang).
Jangan pernah menggunakan fungsi pemblokiran UI bawaan seperti
alert()atauconfirm(); selalu gunakan elemen notifikasi toast dinamis atau pop-up modal interaktif yang disesuaikan secara estetik.
Harap konfirmasi kesiapan Anda untuk mulai memproses atau mengembangkan fitur-fitur baru berdasarkan spesifikasi sistem di atas!
PROMPT
Deskripsi & Rangkuman Aplikasi Web RuangKarir:
Fitur Navigasi Premium: Pengguna dapat menjelajahi beranda utama, menavigasi langsung ke filter marketplace talent, serta melompat ke demo SaaS Dashboard Hub instan.
Katalog Talent Interaktif:
Sistem penyaringan langsung berdasarkan kategori industri (Teknologi, Desain, Kreator, Penulis).
Penyaringan berdasarkan status kelulusan/afiliasi (Alumni Vokasi, Kreator Digital, Freelancer).
Pencarian real-time yang langsung menyaring nama, keahlian, atau jabatan talent.
Pendaftaran & Pembuatan Loker Instan:
Formulir pendaftaran talent baru (Join as Talent) yang responsif. Menambahkan entri baru langsung memperbarui katalog secara real-time pada sesi browser saat ini.
Formulir posting pekerjaan baru (Post Job) dengan notifikasi toast modern.
Desain visual: Mengusung skema warna gradasi modern ungu-biru, sudut lengkung premium 20px, efek visual glassmorphic, interaksi hover yang lembut, serta dukungan penuh Dark & Light mode.
Saya akan membuat rancangan arsitektur basis data berbasis Google Spreadsheet untuk platform RuangKarir. Sebagai Apps Script Expert, saya mendesain struktur ini dengan pendekatan relasional (seperti SQL) namun dioptimalkan untuk performa pembacaan dan penulisan baris (row-by-row) menggunakan Google Apps Script.
Rancangan ini terdiri dari 5 tabel (sheet) utama:
tbl_talents(Menyimpan profil lengkap talent, alumni vokasi, dan kreator)tbl_companies(Menyimpan data industri/perusahaan mitra)tbl_jobs(Menyimpan lowongan pekerjaan/proyek yang diterbitkan)tbl_applications(Mencatat lamaran kerja atau aksi perekrutan langsung)tbl_messages(Menyimpan riwayat pesan/kontak interaktif)
Berikut adalah rancangan lengkap kolom, tipe data, relasi antar-sheet, beserta kode Google Apps Script untuk menginisialisasi spreadsheet Anda secara otomatis.
Arsitektur Database RuangKarir (Google Spreadsheet)
Dokumen ini berisi rancangan struktur data relasional yang diterapkan pada Google Sheets untuk mendukung sistem web app RuangKarir. Setiap tabel dirancang agar mudah dibaca dan dimanipulasi menggunakan metode API Google Apps Script (SpreadsheetApp).
1. Skema Tabel (Sheets)
A. Sheet: tbl_talents
Menyimpan data profil semua talenta digital, alumni vokasi, freelancer, dan kreator.
Kolom (Header) | Tipe Data | Deskripsi / Validasi | Contoh Data |
|---|---|---|---|
| String (PK) | ID Unik (Format: |
|
| String | Nama lengkap talent |
|
| String | Email aktif (unik) |
|
| String | Judul spesialisasi pekerjaan |
|
| String | Pilihan: |
|
| String | Pilihan: |
|
| Number (Float) | Nilai performa (0.0 s.d 5.0) |
|
| Number (Int) | Jumlah proyek yang sukses diselesaikan |
|
| String | Harga jasa / tarif |
|
| String | Comma-separated list (tag keahlian) |
|
| String | Ringkasan pengalaman atau portofolio |
|
| String | URL foto profil talent |
|
| DateTime | Timestamp pendaftaran |
|
B. Sheet: tbl_companies
Menyimpan profil industri, instansi, atau UMKM yang mencari talent.
Kolom (Header) | Tipe Data | Deskripsi / Validasi | Contoh Data |
|---|---|---|---|
| String (PK) | ID Unik (Format: |
|
| String | Nama instansi / brand |
|
| String | Email operasional HR/Hiring Manager |
|
| String | Sektor usaha |
|
| String | Kota domisili kantor / Remote |
|
| String | URL logo perusahaan |
|
| DateTime | Timestamp pendaftaran |
|
C. Sheet: tbl_jobs
Menyimpan informasi lowongan pekerjaan (loker), proyek lepas, maupun program magang.
Kolom (Header) | Tipe Data | Deskripsi / Validasi | Contoh Data |
|---|---|---|---|
| String (PK) | ID Unik (Format: |
|
| String (FK) | Relasi ke |
|
| String | Nama lowongan |
|
| String | Pilihan: |
|
| String | Rentang anggaran / upah |
|
| String | Lokasi kerja |
|
| String | Kualifikasi teknis pelamar |
|
| String | Pilihan: |
|
| DateTime | Timestamp pembuatan lowongan |
|
D. Sheet: tbl_applications
Mencatat pelamar lowongan kerja atau transaksi rekrutmen langsung dari perusahaan kepada talent.
Kolom (Header) | Tipe Data | Deskripsi / Validasi | Contoh Data |
|---|---|---|---|
| String (PK) | ID Unik (Format: |
|
| String (FK) | Relasi ke |
|
| String (FK) | Relasi ke |
|
| String (FK) | Relasi ke |
|
| String | Pilihan: |
|
| String | Pilihan: |
|
| DateTime | Timestamp pengajuan |
|
E. Sheet: tbl_messages
Menyimpan pesan komunikasi masuk dari perusahaan langsung ke kontak personal talent.
Kolom (Header) | Tipe Data | Deskripsi / Validasi | Contoh Data |
|---|---|---|---|
| String (PK) | ID Unik (Format: |
|
| String (FK) | Pengirim (Bisa |
|
| String (FK) | Penerima (Bisa |
|
| String | Teks pesan/diskusi penawaran |
|
| DateTime | Timestamp pengiriman |
|
2. Relasi Basis Data (ERD Sederhana)
One-to-Many (
tbl_companies➔tbl_jobs): Satu perusahaan dapat memposting banyak lowongan kerja.Many-to-Many (
tbl_talents➔tbl_jobsviatbl_applications): Banyak talent dapat melamar banyak lowongan, menghasilkan entri unik di tabel lamaran.One-to-Many (
tbl_talents/tbl_companies➔tbl_messages): Komunikasi dinamis dua arah yang dicatat berdasarkan ID pengirim dan penerima.
3. Google Apps Script: Auto-Inisialisasi & Pengimporan CSV
Salin kode Apps Script di bawah ini ke editor script spreadsheet Anda (Ekstensi > Apps Script). Fungsi initRuangKarirDatabase() digunakan untuk menyediakan skema tabel bersih, manakala fungsi importUploadedCSVs() bertindak sebagai pemproses otomatis data CSV terunggah dari Google Drive anda.
/**
* Google Apps Script untuk Inisialisasi Database RuangKarir
* Author: Apps Script Expert
*/
function initRuangKarirDatabase() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
// Definisi struktur tabel
const databaseSchema = [
{
sheetName: "tbl_talents",
headers: ["talent_id", "nama_lengkap", "email", "role_keahlian", "kategori", "badge", "rating", "proyek_selesai", "rate_harga", "skills", "bio", "avatar_url", "created_at"]
},
{
sheetName: "tbl_companies",
headers: ["company_id", "nama_perusahaan", "email", "industri", "lokasi", "logo_url", "created_at"]
},
{
sheetName: "tbl_jobs",
headers: ["job_id", "company_id", "judul_pekerjaan", "kategori", "budget", "lokasi", "persyaratan", "status", "created_at"]
},
{
sheetName: "tbl_applications",
headers: ["application_id", "job_id", "talent_id", "company_id", "tipe_aksi", "status", "applied_at"]
},
{
sheetName: "tbl_messages",
headers: ["message_id", "sender_id", "receiver_id", "isi_pesan", "sent_at"]
}
];
// Hapus sheet default 'Sheet1' jika ada & tidak digunakan
const defaultSheet = ss.getSheetByName("Sheet1");
databaseSchema.forEach(schema => {
let sheet = ss.getSheetByName(schema.sheetName);
// Jika sheet belum ada, buat baru
if (!sheet) {
sheet = ss.insertSheet(schema.sheetName);
} else {
sheet.clear(); // Bersihkan jika sudah ada untuk re-inisialisasi
}
// Tulis header
const headerRange = sheet.getRange(1, 1, 1, schema.headers.length);
headerRange.setValues([schema.headers]);
// Desain Header (Tema Premium RuangKarir #5B5BD6)
headerRange.setBackground("#5B5BD6")
.setFontColor("#FFFFFF")
.setFontWeight("bold")
.setFontFamily("Inter")
.setHorizontalAlignment("center")
.setVerticalAlignment("middle");
// Bekukan baris pertama (freeze header)
sheet.setFrozenRows(1);
// Atur tinggi baris header agar proporsional
sheet.setRowHeight(1, 35);
// Auto-fit ukuran kolom agar rapi
sheet.autoResizeColumns(1, schema.headers.length);
});
if (defaultSheet && ss.getSheets().length > 1) {
try {
ss.deleteSheet(defaultSheet);
} catch(e) {
// Abaikan jika Sheet1 adalah satu-satunya sheet saat proses
}
}
Logger.log("Inisialisasi Database RuangKarir Berhasil!");
}
/**
* Mengimpor fail-fail CSV terunggah secara automatik dari Google Drive anda.
* Fail mestilah diletakkan di dalam Google Drive dan dinamakan mengikut padanan berikut.
*/
function importUploadedCSVs() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const csvFiles = [
{ sheetName: "tbl_talents", fileName: "ruangkarir - tbl_talents.csv" },
{ sheetName: "tbl_companies", fileName: "ruangkarir - tbl_companies.csv" },
{ sheetName: "tbl_jobs", fileName: "ruangkarir - tbl_jobs.csv" },
{ sheetName: "tbl_applications", fileName: "ruangkarir - tbl_applications.csv" },
{ sheetName: "tbl_messages", fileName: "ruangkarir - tbl_messages.csv" }
];
csvFiles.forEach(item => {
const files = DriveApp.getFilesByName(item.fileName);
if (files.hasNext()) {
const file = files.next();
const csvContent = file.getBlob().getDataAsString();
const csvData = Utilities.parseCsv(csvContent);
const sheet = ss.getSheetByName(item.sheetName);
if (sheet && csvData.length > 1) {
// Kosongkan data lama di bawah header sebelum menulis semula
const lastRow = sheet.getLastRow();
if (lastRow > 1) {
sheet.getRange(2, 1, lastRow - 1, sheet.getLastColumn()).clearContent();
}
// Asingkan pengepala fail CSV dan ambil baris data sahaja
const dataToInsert = csvData.slice(1);
if (dataToInsert.length > 0) {
sheet.getRange(2, 1, dataToInsert.length, dataToInsert[0].length).setValues(dataToInsert);
sheet.autoResizeColumns(1, sheet.getLastColumn());
Logger.log(`Berjaya mengimport ${dataToInsert.length} baris data ke dalam sheet '${item.sheetName}'.`);
}
}
} else {
Logger.log(`Peringatan: Fail "${item.fileName}" tidak ditemui di Google Drive anda.`);
}
});
Logger.log("Proses pengimporan selesai.");
}
/**
* Helper Fungsi untuk Membuat ID Unik otomatis dari Apps Script
*/
function generateUniqueID(prefix) {
const date = new Date();
const formattedDate = Utilities.formatDate(date, Session.getScriptTimeZone(), "yyyyMMdd");
const randomNum = Math.floor(1000 + Math.random() * 9000); // 4 digit angka acak
return `${prefix}-${formattedDate}-${randomNum}`;
}
4. Panduan Memasukkan Fail CSV Terunggah ke Spreadsheet
Ada dua kaedah utama untuk memindahkan fail CSV terunggah anda (ruangkarir - tbl_talents.csv, dsb.) ke dalam Google Spreadsheet yang telah dibina.
Kaedah A: Import Manual Secara Terbina (Disyorkan & Paling Selamat)
Jika anda ingin mengawal proses import tanpa menulis kod Google Drive tambahan, gunakan menu bawaan Google Sheets:
Sediakan Struktur: Pastikan anda telah menjalankan fungsi
initRuangKarirDatabase()terlebih dahulu supaya kelima-lima tab sheet (tbl_talents,tbl_companies, dsb.) sudah tersedia.Pilih Sheet Sasaran: Klik pada tab sheet yang ingin diisi (contohnya:
tbl_talents).Menu Import:
Pergi ke menu utama: Fail (File) > Import.
Pilih tab Muat Naik (Upload) dan seret fail CSV padanan anda (contoh:
ruangkarir - tbl_talents.csv).
Tetapan Import (Sangat Penting):
Lokasi Import: Pilih Gantikan data pada helaian terpilih (Replace data on selected sheet).
Jenis Pemisah (Separator Type): Pilih Kesan automatik (Detect automatically) atau Koma.
Tukar Teks kepada Nombor/Tarikh: Pilih Ya.
Klik butang Import Data.
Ulangi Proses: Lakukan perkara yang sama untuk 4 fail CSV yang lain pada tab sheet masing-masing.
Kaedah B: Import Automatik Menggunakan Google Apps Script
Kaedah ini menggunakan fungsi importUploadedCSVs() yang disertakan dalam kod di atas untuk memproses data secara automatik terus dari fail yang disimpan di storan Google Drive anda.
Muat Naik ke Drive:
Pergi ke Google Drive anda (akun yang sama dengan Spreadsheet).
Muat naik kesemua 5 fail CSV tersebut di dalam direktori utama Drive atau dalam folder kerja anda dengan mengekalkan nama asal fail:
ruangkarir - tbl_talents.csvruangkarir - tbl_companies.csvruangkarir - tbl_jobs.csvruangkarir - tbl_applications.csvruangkarir - tbl_messages.csv
Jalankan Fungsi:
Buka editor Apps Script (
Ekstensi>Apps Script).Pilih fungsi
importUploadedCSVsdari menu dropdown di bahagian atas.Klik butang Jalankan (Run).
Berikan Kebenaran (Otorisasi):
Semasa pertama kali dijalankan, sistem akan meminta kebenaran untuk mengakses akaun Google Drive anda (
DriveApp). Berikan kebenaran tersebut bagi membolehkan skrip mencari fail anda mengikut nama.
Semak Log:
Buka Execution Log di bahagian bawah untuk melihat kemajuan import. Semua data CSV akan dihuraikan (parsed) dan dimasukkan tepat di bawah pengepala baris pertama tanpa merosakkan format tema premium yang sudah dibina.
Buatkan prompt untuk backendnya dengan Menggunakan metode bound script
Berkas terpisah:
Code.gs, Index.html, JavaScript.html, css.html
Menggunakan fungsi include() sisi server
Sebagai seorang Apps Script Expert, saya telah merancang arsitektur backend lengkap menggunakan metode Bound Script (melekat pada Google Spreadsheet) dengan pemisahan berkas terstruktur (Code.gs, Index.html, JavaScript.html, css.html).
Sistem ini dirancang khusus untuk memenuhi kebutuhan produksi:
Include Sisi Server (
<?!= include(...) ?>): Memisahkan kode HTML, CSS, dan JS agar rapi dan mudah dirawat.Normalisasi Data Ketat (Server-Side): Semua data dari Spreadsheet berupa Tanggal (Date), Angka (Float/Int), dan Boolean diubah ke format standar JSON-safe sebelum dikirim ke antarmuka klien. Hal ini mencegah kegagalan serialisasi di Google Sheets API.
Pemuatan Grafik Aman (Error-Resilient Charts): Menggunakan Chart.js dengan validasi elemen DOM, penanganan data kosong, serta siklus hidup penghancuran instansi grafik lama sebelum menggambar ulang untuk menghindari galat tabrakan canvas.
Berikut adalah berkas-berkas siap pakai yang dapat langsung disalin ke Editor Google Apps Script Anda (Ekstensi > Apps Script).


Tidak ada komentar:
Posting Komentar