docs: update README — .env, launchd, URL baru, fallback project

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
sas.fajri
2026-05-29 10:30:55 +07:00
parent c72dfa1e1e
commit 6975ce6e7c

170
README.md
View File

@@ -9,21 +9,56 @@ Script untuk otomatisasi input timesheet Odoo berdasarkan commit Git harian.
``` ```
Commit dengan format "TASKCODE - deskripsi" Commit dengan format "TASKCODE - deskripsi"
16:55 — cron otomatis baca commit hari ini dari semua repo 16:55 — launchd otomatis baca commit hari ini dari semua repo
Cari task_id di Odoo berdasarkan kode task Cari task_id di Odoo berdasarkan kode task (fallback ke semua project)
Hitung jam pro-rata berdasarkan time span commit (total = 8 jam/hari) Hitung jam pro-rata berdasarkan time span commit (total = 8 jam/hari)
Simpan ke pending_YYYY-MM-DD.json + kirim notifikasi macOS Simpan ke pending_YYYY-MM-DD.json + kirim notifikasi macOS
Kamu jalankan upload_pending.py --session-id XXX Kamu jalankan: python3 upload_pending.py
Preview → konfirmasi y/N → upload ke Odoo 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 ## Format Commit
Setiap commit **wajib** menggunakan format: Setiap commit **wajib** menggunakan format:
@@ -35,10 +70,11 @@ TASKCODE - deskripsi singkat
Contoh: Contoh:
``` ```
6D9QD6 - buat api endpoint baru 6D9QD6 - buat api endpoint baru
FHM28 - fix bug validasi form FHM28052601 - fix bug validasi form
``` ```
Kode task akan dipakai untuk mencari task di Odoo secara otomatis. 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.
--- ---
@@ -70,73 +106,77 @@ Kode task akan dipakai untuk mencari task di Odoo secara otomatis.
## Scripts ## Scripts
### `daily_timesheet.py` ### `daily_timesheet.py`
Ambil commit hari ini dari semua repo, cari task di Odoo, hitung pro-rata berdasarkan time span commit, simpan pending. 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:** **Cara hitung pro-rata:**
- Bobot tiap task = span waktu antara commit pertama dan terakhir task tersebut - 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 - Single commit mendapat minimum 30 menit
- Total jam selalu = 8 - Total jam selalu = 8
``` ```
Contoh: Contoh:
Task A commit 09:0011:00 → span 120 menit 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 B commit 14:0015:30 → span 90 menit
Task C commit 10:00 → span 30 menit (minimum) Task C commit 10:00 → span 30 menit (minimum, single commit)
Total span = 240 menit Total span = 300 menit
Task A = 8 × 120/240 = 4.00h Task A = 8 × 180/300 = 4.80h
Task B = 8 × 90/240 = 3.00h Task B = 8 × 90/300 = 2.40h
Task C = 8 × 30/240 = 1.00h Task C = 8 × 30/300 = 0.80h
``` ```
```bash ```bash
# Dry run — preview tanpa simpan # Dry run — preview tanpa simpan (pakai .env)
python3 daily_timesheet.py \ python3 daily_timesheet.py --dry-run
--session-id <session_id> \
--author fajri \
--user-id 41 --employee-id 37 \
--dry-run
# Simpan pending.json + kirim notifikasi macOS # Simpan pending.json + kirim notifikasi macOS
python3 daily_timesheet.py \ python3 daily_timesheet.py --save-pending
--session-id <session_id> \
--author fajri \ # Upload langsung tanpa konfirmasi
--user-id 41 --employee-id 37 \ python3 daily_timesheet.py --yes
--save-pending
# Tanggal custom # Tanggal custom
python3 daily_timesheet.py ... --date 2026-05-27 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 | Keterangan | | Parameter | Default | Keterangan |
|-----------|-----------| |-----------|---------|-----------|
| `--session-id` | Cookie session Odoo | | `--session-id` | dari `.env` | Cookie session Odoo |
| `--author` | Filter git author | | `--author` | dari `.env` | Filter git author |
| `--user-id` | ID user Odoo | | `--user-id` | dari `.env` | ID user Odoo |
| `--employee-id` | ID employee Odoo | | `--employee-id` | dari `.env` | ID employee Odoo |
| `--date` | Tanggal (default: hari ini) | | `--date` | hari ini | Tanggal YYYY-MM-DD |
| `--dry-run` | Preview saja, tidak upload | | `--dry-run` | — | Preview saja, tidak upload |
| `--save-pending` | Simpan ke file + notifikasi | | `--save-pending` | — | Simpan ke file + notifikasi |
| `--yes` | — | Skip konfirmasi, langsung upload |
**Contoh output preview:** **Contoh output preview:**
``` ```
─────────────────────────────────────────────────────────────────────────── ──────────────────────────────────────────────────────────────────────────────
PROJECT TASK WAKTU SPAN JAM DESKRIPSI PROJECT TASK WAKTU SPAN JAM DESKRIPSI
─────────────────────────────────────────────────────────────────────────── ──────────────────────────────────────────────────────────────────────────────
CPONE 10832 09:0011:00 120m 4.00 buat api endpoint CPONE 10832 08:0011:00 180m 4.80 buat api endpoint
Support Kedungdoro 5521 14:0015:30 90m 3.00 fix bug validasi Support Kedungdoro 5521 14:0015:30 90m 2.40 fix bug validasi
Support Pramita 7788 10:00 (1 commit) 30m* 1.00 update config Support Pramita 7788 10:00 (1x) 30m* 0.80 update config
─────────────────────────────────────────────────────────────────────────── ──────────────────────────────────────────────────────────────────────────────
TOTAL 240m 8.00 TOTAL 300m 8.00
* single commit → minimum 30 menit ↑ span dihitung dari 08:00 | * single commit → minimum 30 menit
``` ```
--- ---
### `upload_pending.py` ### `upload_pending.py`
Upload timesheet dari file pending hasil `daily_timesheet.py`. Jalankan setelah menerima notifikasi macOS. Upload timesheet dari file pending hasil `daily_timesheet.py --save-pending`.
Jalankan setelah menerima notifikasi macOS jam 16:55.
```bash ```bash
# Pakai session_id dari .env tidak bisa — wajib pass manual (keamanan)
python3 upload_pending.py --session-id <session_id> python3 upload_pending.py --session-id <session_id>
# Tanggal tertentu # Tanggal tertentu
@@ -160,7 +200,7 @@ python3 search_task.py \
| Parameter | Keterangan | | Parameter | Keterangan |
|-----------|-----------| |-----------|-----------|
| `--name` | Kata kunci pencarian | | `--name` | Kata kunci pencarian |
| `--project-id` | Nama project atau ID angka | | `--project-id` | Nama project (`CPONE`, `IBL`, `SAS`, dll) atau ID angka |
| `--limit` | Maks hasil (default: 8) | | `--limit` | Maks hasil (default: 8) |
--- ---
@@ -195,7 +235,7 @@ python3 upload_timesheet.py \
Lihat commit dari semua repo per project tanpa upload ke Odoo. Lihat commit dari semua repo per project tanpa upload ke Odoo.
```bash ```bash
python3 git_commits.py --author fajri --since 2026-05-01 --until 2026-05-28 python3 git_commits.py --author sas.fajri --since 2026-05-01 --until 2026-05-28
``` ```
--- ---
@@ -207,7 +247,7 @@ Upload timesheet langsung dari commit (tanpa pending flow). Cocok untuk upload m
# Dry run # Dry run
python3 sync_timesheet.py \ python3 sync_timesheet.py \
--session-id <session_id> \ --session-id <session_id> \
--author fajri \ --author sas.fajri \
--user-id 41 --employee-id 37 \ --user-id 41 --employee-id 37 \
--since 2026-05-27 --until 2026-05-27 \ --since 2026-05-27 --until 2026-05-27 \
--dry-run --dry-run
@@ -215,46 +255,28 @@ python3 sync_timesheet.py \
# Upload # Upload
python3 sync_timesheet.py \ python3 sync_timesheet.py \
--session-id <session_id> \ --session-id <session_id> \
--author fajri \ --author sas.fajri \
--user-id 41 --employee-id 37 \ --user-id 41 --employee-id 37 \
--since 2026-05-27 --since 2026-05-27
``` ```
--- ---
## Cron Otomatis ## Jadwal Otomatis (launchd)
Cron berjalan setiap SeninJumat jam **16:55**: Berjalan setiap SeninJumat jam **16:55** via launchd macOS:
``` ```
55 16 * * 1-5 run_daily.sh ~/Library/LaunchAgents/com.fajri.odoo-timesheet.plist
```
Edit `run_daily.sh` untuk mengubah `SESSION_ID` jika expired:
```bash
# run_daily.sh
SESSION_ID="session_id_baru_disini"
``` ```
Log tersimpan di `logs/daily_YYYY-MM-DD.log`. Log tersimpan di `logs/daily_YYYY-MM-DD.log`.
--- Reload launchd jika ada perubahan:
```bash
## Session ID Expired launchctl unload ~/Library/LaunchAgents/com.fajri.odoo-timesheet.plist
launchctl load ~/Library/LaunchAgents/com.fajri.odoo-timesheet.plist
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`
--- ---
@@ -264,5 +286,7 @@ Session Odoo expired. Buka run_daily.sh dan ganti SESSION_ID.
|-----------|-------| |-----------|-------|
| User ID | 41 | | User ID | 41 |
| Employee ID | 37 | | Employee ID | 37 |
| Author | sas.fajri |
| Total jam/hari | 8 | | Total jam/hari | 8 |
| Odoo URL | `https://odoo.minipc.sismedika.biz.id` | | Jam mulai kerja | 08:00 |
| Odoo URL | `https://odoo.aplikasi.web.id` |