This commit is contained in:
Ryan Maulana 2025-12-07 02:43:17 +07:00
commit 72e65d0ea0
9 changed files with 6505 additions and 0 deletions

25
.env Normal file
View File

@ -0,0 +1,25 @@
# .env.example - contoh pengaturan SMTP untuk Gmail
# Copy this file to .env and fill your real credentials (do NOT commit .env)
# SMTP settings (Gmail recommended)
# Use an App Password (recommended) for Gmail. See README/instructions.
# Optional: override 'From' email
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=maulanaryan2004@gmail.com
SMTP_PASS=kfebdpeoaxfabzpm
SMTP_SENDER_NAME=SIBAL
OTP_DEBUG=false
OTP_EXPIRE_MINUTES=10
# optional: SMTP_SENDER=display.name@example.com
# OTP_DEBUG=false # default false; set true to print OTP in console for debug
# SMTP_SENDER=some.name@example.com
# Other optional env vars used by the app
# SECRET_KEY=...
# GOOGLE_CLIENT_ID=...
# GOOGLE_CLIENT_SECRET=...
# GOOGLE_REDIRECT_URI=http://localhost:8051/auth/callback

37
README.md Normal file
View File

@ -0,0 +1,37 @@
# Projek-SIBAL
Sistem Informasi Berbasis Akuntansi Ikan Bawal
## Setup singkat & environment variables
1. Salin file `.env.example` ke `.env` atau set environment variables di sistem Anda.
2. Environment penting yang harus di-set sebelum menjalankan aplikasi:
- `GOOGLE_CLIENT_ID` dan `GOOGLE_CLIENT_SECRET` — gunakan Google Cloud Console untuk membuat OAuth client.
- `GOOGLE_REDIRECT_URI` — biasanya `http://localhost:8051/auth/callback` saat development.
- `SECRET_KEY` — random string untuk Flask session.
- `SUPABASE_URL` dan `SUPABASE_KEY` — untuk koneksi Supabase (jika Anda gunakan Supabase).
3. Jalankan aplikasi (PowerShell):
```powershell
python -m venv .venv
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process -Force
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
# set env (sesi terminal)
$env:GOOGLE_CLIENT_ID = 'PASTE_CLIENT_ID'
$env:GOOGLE_CLIENT_SECRET = 'PASTE_CLIENT_SECRET'
python sibal.py
```
## Rotasi / revoke Google client secret
Jika secret sempat terkomit, segera revoke/rotate client secret di Google Cloud Console:
1. Buka https://console.cloud.google.com/apis/credentials
2. Pilih OAuth 2.0 Client IDs lalu revoke/regen secret.
3. Update environment variable `GOOGLE_CLIENT_SECRET` dengan nilai baru.
## Migrasi data lama (opsional)
Jika Anda sudah punya data yang tersimpan di Supabase tanpa `user_id`, gunakan skrip `scripts/migrate_add_userid.py` untuk memberi `user_id` default. Hati-hati: lakukan backup terlebih dahulu.

Binary file not shown.

View File

@ -0,0 +1 @@
{"web":{"client_id":"303784734780-6or0srck71bpkqcee4e6cernfvfgee5l.apps.googleusercontent.com","project_id":"carbon-facet-478922-f0","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://oauth2.googleapis.com/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_secret":"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","redirect_uris":["http://localhost:8051/auth/callback"]}}

BIN
requirements.txt Normal file

Binary file not shown.

View File

@ -0,0 +1,47 @@
"""
Skrip migrasi: tambahkan `user_id` ke semua record yang belum punya.
Jalankan dengan environment sudah ter-set (SUPABASE_URL & SUPABASE_KEY),
contoh:
PS> $env:SUPABASE_URL = 'https://...'
PS> $env:SUPABASE_KEY = '...'
PS> .\.venv\Scripts\python.exe scripts\migrate_add_userid.py --target-user-id <USER_ID>
PERINGATAN: Ini akan menulis ke DB. Backup sebelum menjalankan.
"""
import argparse
import os
from supabase import create_client
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--target-user-id', required=True, help='User ID yang akan dipakai sebagai owner untuk record lama')
args = parser.parse_args()
url = os.getenv('SUPABASE_URL')
key = os.getenv('SUPABASE_KEY')
if not url or not key:
print('SUPABASE_URL and SUPABASE_KEY must be set in environment')
return
client = create_client(url, key)
tables = ['transaksi_pemasukan', 'transaksi_pengeluaran', 'jurnal_umum', 'jurnal_penyesuaian', 'kartu_persediaan']
for table in tables:
print(f'Processing table: {table}')
res = client.table(table).select('*').execute()
rows = res.data if res.data else []
for row in rows:
if 'user_id' not in row or not row.get('user_id'):
try:
client.table(table).update({'user_id': args.target_user_id}).eq('id', row['id']).execute()
print(f"Updated {table} id={row['id']} -> user_id={args.target_user_id}")
except Exception as e:
print(f"Failed to update {table} id={row.get('id')}: {e}")
print('Migration complete.')
if __name__ == '__main__':
main()

6086
sibal.py Normal file

File diff suppressed because it is too large Load Diff

301
sibal_data.json Normal file
View File

@ -0,0 +1,301 @@
{
"transaksi_pemasukan": [
{
"tanggal": "2025-11-18",
"jenis": "penjualan_ikan",
"jumlah": 60000,
"quantity": 5,
"hpp": 10000,
"keterangan": "bawal",
"ref": "TR",
"tipe": "pemasukan"
}
],
"transaksi_pengeluaran": [
{
"tanggal": "2025-11-18",
"jenis": "pembelian_persediaan",
"kode_barang": "IK001",
"jenis_aset": "",
"jumlah": 30000,
"quantity": 200,
"metode_bayar": "tunai",
"supplier": "",
"keterangan": "beli",
"ref": "tr",
"tipe": "pengeluaran"
},
{
"tanggal": "2025-11-18",
"jenis": "pembelian_aset",
"kode_barang": "",
"jenis_aset": "tanah",
"jumlah": 2100000000,
"quantity": 0,
"metode_bayar": "tunai",
"supplier": "",
"keterangan": "Pengeluaran - pembelian_aset",
"ref": "TR",
"tipe": "pengeluaran"
},
{
"tanggal": "2025-11-18",
"jenis": "pembelian_persediaan",
"kode_barang": "IK001",
"jumlah": 300000,
"quantity": 100,
"metode_bayar": "kredit",
"supplier": "harni",
"keterangan": "beli",
"ref": "TR",
"tipe": "pengeluaran"
}
],
"jurnal_umum": [
{
"tanggal": "2025-11-18",
"keterangan": "bawal",
"ref": "TR",
"akun_debit": "Kas",
"jumlah_debit": 60000,
"akun_kredit": "Pendapatan",
"jumlah_kredit": 60000
},
{
"tanggal": "2025-11-18",
"keterangan": "HPP - bawal",
"ref": "TR-HPP",
"akun_debit": "HPP",
"jumlah_debit": 50000,
"akun_kredit": "Persediaan",
"jumlah_kredit": 50000
},
{
"tanggal": "2025-11-18",
"keterangan": "beli",
"ref": "tr",
"akun_debit": "Persediaan",
"jumlah_debit": 30000,
"akun_kredit": "Kas",
"jumlah_kredit": 30000
},
{
"tanggal": "2025-11-18",
"keterangan": "beli",
"ref": "tr",
"akun_debit": "Persediaan",
"jumlah_debit": 30000,
"akun_kredit": "Kas",
"jumlah_kredit": 30000
},
{
"tanggal": "2025-11-18",
"keterangan": "Pengeluaran - pembelian_aset",
"ref": "TR",
"akun_debit": "Tanah",
"jumlah_debit": 2100000000,
"akun_kredit": "Kas",
"jumlah_kredit": 2100000000
},
{
"tanggal": "2025-11-18",
"keterangan": "Pencatatan Kendaraan",
"ref": "AST-KENDARAAN",
"akun_debit": "kendaraan",
"jumlah_debit": 150000000,
"akun_kredit": "Kas",
"jumlah_kredit": 150000000
},
{
"tanggal": "2025-11-18",
"keterangan": "beli",
"ref": "tr",
"akun_debit": "Persediaan",
"jumlah_debit": 30000,
"akun_kredit": "Kas",
"jumlah_kredit": 30000
},
{
"tanggal": "2025-11-18",
"keterangan": "Pengeluaran - pembelian_aset",
"ref": "TR",
"akun_debit": "Beban Lainnya",
"jumlah_debit": 2100000000,
"akun_kredit": "Kas",
"jumlah_kredit": 2100000000
},
{
"tanggal": "2025-11-18",
"keterangan": "beli",
"ref": "TR",
"akun_debit": "Persediaan",
"jumlah_debit": 300000,
"akun_kredit": "Utang",
"jumlah_kredit": 300000
},
{
"tanggal": "2025-11-18",
"keterangan": "beli",
"ref": "tr",
"akun_debit": "Persediaan",
"jumlah_debit": 30000,
"akun_kredit": "Kas",
"jumlah_kredit": 30000
},
{
"tanggal": "2025-11-18",
"keterangan": "Pengeluaran - pembelian_aset",
"ref": "TR",
"akun_debit": "Tanah",
"jumlah_debit": 2100000000,
"akun_kredit": "Kas",
"jumlah_kredit": 2100000000
},
{
"tanggal": "2025-11-18",
"keterangan": "beli",
"ref": "TR",
"akun_debit": "Persediaan",
"jumlah_debit": 300000,
"akun_kredit": "Utang",
"jumlah_kredit": 300000
},
{
"tanggal": "2025-11-18",
"keterangan": "Akumulasi Utang Supplier",
"ref": "UTG-001",
"akun_debit": "Persediaan",
"jumlah_debit": 300000,
"akun_kredit": "Utang",
"jumlah_kredit": 300000
}
],
"jurnal_penyesuaian": [
{
"tanggal": "2025-11-18",
"keterangan": "Penyusutan kendaraan tahun ke-3",
"ref": "PST-KENDARAAN-3",
"akun_debit": "Beban Penyusutan Kendaraan",
"jumlah_debit": 30000000.0,
"akun_kredit": "Akumulasi Penyusutan Kendaraan",
"jumlah_kredit": 30000000.0
},
{
"tanggal": "2025-11-18",
"keterangan": "Penyusutan kendaraan tahun ke-3",
"ref": "PST-KENDARAAN-3",
"akun_debit": "Beban Penyusutan Kendaraan",
"jumlah_debit": 30000000.0,
"akun_kredit": "Akumulasi Penyusutan Kendaraan",
"jumlah_kredit": 30000000.0
}
],
"buku_besar": {
"kas": [],
"pendapatan": [],
"persediaan": [],
"utang": [],
"hpp": [],
"pendapatan_tiket": [],
"tanah": [],
"bangunan_gazebo": [],
"kendaraan": [],
"peralatan": [],
"akumulasi_penyusutan_bangunan": [],
"akumulasi_penyusutan_kendaraan": [],
"akumulasi_penyusutan_peralatan": [],
"beban_gaji": [],
"beban_listrik": [],
"beban_penyusutan_bangunan": [],
"beban_penyusutan_kendaraan": [],
"beban_penyusutan_peralatan": [],
"beban_lainnya": []
},
"buku_besar_pembantu": {
"harni": [
{
"tanggal": "2025-11-18",
"keterangan": "pembelian_persediaan - beli",
"debit": 0,
"kredit": 300000,
"saldo": 300000
}
]
},
"kartu_persediaan": [
{
"tanggal": "2025-11-18",
"kode_barang": "IK001",
"nama_barang": "Ikan Bawal Segar",
"masuk_qty": 0,
"masuk_harga": 0,
"masuk_total": 0,
"keluar_qty": 5,
"keluar_harga": 10000,
"keluar_total": 50000,
"saldo_qty": -5,
"saldo_harga": 10000,
"saldo_total": -50000,
"keterangan": "Penjualan - bawal"
},
{
"tanggal": "2025-11-18",
"kode_barang": "IK001",
"nama_barang": "Ikan Bawal Segar",
"masuk_qty": 200,
"masuk_harga": 150.0,
"masuk_total": 30000,
"keluar_qty": 0,
"keluar_harga": 0,
"keluar_total": 0,
"saldo_qty": 200,
"saldo_harga": 150.0,
"saldo_total": 30000,
"keterangan": "Pembelian - beli"
},
{
"tanggal": "2025-11-18",
"kode_barang": "IK001",
"nama_barang": "Ikan Bawal Segar",
"masuk_qty": 100,
"masuk_harga": 3000.0,
"masuk_total": 300000,
"keluar_qty": 0,
"keluar_harga": 0,
"keluar_total": 0,
"saldo_qty": 100,
"saldo_harga": 3000.0,
"saldo_total": 300000,
"keterangan": "Pembelian - beli"
}
],
"suppliers": [
"harni"
],
"aset_tetap": {
"tanah": {
"nilai_awal": 2100000000,
"penyusutan": 0,
"masa_manfaat": 0,
"tahun_pembelian": 2025
},
"bangunan_gazebo": {
"nilai_awal": 0,
"penyusutan": 0,
"masa_manfaat": 10,
"tahun_pembelian": 2025
},
"kendaraan": {
"nilai_awal": 150000000,
"penyusutan": 60000000.0,
"masa_manfaat": 5,
"tahun_pembelian": 2021
},
"peralatan": {
"nilai_awal": 0,
"penyusutan": 0,
"masa_manfaat": 3,
"tahun_pembelian": 2025
}
}
}

8
text Normal file
View File

@ -0,0 +1,8 @@
cd 'C:\Users\ilham\Downloads\Projek-SIBAL-main\Projek-SIBAL-main'
python -m venv .venv
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process -Force
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
pip install authlib
pip freeze > requirements.txt
python sibal.py