Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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):
SESSION_ID=your_session_id_here
USER_ID=41
EMPLOYEE_ID=37
AUTHOR=sas.fajri
Salin dari template:
cp .env.example .env
Ganti session_id cukup edit .env:
nano ".env"
Cara ambil session_id baru:
- Buka
https://odoo.aplikasi.web.id→ login - Tekan
F12→ tab Application (Chrome) / Storage (Firefox) - Pilih Cookies → cari
session_id→ copy nilainya - Paste ke
SESSION_IDdi.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_IBL/MERGE_REPORT/ibl_merge_report_service |
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
# 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 <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.
# Pakai session_id dari .env tidak bisa — wajib pass manual (keamanan)
python3 upload_pending.py --session-id <session_id>
# Tanggal tertentu
python3 upload_pending.py --session-id <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.
python3 search_task.py \
--session-id <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.
# Satu entry
python3 upload_timesheet.py \
--session-id <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 <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.
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.
# Dry run
python3 sync_timesheet.py \
--session-id <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 <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:
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 |