{% extends "base.html" %} {% block title %}Dashboard - FinansialApp{% endblock %} {% block page_title %} {% if session.role == 'OPERATOR' %}Portal Operator{% elif session.role == 'INVESTOR' %}Dashboard Investor{% else %}Dashboard{% endif %} {% endblock %} {% block content %} {% if session.role == 'OPERATOR' %} {# ── OPERATOR PORTAL ── #} {% set cm = today.strftime('%B %Y') %}
Selamat datang
{{ session.nama }}
Input transaksi aktif untuk {{ cm }}
OPERATOR
Akses terbatas
Input
Pemasukan
Catat penjualan & pendapatan
Input
Pengeluaran
Catat beban & pengeluaran
Input
Piutang
Catat tagihan pelanggan
Input
Hutang
Catat hutang ke pemasok
Input
Inventory
Kelola stok produk
Pemasukan & pengeluaran hanya bisa diinput untuk bulan {{ cm }}. Piutang, hutang, dan stok tidak dibatasi bulan.
{% else %} {# ── NORMAL DASHBOARD (ADMIN + INVESTOR) ── #}
Periode:
{% if session.role in ('ADMIN','FINANCE') %} Pemasukan Pengeluaran {% endif %}
{% set net_cf = cf.masuk - cf.keluar %} {% set total_exp = pnl.hpp + pnl.op_exp + pnl.tax %} {% set lb_c = '#15803d' if pnl.laba_bersih >= 0 else '#dc2626' %} {% set lb_bg2 = 'rgba(22,163,74,.12)' if pnl.laba_bersih >= 0 else 'rgba(220,38,38,.12)' %} {% set cf_c = '#15803d' if net_cf >= 0 else '#dc2626' %} {% set cf_bg3 = 'rgba(22,163,74,.12)' if net_cf >= 0 else 'rgba(220,38,38,.12)' %}
Total Pendapatan
{{ pnl.rev|rp }}
{% if pnl.rev > 0 and max_rev_year > 0 %} {% if pnl.rev >= max_rev_year %}
Tertinggi di tahun {{ today.year }}
{% else %}
{{ "%.0f"|format(pnl.rev / max_rev_year * 100) }}% dari tertinggi tahun ini ({{ max_rev_year|rp }})
{% endif %} {% else %}
periode ini
{% endif %}
Total Beban
{{ total_exp|rp }}
operasional · pajak · penyusutan
{% if pnl.rev > 0 %}{{ "%.1f"|format(total_exp / pnl.rev * 100) }}%{% else %}-{% endif %}
Laba Bersih
{{ pnl.laba_bersih|rp }}
margin {{ pnl.pct_laba_bersih }}%
{{ pnl.pct_laba_bersih }}%
{% set saldo_pos = cf.saldo >= 0 %}
Uang Terkumpul
{{ cf.saldo|rp }}
net kas periode yang dipilih
Uang Masuk
{{ cf.masuk|rp }}
periode ini
Uang Keluar
{{ cf.keluar|rp }}
periode ini
{% if saldo_rekening %}
Rekening
{% for rek in saldo_rekening %} {% if 'Kas' in rek.nama or 'kas' in rek.nama %} {% set chip_bg = '#dcfce7' %} {% set chip_border = '#86efac' %} {% set chip_lbl = '#15803d' %} {% set chip_icon = 'fas fa-money-bill-wave' %} {% set chip_ic_clr = '#16a34a' %} {% elif 'Wallet' in rek.nama or 'wallet' in rek.nama or 'E-' in rek.nama %} {% set chip_bg = '#faf5ff' %} {% set chip_border = '#d8b4fe' %} {% set chip_lbl = '#7c3aed' %} {% set chip_icon = 'fas fa-wallet' %} {% set chip_ic_clr = '#8b5cf6' %} {% else %} {% set chip_bg = '#dbeafe' %} {% set chip_border = '#93c5fd' %} {% set chip_lbl = '#1d4ed8' %} {% set chip_icon = 'fas fa-building-columns' %} {% set chip_ic_clr = '#3b82f6' %} {% endif %}
{{ rek.nama }}
{{ rek.saldo|rp }}
{% endfor %}
{% endif %} {% if ratios and app_pref.ratio_widgets and show_feature.analisis_rasio %} {% set _rcls = { 'Sehat': 'badge-lunas', 'Cukup': 'badge-sebagian', 'Perlu Perhatian': 'badge-belum' } %} {# Map key → (label, value, interpretation, icon, color) #} {% set _rw_map = { 'current_ratio': ('Current Ratio', '%.2fx'|format(ratios.current_ratio), ratios.current_int, 'fas fa-droplet', '#0ea5e9'), 'quick_ratio': ('Quick Ratio', '%.2fx'|format(ratios.quick_ratio), ratios.quick_int, 'fas fa-bolt', '#06b6d4'), 'cash_ratio': ('Cash Ratio', '%.2fx'|format(ratios.cash_ratio), ratios.cash_int, 'fas fa-coins', '#14b8a6'), 'der': ('DER', '%.2fx'|format(ratios.der), ratios.der_int, 'fas fa-scale-balanced', '#f97316'), 'debt_to_asset': ('Debt to Asset', '%.2f'|format(ratios.debt_to_asset), ratios.dta_int, 'fas fa-link', '#fb923c'), 'equity_ratio': ('Equity Ratio', '%.2f'|format(ratios.equity_ratio), ratios.eqr_int, 'fas fa-shield', '#fbbf24'), 'gpm': ('Gross Margin', '%.1f%%'|format(ratios.gpm), ratios.gpm_int, 'fas fa-percent', '#22c55e'), 'opm': ('Operating Margin', '%.1f%%'|format(ratios.opm), ratios.opm_int, 'fas fa-percent', '#16a34a'), 'npm': ('Net Margin', '%.1f%%'|format(ratios.npm), ratios.npm_int, 'fas fa-percent', '#8b5cf6'), 'roa': ('ROA', '%.1f%%'|format(ratios.roa), ratios.roa_int, 'fas fa-chart-pie', '#ec4899'), 'roe': ('ROE', '%.1f%%'|format(ratios.roe), ratios.roe_int, 'fas fa-chart-line', '#10b981'), 'inv_turnover': ('Inventory Turnover', '%.2fx'|format(ratios.inv_turnover), ratios.inv_int, 'fas fa-boxes-stacked', '#0284c7'), 'asset_turnover': ('Asset Turnover', '%.2fx'|format(ratios.asset_turnover), ratios.at_int, 'fas fa-rotate', '#7c3aed'), 'receivables_turnover': ('Receivables Turnover', '%.2fx'|format(ratios.receivables_turnover), ratios.recv_int,'fas fa-hand-holding-dollar', '#d97706') } %}
Kesehatan Keuangan
{% for w_key in app_pref.ratio_widgets %} {% set r = _rw_map.get(w_key) %} {% if r %}
{{ r[0] }}
{{ r[1] }}
{{ r[2] }}
{% endif %} {% endfor %}
Lihat semua rasio
{% endif %}
Tren Harian — Pendapatan vs Laba Bersih
Pendapatan:
Laba Bersih:
Rata-rata Laba/Hari Aktif:
{% if show_feature.grafik %} Lihat Semua {% endif %}
{% if stok_rendah %}
Stok Hampir Habis
{% for p in stok_rendah %} {% endfor %}
{{ p.nama }}{% if p.varian %} {{ p.varian }}{% endif %} {{ p.stok|qty }} {{ p.satuan }}
{% endif %} {% if piutang_jatuh %}
Piutang Jatuh Tempo
{% for p in piutang_jatuh %} {% endfor %}
{{ p.pelanggan }}
JT: {{ p.jatuh_tempo|tgl }}
{{ (p.jumlah-p.terbayar)|rp }}
{% endif %} {% if not stok_rendah and not piutang_jatuh %}
Tidak ada peringatan aktif
{% endif %}
Profitabilitas
Detail
{%- set rev = pnl.rev if pnl.rev else 1 -%} {%- macro barMain(pct, color) -%}
{%- endmacro -%} {%- macro barSub(pct, color) -%}
{%- endmacro -%} {{ barMain(100, 'var(--pgp)') }} {% if can.show_hpp_margin %} {{ barSub(pnl.pct_hpp, '#ef4444') }} {{ barMain(pnl.pct_laba_kotor, 'var(--pgp)') }} {% endif %} {{ barSub(pnl.pct_op, '#f97316') }} {{ barMain(pnl.pct_laba_op, 'var(--pbp)') }} {{ barSub(pnl.pct_depr, '#64748b') }} {{ barMain(pnl.pct_ebit, 'var(--ppp)') }} {% if pnl.interest %} {{ barSub((pnl.interest/pnl.rev*100)|round|int if pnl.rev else 0, '#ef4444') }} {% endif %} {{ barSub(pnl.pct_tax, '#ef4444') }} {{ barSub(pnl.pct_prive, '#8b5cf6') }}
Aktivitas Nominal % Bar
Total Pendapatan {{ pnl.rev|rp }} 100%
HPP / COGS {% if pnl.hpp %}{{ pnl.hpp|rp }}{% else %}-{% endif %} {{ pnl.pct_hpp }}%
Laba Kotor {{ pnl.laba_kotor|rp }} {{ pnl.pct_laba_kotor }}%
Biaya Operasional {% if pnl.op_exp %}{{ pnl.op_exp|rp }}{% else %}-{% endif %} {{ pnl.pct_op }}%
Margin Operasional {{ pnl.laba_op|rp }} {{ pnl.pct_laba_op }}%
Penyusutan {% if pnl.depr %}{{ pnl.depr|rp }}{% else %}-{% endif %} {{ pnl.pct_depr }}%
EBIT {{ pnl.ebit|rp }} {{ pnl.pct_ebit }}%
Beban Bunga {{ pnl.interest|rp }} {{ (pnl.interest/pnl.rev*100)|round(1) if pnl.rev else 0 }}%
Pajak {% if pnl.tax %}{{ pnl.tax|rp }}{% else %}-{% endif %} {{ pnl.pct_tax }}%
Laba Bersih {{ pnl.laba_bersih|rp }} {{ pnl.pct_laba_bersih }}%
Penarikan Owner {% if pnl.prive %}{{ pnl.prive|rp }}{% else %}-{% endif %} {{ pnl.pct_prive }}%
Laba Ditahan {{ pnl.laba_tahan|rp }} {{ pnl.pct_laba_tahan }}%
Cashflow Periode Ini
{% if cf_masuk_rek or cf_keluar_kat %}
Masuk per rekening  ·  Keluar per jenis pengeluaran
{% endif %}
Uang Masuk
{{ cf.masuk|rp }}
Uang Keluar
{{ cf.keluar|rp }}
{% if net_cf >= 0 %}
Net Cashflow Periode Ini
+{{ net_cf|rp }}
Masuk − Keluar
{% else %}
Net Cashflow Periode Ini
{{ net_cf|rp }}
Masuk − Keluar
{% endif %}
Saldo Kas & Bank
{{ cf.saldo|rp }}
Saldo kumulatif semua rekening
Tagihan Aktif
Total Piutang
{{ total_piutang|rp }}
{{ piutang_count }} aktif {% if piutang_overdue > 0 %} · {{ piutang_overdue }} lewat JT {% endif %}
Total Hutang
{{ total_hutang|rp }}
{{ hutang_count }} aktif {% if hutang_overdue > 0 %} · {{ hutang_overdue }} lewat JT {% endif %}
{% if show_feature.pelunasan %} {% endif %}
Piutang
{{ piutang_lunas }}/{{ piutang_total }}
lunas
{{ piutang_count }} aktif
Hutang
{{ hutang_lunas }}/{{ hutang_total }}
lunas
{{ hutang_count }} aktif
{% set all_jatuh = [] %} {% for p in piutang_jatuh %}{% set _ = all_jatuh.append(('piutang', p.pelanggan, p.jatuh_tempo, p.jumlah - p.terbayar)) %}{% endfor %} {% for h in hutang_jatuh %}{% set _ = all_jatuh.append(('hutang', h.pemasok, h.jatuh_tempo, h.jumlah - h.terbayar)) %}{% endfor %} {% if all_jatuh %}
Jatuh Tempo 7 Hari
{% for tipe, nama, tgl, sisa in all_jatuh[:4] %}
{{ nama }}
{{ 'Piutang' if tipe=='piutang' else 'Hutang' }} · {{ tgl }}
{{ sisa|rp }}
{% endfor %}
{% else %}
Tidak ada tagihan jatuh tempo
{% endif %}
Transaksi Terbaru
{% for t in transaksi_baru %} {% else %} {% endfor %}
Tanggal Keterangan Tipe Kategori Jumlah
{{ t.tanggal|tgl }} {{ t.keterangan }} {% if t.tipe_tx == 'PEMASUKAN' %}Pemasukan {% elif t.tipe_tx == 'PENGELUARAN' %}Pengeluaran {% elif t.tipe_tx == 'PELUNASAN' %}Pelunasan {% elif t.tipe_tx == 'TRANSFER' %}Transfer {% else %}Jurnal{% endif %} {% if t.kategori == 'OPERASIONAL' %}Operasional {% elif t.kategori == 'INVESTASI' %}Investasi {% elif t.kategori == 'PENDANAAN' %}Pendanaan {% else %}{{ t.kategori or '-' }}{% endif %} {{ t.total|rp }}
Belum ada transaksi
{% endif %}{# end normal dashboard (else) #} {% endblock %} {% block scripts %} {% if session.role != 'OPERATOR' %} {% endif %}{# end if not OPERATOR #} {% endblock %}