docs: update README — .env, launchd, URL baru, fallback project
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
170
README.md
170
README.md
@@ -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:00–11:00 → span 120 menit
|
Task A commit 09:00–11:00 → span 08:00–11:00 = 180 menit (first commit hari ini)
|
||||||
Task B commit 14:00–15:30 → span 90 menit
|
Task B commit 14:00–15: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:00–11:00 120m 4.00 buat api endpoint
|
CPONE 10832 08:00→11:00 180m↑ 4.80 buat api endpoint
|
||||||
Support Kedungdoro 5521 14:00–15:30 90m 3.00 fix bug validasi
|
Support Kedungdoro 5521 14:00–15: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 Senin–Jumat jam **16:55**:
|
Berjalan setiap Senin–Jumat 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` |
|
||||||
|
|||||||
Reference in New Issue
Block a user