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:

  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_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:0011:00  → span 08:0011:00 = 180 menit (first commit hari ini)
  Task B  commit 14:0015: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:0015: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 SeninJumat 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
Description
No description provided
Readme 204 KiB
Languages
Python 98.7%
Shell 1.3%