OPTEMA AI

This commit is contained in:
Flatlogic Bot 2026-06-19 16:04:15 +00:00
parent 60f601a85b
commit 0ab3040f29
5 changed files with 138 additions and 66 deletions

View File

@ -15,7 +15,7 @@ class ProblemCaseForm(forms.ModelForm):
"description": forms.Textarea(attrs={
"class": "form-control problem-textarea",
"rows": 9,
"placeholder": "Contoh: Kuliah di Singapura atau Jepang, dana 200 juta, ingin 3 tahun selesai.",
"placeholder": "Contoh: BUMN rugi karena biaya tinggi, omzet turun 30%, atau kuliah Jepang/Singapura dengan dana 200 juta.",
}),
"urgency": forms.TextInput(attrs={
"type": "range",

View File

@ -16,7 +16,7 @@
<p class="eyebrow mb-3">Mesin Pemecah Masalah Universal & Decision Intelligence Platform</p>
<h1 class="display-heading mb-4">💡 OPTEMA AI</h1>
<h2 class="hero-subtitle mb-3">Optimal, Effective, Efficient Management Assistant</h2>
<p class="hero-copy mb-4">MVP single-user tanpa login: masukkan masalah bisnis, keuangan, karier, logistik, teknologi, atau pendidikan; atur urgensi, lalu dapatkan simulasi Problem Detection, Root Cause, Decision Scoring, dan Action Plan yang tersimpan otomatis.</p>
<p class="hero-copy mb-4">MVP single-user tanpa login: masukkan masalah pemerintah/publik, bisnis, keuangan, karier, logistik, teknologi, atau pendidikan; atur urgensi, lalu dapatkan simulasi Problem Detection, Root Cause, Decision Scoring, dan Action Plan yang tersimpan otomatis.</p>
<div class="d-flex flex-wrap gap-3">
<a href="#analisis" class="btn btn-optema btn-lg">Jalankan Analisis AI</a>
<a href="{% url 'case_list' %}" class="btn btn-outline-optema btn-lg">Lihat Riwayat Case</a>
@ -70,7 +70,7 @@
<span class="panel-icon">📥</span>
<div>
<h2>Input Masalah</h2>
<p>Masukkan masalah, target, atau hambatan Anda. Contoh: kuliah Singapura/Jepang dengan budget terbatas.</p>
<p>Masukkan masalah, target, atau hambatan Anda. Contoh: BUMN rugi karena biaya tinggi, omzet toko turun, atau kuliah Singapura/Jepang dengan budget terbatas.</p>
</div>
</div>
<form method="post" novalidate>

View File

@ -228,6 +228,7 @@ def _build_case_insights(description, category=None):
countries = case_data.get("countries")
percentages = case_data.get("percentages") or []
detected = [
{"label": "Sektor/Kategori", "value": category or "Umum", "note": "hasil deteksi keyword dari knowledge database OPTEMA"},
{"label": "Dana/budget", "value": _format_idr(budget) if budget else "Belum disebut", "note": "angka terbesar yang terdeteksi sebagai uang" if budget else "tambahkan nominal agar kalkulasi lebih presisi"},
{"label": "Target waktu", "value": _format_years(years) if years else "Belum disebut", "note": "diambil dari kata tahun/bulan/semester" if years else "tambahkan deadline atau durasi target"},
{"label": "Persentase/rasio", "value": ", ".join(f"{value:g}%" for value in percentages) if percentages else "Belum disebut", "note": "persen yang muncul di pertanyaan" if percentages else "tambahkan rasio seperti turun 30% atau target naik 20%"},
@ -271,6 +272,12 @@ def _build_case_insights(description, category=None):
if best["shortfall_low"] else
f"Opsi paling aman secara angka awal adalah {best['country']} karena estimasi minimumnya masih masuk budget."
)
elif category and category != "Pendidikan":
category_item = next((item for item in ANALYSIS_DATABASE if item["kategori"] == category), None)
if category_item:
primary_cause = category_item["penyebab"][0]
primary_solution = category_item["solusi"][0]
recommendation = f"Sektor terdeteksi: {category}. Dengan konteks {_case_constraint_note(case_data)}, validasi dulu akar masalah utama: {primary_cause}. Prioritas solusi awal: {primary_solution}."
elif calculations:
recommendation = f"Analisis disesuaikan dengan {_case_constraint_note(case_data)}; gunakan angka ini sebagai batas saat memilih solusi."
@ -291,6 +298,114 @@ def _build_case_insights(description, category=None):
}
SECTOR_DATABASE = {
"pemerintah": {
"kategori": "Pemerintah",
"keyword": [
"bumn", "kementerian", "negara", "pemerintah", "anggaran", "publik",
"dinas", "pemda", "layanan publik", "instansi",
],
"root": [
"Inefisiensi operasional",
"Pengawasan lemah",
"Tata kelola buruk",
"Beban biaya tinggi",
"Strategi tidak tepat",
],
"solution": [
"Restrukturisasi organisasi",
"Audit biaya",
"Perbaikan tata kelola",
"Digitalisasi proses",
"Evaluasi kinerja",
],
"impact_label": "Publik/anggaran",
"priority": 25,
},
"bisnis": {
"kategori": "Bisnis",
"keyword": [
"bisnis", "usaha", "jualan", "toko", "produk", "omzet",
"penjualan", "layanan", "customer", "pelanggan",
],
"root": [
"Target pasar salah",
"Marketing kurang efektif",
"Produk tidak sesuai kebutuhan",
"Biaya operasional tinggi",
],
"solution": [
"Riset pelanggan",
"Perbaikan produk",
"Optimasi pemasaran",
"Efisiensi operasional",
],
"impact_label": "Besar",
"priority": 10,
},
"keuangan": {
"kategori": "Keuangan",
"keyword": [
"uang", "hutang", "utang", "modal", "gaji", "biaya",
"cashflow", "kas", "tabungan", "budget",
],
"root": [
"Cashflow tidak sehat",
"Pengeluaran besar",
"Pemasukan rendah",
],
"solution": [
"Kontrol biaya",
"Buat anggaran",
"Tambah pendapatan",
],
"impact_label": "Cashflow/budget",
"priority": 10,
},
"teknologi": {
"kategori": "Teknologi",
"keyword": [
"aplikasi", "website", "coding", "software", "error",
"program", "bug", "sistem", "otomatisasi",
],
"root": [
"Bug sistem",
"Arsitektur kurang baik",
"Proses manual",
],
"solution": [
"Audit sistem",
"Perbaikan kode",
"Otomatisasi",
],
"impact_label": "Teknis/operasional",
"priority": 10,
},
"logistik": {
"kategori": "Logistik",
"keyword": [
"kirim", "barang", "gudang", "rute", "pengiriman",
"distribusi", "tracking", "kurir",
],
"root": [
"Rute buruk",
"Monitoring kurang",
"Distribusi lambat",
],
"solution": [
"Optimasi rute",
"Tracking real-time",
"Perbaikan SOP",
],
"impact_label": "Operasional",
"priority": 10,
},
}
for sector_data in SECTOR_DATABASE.values():
sector_data["penyebab"] = sector_data["root"]
sector_data["solusi"] = sector_data["solution"]
ANALYSIS_DATABASE = [
{
"kategori": "Pendidikan",
@ -312,39 +427,9 @@ ANALYSIS_DATABASE = [
"impact_label": "Budget ketat",
"priority": 50,
},
{
"kategori": "Bisnis",
"keyword": ["jualan", "penjualan", "produk", "usaha", "bisnis", "toko"],
"penyebab": [
"Target pasar tidak tepat",
"Promosi kurang efektif",
"Produk belum sesuai kebutuhan pasar",
],
"solusi": [
"Riset pelanggan",
"Perbaiki produk",
"Optimasi pemasaran",
"Bangun channel penjualan",
],
"impact_label": "Besar",
"priority": 10,
},
{
"kategori": "Keuangan",
"keyword": ["uang", "hutang", "utang", "gaji", "tabungan", "biaya"],
"penyebab": [
"Tidak ada kontrol keuangan",
"Pengeluaran terlalu besar",
"Pemasukan kurang optimal",
],
"solusi": [
"Buat anggaran",
"Kurangi biaya tidak penting",
"Cari sumber pemasukan baru",
],
"impact_label": "Cashflow/budget",
"priority": 10,
},
SECTOR_DATABASE["pemerintah"],
SECTOR_DATABASE["bisnis"],
SECTOR_DATABASE["keuangan"],
{
"kategori": "Karier",
"keyword": ["kerja", "pekerjaan", "cv", "skill", "karir", "karier"],
@ -361,41 +446,26 @@ ANALYSIS_DATABASE = [
"impact_label": "Dampak karier",
"priority": 10,
},
SECTOR_DATABASE["logistik"],
SECTOR_DATABASE["teknologi"],
{
"kategori": "Logistik",
"keyword": ["kirim", "pengiriman", "barang", "gudang", "rute"],
"kategori": "Umum",
"keyword": [],
"penyebab": [
"Rute tidak optimal",
"Monitoring kurang",
"Proses distribusi lambat",
"Tujuan dan batasan belum cukup spesifik",
"Data pendukung belum lengkap",
"Opsi solusi belum diprioritaskan",
],
"solusi": [
"Optimasi rute",
"Tracking barang",
"Perbaiki sistem distribusi",
"Perjelas tujuan dan indikator sukses",
"Kumpulkan data utama sebelum mengambil keputusan",
"Bandingkan opsi dengan skor dampak, biaya, waktu, dan risiko",
],
"impact_label": "Operasional",
"priority": 10,
},
{
"kategori": "Teknologi",
"keyword": ["aplikasi", "website", "coding", "program", "error", "bug"],
"penyebab": [
"Sistem belum optimal",
"Arsitektur kurang tepat",
"Bug perangkat lunak",
],
"solusi": [
"Audit sistem",
"Perbaiki kode",
"Optimasi teknologi",
],
"impact_label": "Teknis/operasional",
"priority": 10,
"impact_label": "Perlu validasi",
"priority": 0,
},
]
def _detect_problem_category(description):
text = description.lower()
best_item = None
@ -411,12 +481,14 @@ def _detect_problem_category(description):
score += 35
if item["kategori"] == "Pendidikan" and _has_any(text, ["singapura", "singapore", "jepang", "japan"]):
score += 20
if item["kategori"] == "Pemerintah" and _has_any(text, ["bumn", "kementerian", "pemerintah", "anggaran negara", "layanan publik"]):
score += 25
if score > best_score:
best_item = item
best_score = score
return best_item or next(item for item in ANALYSIS_DATABASE if item["kategori"] == "Bisnis")
return best_item or next(item for item in ANALYSIS_DATABASE if item["kategori"] == "Umum")
def _is_education_decision(description):
@ -437,7 +509,7 @@ def _infer_business_area(description):
text = description.lower()
kategori = _detect_problem_category(description)["kategori"]
if kategori == "Pendidikan":
if kategori in {"Pendidikan", "Pemerintah", "Umum"}:
return ProblemCase.AREA_OTHER
if kategori == "Keuangan":
return ProblemCase.AREA_FINANCE
@ -656,7 +728,7 @@ def home(request):
"form": form,
"recent_cases": recent_cases,
"page_title": "OPTEMA AI — MVP Decision Intelligence",
"meta_description": "OPTEMA AI membantu mengubah masalah bisnis, keuangan, karier, logistik, teknologi, dan pendidikan menjadi problem detection, root-cause analysis, decision scoring, dan action plan.",
"meta_description": "OPTEMA AI membantu mengubah masalah pemerintah/publik, bisnis, keuangan, karier, logistik, teknologi, dan pendidikan menjadi problem detection, root-cause analysis, decision scoring, dan action plan.",
}
return render(request, "core/index.html", context)