Files
daily_odoo_timesheet/README.md
2026-05-29 19:29:35 +07:00

303 lines
8.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 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:
```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` |