8.1 KiB
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/LIVE_CPONE |
CPONE |
REPO_CPONE_DASHBOARD |
CPONE |
REPO_GITEA_IBL/BE_IBL/one-api-lab |
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 (per commit):
- Setiap commit = satu timesheet entry terpisah
- Commit diurutkan secara kronologis
- Bobot commit pertama = waktu dari jam 08:00 ke commit tersebut
- Bobot commit berikutnya = gap dari commit sebelumnya
- Gap 0 menit (commit bersamaan) mendapat minimum 30 menit
- Total jam selalu = 8
Contoh:
commit 1 10:26 → span 08:00→10:26 = 146 menit (first)
commit 2 10:26 → gap 0 → minimum 30 menit
commit 3 15:16 → gap 10:26→15:16 = 290 menit
commit 4 16:00 → gap 44 menit
commit 5 16:42 → gap 42 menit
Total span = 552 menit
commit 1 = 8 × 146/552 = 2.12h
commit 2 = 8 × 30/552 = 0.43h
commit 3 = 8 × 290/552 = 4.20h
commit 4 = 8 × 44/552 = 0.64h
commit 5 = 8 × 42/552 = 0.61h
# 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
──────────────────────────────────────────────────────────────────────────────
Support Pramita 52010 08:00→10:26 146m↑ 2.12 Menambahkan regional
Support Pramita 52010 10:26 30m* 0.43 fix validasi regional
IBL 52016 15:16 290m 4.20 update deploy.sh
IBL 52016 16:00 44m 0.64 fix deploy path
IBL 52016 16:42 42m 0.61 update script prod
──────────────────────────────────────────────────────────────────────────────
TOTAL 552m 8.00
↑ span dari 08:00 | * gap ke commit sebelumnya → 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 |