# Odoo Timesheet Automation Script untuk otomatisasi input timesheet Odoo berdasarkan commit Git harian. --- ## Alur Harian ``` Commit dengan format "TASKCODE - deskripsi" ↓ 16:55 — launchd otomatis baca commit hari ini dari semua repo ↓ Cari task_id di Odoo berdasarkan kode task (fallback ke semua project) ↓ Hitung jam pro-rata berdasarkan time span commit (total = 8 jam/hari) ↓ Simpan ke pending_YYYY-MM-DD.json + kirim notifikasi macOS ↓ Kamu jalankan: python3 upload_pending.py ↓ Preview → konfirmasi y/N → upload ke Odoo ``` --- ## Konfigurasi `.env` Semua nilai sensitif disimpan di file `.env` (tidak ikut repo): ```env SESSION_ID=your_session_id_here USER_ID=41 EMPLOYEE_ID=37 AUTHOR=sas.fajri ``` Salin dari template: ```bash cp .env.example .env ``` **Ganti session_id** cukup edit `.env`: ```bash nano ".env" ``` **Cara ambil session_id baru:** 1. Buka `https://odoo.aplikasi.web.id` → login 2. Tekan `F12` → tab **Application** (Chrome) / **Storage** (Firefox) 3. Pilih **Cookies** → cari `session_id` → copy nilainya 4. Paste ke `SESSION_ID` di `.env` Kalau session expired, notifikasi macOS akan muncul otomatis: ``` ⚠️ Timesheet Gagal Session Odoo expired. Buka run_daily.sh dan ganti SESSION_ID. ``` --- ## Format Commit Setiap commit **wajib** menggunakan format: ``` TASKCODE - deskripsi singkat ``` Contoh: ``` 6D9QD6 - buat api endpoint baru FHM28052601 - fix bug validasi form ``` Kode task akan dipakai untuk mencari task di Odoo secara otomatis. Jika task tidak ditemukan di project default repo, script otomatis fallback mencari ke semua project lain. --- ## Repo yang Dipantau | Repo | Project Odoo | |------|-------------| | `REPO_CPONE/BE_CPONE` | CPONE | | `REPO_CPONE/FE_CPONE` | CPONE | | `REPO_CPONE_DASHBOARD` | CPONE | | `REPO_GITEA_IBL/BE_IBL` | IBL | | `REPO_GITEA_IBL/FE_IBL` | IBL | | `REPO_GITEA_KD` | Support Kedungdoro | | `REPO_GITLAB_PRAMITA/bisone` | Support Pramita | | `SAS_TASK` | SAS | ## Project ID | Nama | ID | |------|----| | CPONE | 123 | | IBL | 186 | | Support Pramita | 70 | | SAS | 92 | | Support Kedungdoro | 77 | --- ## Scripts ### `daily_timesheet.py` Script utama. Ambil commit hari ini, cari task di Odoo, hitung pro-rata, simpan pending atau langsung upload. Semua parameter opsional jika `.env` sudah diisi. **Cara hitung pro-rata:** - Bobot tiap task = span waktu antara commit pertama dan terakhir task tersebut - Task dengan commit pertama di hari itu → span dihitung dari **jam 08:00** - Single commit mendapat minimum 30 menit - Total jam selalu = 8 ``` Contoh: Task A commit 09:00–11:00 → span 08:00–11:00 = 180 menit (first commit hari ini) Task B commit 14:00–15:30 → span 90 menit Task C commit 10:00 → span 30 menit (minimum, single commit) Total span = 300 menit Task A = 8 × 180/300 = 4.80h Task B = 8 × 90/300 = 2.40h Task C = 8 × 30/300 = 0.80h ``` ```bash # Dry run — preview tanpa simpan (pakai .env) python3 daily_timesheet.py --dry-run # Simpan pending.json + kirim notifikasi macOS python3 daily_timesheet.py --save-pending # Upload langsung tanpa konfirmasi python3 daily_timesheet.py --yes # Tanggal custom python3 daily_timesheet.py --dry-run --date 2026-05-27 # Override .env via argumen python3 daily_timesheet.py --session-id --user-id 41 --employee-id 37 --author sas.fajri ``` | Parameter | Default | Keterangan | |-----------|---------|-----------| | `--session-id` | dari `.env` | Cookie session Odoo | | `--author` | dari `.env` | Filter git author | | `--user-id` | dari `.env` | ID user Odoo | | `--employee-id` | dari `.env` | ID employee Odoo | | `--date` | hari ini | Tanggal YYYY-MM-DD | | `--dry-run` | — | Preview saja, tidak upload | | `--save-pending` | — | Simpan ke file + notifikasi | | `--yes` | — | Skip konfirmasi, langsung upload | **Contoh output preview:** ``` ────────────────────────────────────────────────────────────────────────────── PROJECT TASK WAKTU SPAN JAM DESKRIPSI ────────────────────────────────────────────────────────────────────────────── CPONE 10832 08:00→11:00 180m↑ 4.80 buat api endpoint Support Kedungdoro 5521 14:00–15:30 90m 2.40 fix bug validasi Support Pramita 7788 10:00 (1x) 30m* 0.80 update config ────────────────────────────────────────────────────────────────────────────── TOTAL 300m 8.00 ↑ span dihitung dari 08:00 | * single commit → minimum 30 menit ``` --- ### `upload_pending.py` Upload timesheet dari file pending hasil `daily_timesheet.py --save-pending`. Jalankan setelah menerima notifikasi macOS jam 16:55. ```bash # Pakai session_id dari .env tidak bisa — wajib pass manual (keamanan) python3 upload_pending.py --session-id # Tanggal tertentu python3 upload_pending.py --session-id --date 2026-05-27 ``` Setelah upload sukses, file `pending_YYYY-MM-DD.json` otomatis diganti nama jadi `done_YYYY-MM-DD.json`. --- ### `search_task.py` Cari task di Odoo berdasarkan kode dan project. ```bash python3 search_task.py \ --session-id \ --name "[6D9QD6]" \ --project-id CPONE ``` | Parameter | Keterangan | |-----------|-----------| | `--name` | Kata kunci pencarian | | `--project-id` | Nama project (`CPONE`, `IBL`, `SAS`, dll) atau ID angka | | `--limit` | Maks hasil (default: 8) | --- ### `upload_timesheet.py` Upload satu atau banyak timesheet entry secara manual. ```bash # Satu entry python3 upload_timesheet.py \ --session-id \ --name "review API" \ --task-id 51352 \ --unit-amount 2.0 \ --user-id 41 --employee-id 37 \ --project-id CPONE # Banyak entry sekaligus python3 upload_timesheet.py \ --session-id \ --name "review API" "fix bug" \ --task-id 51352 51353 \ --unit-amount 2.0 1.5 \ --user-id 41 41 \ --employee-id 37 37 \ --project-id CPONE SAS ``` --- ### `git_commits.py` Lihat commit dari semua repo per project tanpa upload ke Odoo. ```bash python3 git_commits.py --author sas.fajri --since 2026-05-01 --until 2026-05-28 ``` --- ### `sync_timesheet.py` Upload timesheet langsung dari commit (tanpa pending flow). Cocok untuk upload manual hari-hari sebelumnya. ```bash # Dry run python3 sync_timesheet.py \ --session-id \ --author sas.fajri \ --user-id 41 --employee-id 37 \ --since 2026-05-27 --until 2026-05-27 \ --dry-run # Upload python3 sync_timesheet.py \ --session-id \ --author sas.fajri \ --user-id 41 --employee-id 37 \ --since 2026-05-27 ``` --- ## Jadwal Otomatis (launchd) Berjalan setiap Senin–Jumat jam **16:55** via launchd macOS: ``` ~/Library/LaunchAgents/com.fajri.odoo-timesheet.plist ``` Log tersimpan di `logs/daily_YYYY-MM-DD.log`. Reload launchd jika ada perubahan: ```bash launchctl unload ~/Library/LaunchAgents/com.fajri.odoo-timesheet.plist launchctl load ~/Library/LaunchAgents/com.fajri.odoo-timesheet.plist ``` --- ## Konfigurasi Default | Parameter | Nilai | |-----------|-------| | User ID | 41 | | Employee ID | 37 | | Author | sas.fajri | | Total jam/hari | 8 | | Jam mulai kerja | 08:00 | | Odoo URL | `https://odoo.aplikasi.web.id` |