Files
daily_odoo_timesheet/README.md
2026-05-29 10:30:55 +07:00

293 lines
7.7 KiB
Markdown
Raw 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_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`
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
```
```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
──────────────────────────────────────────────────────────────────────────────
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.
```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` |