# 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): ```env SESSION_ID=your_session_id_here USER_ID=41 EMPLOYEE_ID=37 AUTHOR=sas.fajri ``` Salin dari template: ```bash cp .env.example .env ``` **Ganti session_id** cukup edit `.env`: ```bash 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/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 ``` ```bash # 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 --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. ```bash # Pakai session_id dari .env tidak bisa — wajib pass manual (keamanan) python3 upload_pending.py --session-id # Tanggal tertentu python3 upload_pending.py --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. ```bash python3 search_task.py \ --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. ```bash # Satu entry python3 upload_timesheet.py \ --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 \ --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. ```bash 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. ```bash # Dry run python3 sync_timesheet.py \ --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 \ --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: ```bash 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` |