6.5 KiB
Odoo Timesheet Automation
Script untuk otomatisasi input timesheet Odoo berdasarkan commit Git harian.
Alur Harian
Commit dengan format "TASKCODE - deskripsi"
↓
16:55 — cron otomatis baca commit hari ini dari semua repo
↓
Cari task_id di Odoo berdasarkan kode task
↓
Hitung jam pro-rata berdasarkan time span commit (total = 8 jam/hari)
↓
Simpan ke pending_YYYY-MM-DD.json + kirim notifikasi macOS
↓
Kamu jalankan upload_pending.py --session-id XXX
↓
Preview → konfirmasi y/N → upload ke Odoo
Format Commit
Setiap commit wajib menggunakan format:
TASKCODE - deskripsi singkat
Contoh:
6D9QD6 - buat api endpoint baru
FHM28 - fix bug validasi form
Kode task akan dipakai untuk mencari task di Odoo secara otomatis.
Repo yang Dipantau
| Repo | Project Odoo |
|---|---|
REPO_CPONE/BE_CPONE |
CPONE |
REPO_CPONE/FE_CPONE |
CPONE |
REPO_CPONE_DASHBOARD |
CPONE |
REPO_GITEA_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
Ambil commit hari ini dari semua repo, cari task di Odoo, hitung pro-rata berdasarkan time span commit, simpan pending.
Cara hitung pro-rata:
- Bobot tiap task = span waktu antara commit pertama dan terakhir task tersebut
- Single commit mendapat minimum 30 menit
- Total jam selalu = 8
Contoh:
Task A commit 09:00–11:00 → span 120 menit
Task B commit 14:00–15:30 → span 90 menit
Task C commit 10:00 → span 30 menit (minimum)
Total span = 240 menit
Task A = 8 × 120/240 = 4.00h
Task B = 8 × 90/240 = 3.00h
Task C = 8 × 30/240 = 1.00h
# Dry run — preview tanpa simpan
python3 daily_timesheet.py \
--session-id <session_id> \
--author fajri \
--user-id 41 --employee-id 37 \
--dry-run
# Simpan pending.json + kirim notifikasi macOS
python3 daily_timesheet.py \
--session-id <session_id> \
--author fajri \
--user-id 41 --employee-id 37 \
--save-pending
# Tanggal custom
python3 daily_timesheet.py ... --date 2026-05-27
| Parameter | Keterangan |
|---|---|
--session-id |
Cookie session Odoo |
--author |
Filter git author |
--user-id |
ID user Odoo |
--employee-id |
ID employee Odoo |
--date |
Tanggal (default: hari ini) |
--dry-run |
Preview saja, tidak upload |
--save-pending |
Simpan ke file + notifikasi |
Contoh output preview:
───────────────────────────────────────────────────────────────────────────
PROJECT TASK WAKTU SPAN JAM DESKRIPSI
───────────────────────────────────────────────────────────────────────────
CPONE 10832 09:00–11:00 120m 4.00 buat api endpoint
Support Kedungdoro 5521 14:00–15:30 90m 3.00 fix bug validasi
Support Pramita 7788 10:00 (1 commit) 30m* 1.00 update config
───────────────────────────────────────────────────────────────────────────
TOTAL 240m 8.00
* single commit → minimum 30 menit
upload_pending.py
Upload timesheet dari file pending hasil daily_timesheet.py. Jalankan setelah menerima notifikasi macOS.
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 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 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 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 fajri \
--user-id 41 --employee-id 37 \
--since 2026-05-27
Cron Otomatis
Cron berjalan setiap Senin–Jumat jam 16:55:
55 16 * * 1-5 run_daily.sh
Edit run_daily.sh untuk mengubah SESSION_ID jika expired:
# run_daily.sh
SESSION_ID="session_id_baru_disini"
Log tersimpan di logs/daily_YYYY-MM-DD.log.
Session ID Expired
Kalau session expired, notifikasi macOS akan muncul:
⚠️ Timesheet Gagal
Session Odoo expired. Buka run_daily.sh dan ganti SESSION_ID.
Cara ambil session_id baru:
- Buka Odoo di browser → login
- Tekan
F12→ tab Application (Chrome) / Storage (Firefox) - Pilih Cookies → cari
session_id - Copy nilainya → paste ke
SESSION_IDdirun_daily.sh
Konfigurasi Default
| Parameter | Nilai |
|---|---|
| User ID | 41 |
| Employee ID | 37 |
| Total jam/hari | 8 |
| Odoo URL | https://odoo.minipc.sismedika.biz.id |