Files
daily_odoo_timesheet/README.md
2026-05-28 10:46:42 +07:00

6.5 KiB
Raw Blame History

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/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

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:0011:00  → span 120 menit
  Task B  commit 14:0015: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:0011:00      120m   4.00  buat api endpoint
  Support Kedungdoro   5521       14:0015: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 SeninJumat 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:

  1. Buka Odoo di browser → login
  2. Tekan F12 → tab Application (Chrome) / Storage (Firefox)
  3. Pilih Cookies → cari session_id
  4. Copy nilainya → paste ke SESSION_ID di run_daily.sh

Konfigurasi Default

Parameter Nilai
User ID 41
Employee ID 37
Total jam/hari 8
Odoo URL https://odoo.minipc.sismedika.biz.id