303 lines
8.1 KiB
Markdown
303 lines
8.1 KiB
Markdown
# 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 <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 <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.
|
||
|
||
```bash
|
||
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.
|
||
|
||
```bash
|
||
# 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.
|
||
|
||
```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 <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:
|
||
```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` |
|