Aplikasi web manajemen tugas untuk mahasiswa D3 Manajemen Informatika PSDKU Polinema Kediri. Mengintegrasikan Google Classroom, Telegram Bot, Google Gemini AI, dengan klasifikasi prioritas otomatis menggunakan Matriks Eisenhower.
Production: https://todosxai.ninja/
- Backend: Laravel 12, PHP 8.2+
- Database: MySQL 8.0
- Frontend: Blade + Alpine.js 3.4 + Tailwind CSS 3.1 + Vite 7
- Visualisasi: Chart.js 4
- Drag-drop: SortableJS
- AI: Google Gemini API (
gemini-2.5-flashdefault, REST native) - Auth: Laravel Socialite + Google OAuth (no email/password login)
- Export PDF: barryvdh/laravel-dompdf 3
- Manajemen Tugas — CRUD dengan kuadran Eisenhower otomatis (Q1 Lakukan Sekarang, Q2 Jadwalkan, Q3 Delegasikan, Q4 Eliminasi), prioritas, deadline, drag-drop reorder, filter, paginasi
- Kategori — default
Kuliah,Pekerjaan,Daily Activityper user, tanpa warna/ikon - Google Classroom Sync — ambil mata kuliah & tugas via API, auto setiap 6 jam (production) atau manual
- Asisten AI — chat multi-session berbasis Google Gemini, parsing instruksi → konfirmasi tugas, daily planning
- Kalender Tugas — tampilan bulanan dengan event dot per kuadran
- Arsip Tugas — riwayat tugas selesai per mata kuliah, export PDF portofolio
- Laporan & Analitik — ringkasan total/aktif/selesai/terlambat, distribusi status/prioritas/kuadran/kategori/sumber, export PDF
- Telegram Bot — webhook 2-arah, 9 command (
/start,/help,/tugas,/hari_ini,/mendesak,/selesai,/statistik,/planning,/baru), pesan bebas → AI - Notifikasi — pengingat tenggat, peringatan terlambat, rangkuman harian via Telegram (production scheduler)
| Tools | Versi minimal | Catatan |
|---|---|---|
| PHP | 8.2+ | Extensi: pdo_mysql, mbstring, openssl, tokenizer, xml, ctype, json, bcmath, fileinfo, gd |
| Composer | 2.x | https://getcomposer.org |
| Node.js | 18+ | Termasuk npm |
| MySQL | 8.0 | XAMPP / Laragon / MySQL standalone |
| Akun Google Cloud | — | OAuth client untuk login + (opsional) Classroom API |
| Gemini API Key | — | https://aistudio.google.com/apikey |
| Telegram Bot | opsional | @BotFather |
git clone https://github.com/shuriza/todos.git
cd todoscomposer install
npm install# Windows (PowerShell / CMD)
copy .env.example .env
# Linux / macOS
cp .env.example .env
php artisan key:generateMinimal yang harus diisi:
APP_NAME="Todo AI"
APP_URL=http://localhost:8000
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=todos_ai
DB_USERNAME=root
DB_PASSWORD=
# Google OAuth (wajib — login hanya lewat Google)
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_REDIRECT_URI="${APP_URL}/auth/google/callback"
# Gemini AI (wajib untuk Asisten AI)
GEMINI_API_KEY=
GEMINI_MODEL=gemini-2.5-flash
# Telegram (opsional di local)
TELEGRAM_BOT_TOKEN=
TELEGRAM_BOT_USERNAME=
TELEGRAM_WEBHOOK_SECRET=- Buka Google Cloud Console
- Buat project → APIs & Services → Credentials → Create OAuth client ID (Web application)
- Authorized redirect URIs:
http://localhost:8000/auth/google/callback - Salin Client ID & Client Secret ke
.env - (Opsional Classroom) enable Google Classroom API di project yang sama
- Buka https://aistudio.google.com/apikey
- Buat API key → paste ke
GEMINI_API_KEY
Pastikan MySQL sudah jalan, lalu:
# Opsi A: helper (XAMPP/Laragon root tanpa password)
php create-database.php
# Opsi B: manual di MySQL
# CREATE DATABASE todos_ai CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
php artisan migrateCara cepat (disarankan) — server + queue + log + Vite sekaligus:
composer devAkses: http://localhost:8000
Cara terpisah (jika butuh kontrol manual):
# Terminal 1
php artisan serve
# Terminal 2
npm run dev
# Terminal 3 (opsional — job queue)
php artisan queue:listen --tries=1Buka http://localhost:8000 → klik "Masuk dengan Google".
Tidak ada form email/password. Login hanya via Google OAuth.
composer setupPerintah ini menjalankan: composer install → salin .env jika belum ada → key:generate → migrate → npm install → npm run build.
Setelah itu tetap isi kredensial Google/Gemini di .env, lalu composer dev.
npm run buildcomposer test # PHPUnit / Pest
npm run build # pastikan aset frontend build sukses# Sync Google Classroom (user id tertentu)
php artisan classroom:sync --user=1
# Recalculate kuadran Eisenhower (dry-run dulu)
php artisan todos:recalculate-kuadran --dry-run
# Kirim notifikasi (local: manual / dry-run)
php artisan notification:send-reminders --type=deadline --dry-run
php artisan notification:send-reminders --type=overdue --dry-run
# Set webhook Telegram — JANGAN di local tanpa URL ngrok eksplisit
# php artisan telegram:set-webhook https://xxxx.ngrok-free.app/api/telegram/webhookHanya berjalan di environment production (lihat routes/console.php). Local dev: scheduler tidak jalan otomatis.
| Command | Interval | Fungsi |
|---|---|---|
notification:send-reminders --type=deadline |
1 menit | Pengingat tenggat tugas |
notification:send-reminders --type=overdue |
1 menit | Peringatan tugas terlambat |
notification:send-reminders --type=daily |
1 menit | Rangkuman harian (cek preferensi waktu user) |
classroom:sync |
6 jam | Ambil tugas baru dari Google Classroom |
todos:recalculate-kuadran |
1 jam | Update kuadran Eisenhower berdasarkan sisa waktu |
Di production, pastikan cron:
* * * * * cd /path/to/todos && php artisan schedule:run >> /dev/null 2>&1| Gejala | Solusi |
|---|---|
| Error koneksi DB | Pastikan MySQL jalan, cek DB_* di .env, database todos_ai sudah dibuat |
| Login Google gagal / redirect mismatch | Samakan APP_URL + redirect URI di Google Console dengan GOOGLE_REDIRECT_URI |
| Halaman tanpa CSS | Jalankan npm run dev atau npm run build |
| AI tidak merespons | Cek GEMINI_API_KEY valid di .env, lalu php artisan config:clear |
| Queue tidak jalan | Pastikan composer dev atau php artisan queue:listen aktif |
| Classroom sync gagal | Enable Classroom API, pastikan user sudah re-login Google dengan scope yang cukup |
- Controller orchestrate, business logic ke
app/Services/ - Validation di
app/Http/Requests/{Domain}/— pakai ruleOwnedByUseruntuk FK sensitif (cegah lintas user) - Authorization via Policy +
$this->authorize() - Response JSON pakai
App\Support\ApiResponse - Konstanta di
config/(todos,ai,telegram,services) - UI Bahasa Indonesia, kode English, commit prefix English (
feat:,fix:,refactor:,UI:,docs:) - Database: MySQL only. Raw SQL pakai
CURDATE(),TIMESTAMPDIFF(). Jangan SQLite-specific - Telegram input: selalu escape via
htmlspecialchars(...)lewat$this->esc()helper