Penyempurnaan Business Category
This commit is contained in:
Binary file not shown.
@@ -0,0 +1,250 @@
|
||||
# Review dan Rekomendasi Implementasi Simpanan Koperasi
|
||||
|
||||
Dokumen Management
|
||||
|
||||
Tanggal: 16 April 2026
|
||||
|
||||
## Ringkasan Eksekutif
|
||||
|
||||
Modul `asa_simpin_syariah` memiliki fondasi yang cukup baik untuk dipakai sebagai basis pengelolaan simpan pinjam syariah anggota koperasi. Modul ini sudah memiliki data anggota, produk simpanan, master akad, dan pola integrasi accounting pada fitur pembiayaan serta investasi.
|
||||
|
||||
Namun demikian, hasil review menunjukkan bahwa fitur simpanan anggota yang aktif saat ini belum terhubung langsung ke jurnal accounting pada saat transaksi setor maupun tarik dilakukan. Dengan kondisi sekarang, modul ini belum direkomendasikan untuk langsung dipakai sebagai sistem operasional simpanan koperasi tanpa penyesuaian lebih lanjut.
|
||||
|
||||
Rekomendasi utama adalah melanjutkan modul ini dengan refactor terarah pada area simpanan anggota agar:
|
||||
|
||||
- setiap jenis simpanan anggota tercatat rapi per rekening,
|
||||
- setiap transaksi setor dan tarik otomatis membentuk jurnal accounting,
|
||||
- saldo simpanan anggota akurat,
|
||||
- proses operasional dan audit menjadi lebih aman.
|
||||
|
||||
## Latar Belakang
|
||||
|
||||
Koperasi membutuhkan sistem yang dapat mencatat beberapa jenis simpanan anggota, seperti:
|
||||
|
||||
- simpanan pokok,
|
||||
- simpanan wajib,
|
||||
- simpanan sukarela,
|
||||
- simpanan hari raya atau simpanan khusus lainnya.
|
||||
|
||||
Selain pencatatan saldo, kebutuhan penting berikutnya adalah integrasi langsung ke accounting, sehingga setiap transaksi setor dan tarik tidak hanya tercatat sebagai mutasi internal, tetapi juga langsung masuk ke jurnal akuntansi perusahaan.
|
||||
|
||||
## Tujuan Review
|
||||
|
||||
Review ini dilakukan untuk menjawab tiga hal utama:
|
||||
|
||||
- apakah modul `asa_simpin_syariah` layak dipakai untuk pengelolaan simpanan anggota koperasi,
|
||||
- apakah modul ini sudah siap untuk otomatis membuat jurnal accounting saat setor dan tarik,
|
||||
- langkah implementasi apa yang paling aman dan paling efisien untuk dilanjutkan.
|
||||
|
||||
## Temuan Utama
|
||||
|
||||
### 1. Fondasi modul sudah cukup baik
|
||||
|
||||
Modul sudah memiliki komponen dasar yang penting:
|
||||
|
||||
- master anggota koperasi,
|
||||
- pembuatan rekening simpanan anggota,
|
||||
- produk simpanan,
|
||||
- master akad dan pemetaan jurnal,
|
||||
- contoh implementasi accounting pada fitur lain.
|
||||
|
||||
Ini berarti modul tidak perlu dibangun dari nol.
|
||||
|
||||
### 2. Jalur simpanan aktif belum otomatis menjurnal
|
||||
|
||||
Fitur simpanan yang aktif saat ini hanya menyimpan data setor dan tarik sebagai data operasional. Transaksi tersebut belum secara otomatis membentuk `account.move` atau jurnal accounting.
|
||||
|
||||
Dampaknya:
|
||||
|
||||
- setor dan tarik belum tercermin langsung pada pembukuan,
|
||||
- audit trail accounting belum lengkap,
|
||||
- perlu proses tambahan manual jika ingin sinkron dengan akuntansi.
|
||||
|
||||
### 3. Struktur simpanan saat ini masih transisi
|
||||
|
||||
Terdapat dua pola model simpanan di dalam modul:
|
||||
|
||||
- model lama yang pernah diarahkan ke accounting,
|
||||
- model aktif yang dipakai di UI saat ini.
|
||||
|
||||
Kondisi ini menunjukkan bahwa pengembangan sebelumnya belum diselesaikan sampai konsisten. Jika dibiarkan, hal ini berpotensi menimbulkan kebingungan operasional dan beban perawatan teknis.
|
||||
|
||||
### 4. Perhitungan saldo pada jalur aktif belum cukup aman
|
||||
|
||||
Logika saldo pada model simpanan aktif belum sepenuhnya memperhitungkan transaksi tarik secara benar. Untuk kebutuhan koperasi, ini harus dibenahi sebelum sistem dipakai dalam skala produksi.
|
||||
|
||||
### 5. Modul layak dilanjutkan, tetapi belum layak dipakai mentah-mentah
|
||||
|
||||
Kesimpulan review adalah:
|
||||
|
||||
- modul ini layak dilanjutkan sebagai basis sistem,
|
||||
- modul ini belum direkomendasikan langsung dipakai tanpa refactor,
|
||||
- pengembangan lanjutan akan lebih hemat dibanding membangun ulang dari nol.
|
||||
|
||||
## Analisis Dampak Bisnis
|
||||
|
||||
Jika modul digunakan dalam kondisi sekarang tanpa penyempurnaan, risiko bisnis yang mungkin muncul adalah:
|
||||
|
||||
- saldo simpanan anggota tidak selalu akurat,
|
||||
- jurnal accounting harus dibuat manual,
|
||||
- potensi selisih antara buku simpanan dan pembukuan,
|
||||
- proses audit dan pelacakan transaksi menjadi lebih sulit,
|
||||
- risiko koreksi data meningkat seiring jumlah transaksi.
|
||||
|
||||
Sebaliknya, jika modul disempurnakan sesuai rekomendasi, manfaat yang diperoleh adalah:
|
||||
|
||||
- pencatatan simpanan anggota lebih tertib,
|
||||
- saldo anggota dapat dipantau secara real-time,
|
||||
- jurnal accounting terbentuk otomatis,
|
||||
- kontrol internal dan audit trail menjadi lebih kuat,
|
||||
- proses kerja operasional koperasi menjadi lebih cepat dan konsisten.
|
||||
|
||||
## Rekomendasi Strategis
|
||||
|
||||
### A. Gunakan model simpanan aktif sebagai basis utama
|
||||
|
||||
Arah yang paling efisien adalah mempertahankan model simpanan yang saat ini aktif di UI, lalu menyempurnakannya agar menjadi rekening simpanan anggota final.
|
||||
|
||||
Keuntungan pendekatan ini:
|
||||
|
||||
- perubahan terhadap kebiasaan user lebih kecil,
|
||||
- migrasi dari kondisi sistem sekarang lebih ringan,
|
||||
- pengembangan bisa fokus ke kebutuhan bisnis inti.
|
||||
|
||||
### B. Tambahkan posting jurnal otomatis untuk setor dan tarik
|
||||
|
||||
Setiap transaksi simpanan sebaiknya menghasilkan jurnal accounting sebagai berikut:
|
||||
|
||||
Saat setor:
|
||||
|
||||
- debit ke akun kas atau bank,
|
||||
- credit ke akun kewajiban simpanan anggota.
|
||||
|
||||
Saat tarik:
|
||||
|
||||
- debit ke akun kewajiban simpanan anggota,
|
||||
- credit ke akun kas atau bank.
|
||||
|
||||
Dengan pola ini, sistem operasional dan accounting akan langsung sinkron.
|
||||
|
||||
### C. Rapikan konfigurasi akun per jenis simpanan
|
||||
|
||||
Setiap jenis simpanan sebaiknya memiliki mapping akun yang jelas, misalnya:
|
||||
|
||||
- Simpanan Pokok,
|
||||
- Simpanan Wajib,
|
||||
- Simpanan Sukarela,
|
||||
- Simpanan Hari Raya.
|
||||
|
||||
Hal ini penting agar jurnal yang terbentuk sesuai dengan struktur laporan keuangan koperasi.
|
||||
|
||||
### D. Terapkan validasi bisnis
|
||||
|
||||
Sistem perlu dilengkapi dengan validasi, antara lain:
|
||||
|
||||
- tarikan tidak boleh melebihi saldo,
|
||||
- simpanan pokok dapat dibuat tidak bisa ditarik,
|
||||
- hanya transaksi yang sudah diposting yang memengaruhi saldo,
|
||||
- transaksi yang sudah diposting tidak dihapus, tetapi dibalikkan dengan mekanisme yang aman.
|
||||
|
||||
## Rencana Implementasi Bertahap
|
||||
|
||||
### Tahap 1. Stabilisasi struktur simpanan
|
||||
|
||||
Fokus:
|
||||
|
||||
- merapikan model simpanan aktif,
|
||||
- memperbaiki perhitungan saldo,
|
||||
- membersihkan referensi model lama,
|
||||
- memperbaiki bug approval anggota.
|
||||
|
||||
Estimasi hasil:
|
||||
|
||||
- data simpanan lebih konsisten,
|
||||
- saldo lebih akurat,
|
||||
- pondasi pengembangan accounting siap.
|
||||
|
||||
### Tahap 2. Integrasi accounting otomatis
|
||||
|
||||
Fokus:
|
||||
|
||||
- membuat transaksi setor dan tarik otomatis menghasilkan jurnal,
|
||||
- menambahkan relasi ke `account.move`,
|
||||
- menyediakan jejak transaksi yang dapat dilihat dari rekening simpanan.
|
||||
|
||||
Estimasi hasil:
|
||||
|
||||
- operasional simpanan dan accounting langsung terhubung,
|
||||
- pekerjaan manual pembukuan berkurang.
|
||||
|
||||
### Tahap 3. Penyederhanaan konfigurasi admin
|
||||
|
||||
Fokus:
|
||||
|
||||
- membuka konfigurasi akun yang relevan,
|
||||
- menyederhanakan setup untuk admin,
|
||||
- memastikan setiap jenis simpanan punya mapping yang jelas.
|
||||
|
||||
Estimasi hasil:
|
||||
|
||||
- implementasi lebih mudah dipelihara,
|
||||
- risiko salah setting berkurang.
|
||||
|
||||
### Tahap 4. Pelaporan dan kontrol
|
||||
|
||||
Fokus:
|
||||
|
||||
- laporan mutasi simpanan anggota,
|
||||
- laporan saldo per jenis simpanan,
|
||||
- smart button ke jurnal accounting,
|
||||
- penguatan audit trail.
|
||||
|
||||
Estimasi hasil:
|
||||
|
||||
- monitoring management lebih baik,
|
||||
- kontrol keuangan lebih kuat.
|
||||
|
||||
## Estimasi Keputusan Management yang Dibutuhkan
|
||||
|
||||
Agar implementasi bisa berjalan efektif, management idealnya memberikan keputusan pada poin-poin berikut:
|
||||
|
||||
1. Menyetujui modul ini dilanjutkan sebagai basis sistem simpanan koperasi.
|
||||
2. Menyetujui refactor terbatas sebelum go-live operasional.
|
||||
3. Menyetujui bahwa transaksi setor dan tarik wajib terhubung otomatis ke accounting.
|
||||
4. Menyetujui jenis-jenis simpanan yang akan diaktifkan pada tahap awal implementasi.
|
||||
5. Menyetujui akun-akun accounting yang akan dipakai untuk masing-masing jenis simpanan.
|
||||
|
||||
## Kesimpulan
|
||||
|
||||
Secara umum, `asa_simpin_syariah` adalah modul yang layak untuk dilanjutkan sebagai fondasi sistem simpanan koperasi berbasis syariah. Nilai utamanya adalah modul ini sudah memiliki banyak komponen dasar yang bisa dimanfaatkan, sehingga pengembangan lanjutan lebih efisien dibanding membangun sistem baru dari nol.
|
||||
|
||||
Namun, agar aman digunakan sebagai sistem operasional simpanan anggota yang langsung terhubung ke accounting, modul ini tetap memerlukan refactor terarah pada area simpanan. Dengan langkah tersebut, sistem dapat memenuhi kebutuhan operasional koperasi sekaligus kebutuhan pembukuan dan pengawasan management.
|
||||
|
||||
## Rekomendasi Akhir
|
||||
|
||||
Rekomendasi saya kepada management adalah:
|
||||
|
||||
- lanjutkan penggunaan modul ini sebagai basis pengembangan,
|
||||
- jangan digunakan mentah-mentah untuk operasional penuh,
|
||||
- prioritaskan refactor simpanan dan integrasi jurnal accounting sebagai tahap pertama.
|
||||
|
||||
## Sign-Off
|
||||
|
||||
Disusun oleh:
|
||||
|
||||
- Nama: ______________________
|
||||
- Jabatan: ____________________
|
||||
- Tanggal: ____________________
|
||||
|
||||
Diperiksa oleh:
|
||||
|
||||
- Nama: ______________________
|
||||
- Jabatan: ____________________
|
||||
- Tanggal: ____________________
|
||||
|
||||
Disetujui oleh:
|
||||
|
||||
- Nama: ______________________
|
||||
- Jabatan: ____________________
|
||||
- Tanggal: ____________________
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,332 @@
|
||||
# Review `asa_simpin_syariah` untuk Simpanan Anggota Koperasi
|
||||
|
||||
## Tujuan
|
||||
|
||||
Dokumen ini merangkum hasil review modul `asa_simpin_syariah` untuk kebutuhan:
|
||||
|
||||
- menyimpan jenis-jenis simpanan anggota koperasi,
|
||||
- mencatat transaksi setor dan tarik simpanan,
|
||||
- membuat jurnal accounting secara langsung saat transaksi diposting.
|
||||
|
||||
## Kesimpulan Singkat
|
||||
|
||||
Modul ini **punya fondasi yang cukup baik** untuk dijadikan basis simpan pinjam syariah karena sudah memiliki:
|
||||
|
||||
- model anggota (`simpin_syariah.member`),
|
||||
- tipe/master akad dan mapping jurnal,
|
||||
- contoh implementasi accounting di pembiayaan, pinjaman, dan investasi,
|
||||
- pembuatan rekening simpanan anggota saat approval anggota.
|
||||
|
||||
Namun untuk kebutuhan **simpanan anggota yang langsung menjurnal ke accounting**, modul ini **belum siap dipakai apa adanya**. Jalur simpanan yang aktif di UI saat ini tidak membuat jurnal accounting, sementara jalur simpanan lama yang sempat terhubung ke accounting sudah tidak aktif dan masih menyisakan bug struktural.
|
||||
|
||||
## Temuan Review
|
||||
|
||||
### 1. Jalur simpanan yang aktif tidak membuat jurnal accounting
|
||||
|
||||
UI yang aktif saat ini memakai model `form.simpanan`:
|
||||
|
||||
- `views/form_simpanan_views.xml`
|
||||
- `models/form_simpanan.py`
|
||||
|
||||
Masalah utamanya:
|
||||
|
||||
- `form.simpanan.line` hanya menyimpan `debit`, `credit`, `keterangan`, dan `balance`.
|
||||
- Tidak ada relasi ke `account.move` atau `account.payment`.
|
||||
- Tidak ada method posting transaksi setor/tarik ke accounting.
|
||||
|
||||
Artinya, jika user setor atau tarik lewat menu yang aktif sekarang, transaksi hanya tersimpan sebagai data operasional internal dan **tidak menghasilkan jurnal akuntansi**.
|
||||
|
||||
### 2. Ada dua arsitektur simpanan yang berjalan paralel
|
||||
|
||||
Saat ini ada dua model simpanan:
|
||||
|
||||
- model lama: `simpin_syariah.rekening` di `models/syariah_simpanan.py`,
|
||||
- model aktif: `form.simpanan` di `models/form_simpanan.py`.
|
||||
|
||||
Dampaknya:
|
||||
|
||||
- proses approval anggota sudah membuat data `form.simpanan`,
|
||||
- tetapi sebagian method lama masih mencari data `simpin_syariah.rekening`,
|
||||
- sebagian navigasi UI juga masih mengarah ke action/view milik model lama.
|
||||
|
||||
Kondisi ini membuat modul berada di fase transisi yang belum selesai. Untuk operasional koperasi, ini berisiko menimbulkan data tidak sinkron, tombol rusak, dan logika bisnis ganda.
|
||||
|
||||
### 3. Jalur lama yang pernah diarahkan ke accounting sekarang tidak aktif dan belum bersih
|
||||
|
||||
Di `views/syariah_simpanan_views.xml`, hampir seluruh form/action/menu untuk `simpin_syariah.rekening` dikomentari. Artinya jalur lama ini pada praktiknya tidak dipakai di UI.
|
||||
|
||||
Selain itu, di `models/syariah_simpanan.py` masih ada indikasi masalah:
|
||||
|
||||
- transaksi lama membuat `account.payment` dengan field `simpanan_line_id`, tetapi field ini tidak didefinisikan di modul,
|
||||
- field `balance` memakai compute `_store_balance`, tetapi method tersebut tidak ada,
|
||||
- ada beberapa potensi error di `name_search` dan relasi turunannya.
|
||||
|
||||
Jadi model lama juga belum aman untuk langsung dihidupkan kembali.
|
||||
|
||||
### 4. Perhitungan saldo simpanan aktif belum benar untuk transaksi tarik
|
||||
|
||||
Di `form.simpanan`, field `balance` dihitung dengan menjumlahkan `debit` saja. `credit` tidak ikut mengurangi saldo.
|
||||
|
||||
Akibatnya:
|
||||
|
||||
- transaksi tarikan tidak benar-benar menurunkan saldo total,
|
||||
- saldo di header bisa berbeda dengan saldo mutasi per baris,
|
||||
- pembatasan saldo tarik (`max_debit`) menjadi tidak akurat.
|
||||
|
||||
Ini adalah blocker utama jika modul ingin dipakai sebagai buku simpanan koperasi.
|
||||
|
||||
### 5. Workflow simpanan aktif tidak konsisten
|
||||
|
||||
State yang tersedia:
|
||||
|
||||
- `draft`
|
||||
- `submit`
|
||||
- `check`
|
||||
- `approve`
|
||||
- `active`
|
||||
- `close`
|
||||
- `block`
|
||||
|
||||
Tetapi method yang dipakai saat ini:
|
||||
|
||||
- `func_submit()` memindahkan `draft -> submit`
|
||||
- `func_approve()` memindahkan `submit -> active`
|
||||
- `func_close()` hanya bisa jalan dari `approve -> close`
|
||||
|
||||
Karena record langsung masuk ke `active`, tombol close praktis tidak sejalan dengan alur state yang sedang dipakai.
|
||||
|
||||
### 6. Approval anggota punya bug saat partner sudah ada
|
||||
|
||||
Di `action_approve()` pada `models/syariah_member.py`, jika partner sudah ada maka variabel `user_id` tidak dibuat, tetapi tetap dipakai sesudah blok `if/else`.
|
||||
|
||||
Ini bisa membuat proses approval gagal pada anggota yang partner-nya sudah lebih dulu ada di database.
|
||||
|
||||
### 7. Konfigurasi accounting untuk simpanan ada, tetapi UI konfigurasi banyak yang disembunyikan
|
||||
|
||||
Modul sebenarnya sudah punya fondasi konfigurasi accounting:
|
||||
|
||||
- `master.kode_transaksi`
|
||||
- `master.akad_syariah`
|
||||
- `master.akad_journal`
|
||||
|
||||
Ini cukup bagus sebagai basis pemetaan jurnal simpanan. Namun di `views/syariah_config_views.xml`, banyak form/action/menu konfigurasi tersebut dikomentari. Akibatnya, konfigurasi penting sulit dipelihara dari UI.
|
||||
|
||||
## Apakah Modul Ini Bisa Dipakai untuk Simpanan Koperasi?
|
||||
|
||||
### Bisa, tetapi belum langsung siap produksi
|
||||
|
||||
Modul ini layak dipakai sebagai **starting point**, bukan sebagai solusi final yang langsung operasional untuk simpanan anggota.
|
||||
|
||||
Yang sudah cocok:
|
||||
|
||||
- ada master anggota,
|
||||
- ada produk simpanan,
|
||||
- ada pola jurnal dari modul pembiayaan/pinjaman,
|
||||
- ada proses auto-create rekening simpanan saat anggota disetujui.
|
||||
|
||||
Yang belum siap:
|
||||
|
||||
- jurnal setor/tarik pada jalur simpanan aktif,
|
||||
- saldo yang akurat,
|
||||
- konsistensi model,
|
||||
- konfigurasi yang mudah dipakai admin,
|
||||
- referensi UI/model lama yang masih tercecer.
|
||||
|
||||
## Rekomendasi Arsitektur
|
||||
|
||||
### Pilih satu model simpanan saja
|
||||
|
||||
Saran paling aman: **jadikan `form.simpanan` sebagai model rekening simpanan utama** karena:
|
||||
|
||||
- model ini yang sekarang aktif di UI,
|
||||
- model ini yang dibuat otomatis saat approval anggota,
|
||||
- migrasi dari kondisi sekarang akan lebih kecil.
|
||||
|
||||
Model lama `simpin_syariah.rekening` sebaiknya:
|
||||
|
||||
- dipensiunkan bertahap,
|
||||
- atau hanya dipertahankan sebagai referensi migrasi,
|
||||
- lalu seluruh method lama yang masih menunjuk ke model lama dibersihkan.
|
||||
|
||||
### Ubah `form.simpanan.line` menjadi transaksi resmi yang bisa diposting
|
||||
|
||||
Minimal field yang disarankan pada `form.simpanan.line`:
|
||||
|
||||
- `date`
|
||||
- `transaction_type` (`setor`, `tarik`, `adjustment`, opsional `transfer`)
|
||||
- `amount`
|
||||
- `description`
|
||||
- `state` (`draft`, `posted`, `cancel`)
|
||||
- `journal_id`
|
||||
- `move_id`
|
||||
- `debit`
|
||||
- `credit`
|
||||
- `balance`
|
||||
|
||||
Catatan:
|
||||
|
||||
- `debit` dan `credit` tetap boleh dipertahankan jika ingin mengikuti struktur lama,
|
||||
- tetapi untuk UI operasional akan lebih aman jika user hanya mengisi `transaction_type` + `amount`,
|
||||
- nilai `debit/credit` dibentuk otomatis oleh sistem.
|
||||
|
||||
### Gunakan `account.move`, bukan sekadar catatan internal
|
||||
|
||||
Untuk kebutuhan koperasi, transaksi setor/tarik sebaiknya menghasilkan `account.move` yang diposting langsung.
|
||||
|
||||
Alasannya:
|
||||
|
||||
- audit trail lebih kuat,
|
||||
- mudah direkonsiliasi dengan kas/bank,
|
||||
- mengikuti pola Odoo Accounting,
|
||||
- lebih fleksibel untuk laporan buku besar dan neraca.
|
||||
|
||||
## Desain Jurnal yang Disarankan
|
||||
|
||||
### Setoran simpanan
|
||||
|
||||
Saat anggota menyetor:
|
||||
|
||||
- Debit: akun kas/bank dari jurnal yang dipilih
|
||||
- Credit: akun kewajiban simpanan anggota
|
||||
|
||||
Contoh:
|
||||
|
||||
- Debit `111100 - Kas`
|
||||
- Credit `211100 - Simpanan Anggota Wajib`
|
||||
|
||||
### Tarikan simpanan
|
||||
|
||||
Saat anggota menarik simpanan:
|
||||
|
||||
- Debit: akun kewajiban simpanan anggota
|
||||
- Credit: akun kas/bank dari jurnal yang dipilih
|
||||
|
||||
Contoh:
|
||||
|
||||
- Debit `211300 - Simpanan Sukarela Anggota`
|
||||
- Credit `111100 - Kas`
|
||||
|
||||
### Sumber akun kewajiban simpanan
|
||||
|
||||
Ada dua opsi yang masuk akal:
|
||||
|
||||
1. Mapping per jenis simpanan melalui `master.akad_journal`
|
||||
2. Mapping langsung per produk simpanan
|
||||
|
||||
Rekomendasi saya:
|
||||
|
||||
- jika koperasi Anda ingin tetap dekat dengan desain modul syariah, pakai `master.akad_syariah` + `master.akad_journal`,
|
||||
- jika ingin implementasi lebih sederhana dan cepat, tambahkan akun kewajiban langsung di produk simpanan.
|
||||
|
||||
## Alur Operasional yang Disarankan
|
||||
|
||||
### Pembukaan simpanan anggota
|
||||
|
||||
Saat anggota disetujui:
|
||||
|
||||
- sistem membuat rekening simpanan per jenis,
|
||||
- misalnya: `pokok`, `wajib`, `sukarela`, `hari raya`,
|
||||
- status rekening langsung `active`.
|
||||
|
||||
### Setor
|
||||
|
||||
User klik tombol `Setor` pada rekening simpanan:
|
||||
|
||||
- isi tanggal,
|
||||
- isi nominal,
|
||||
- pilih kas/bank journal,
|
||||
- isi keterangan,
|
||||
- sistem membuat `account.move`,
|
||||
- sistem post jurnal,
|
||||
- sistem simpan `move_id` di transaksi simpanan,
|
||||
- saldo rekening diperbarui dari transaksi yang sudah `posted`.
|
||||
|
||||
### Tarik
|
||||
|
||||
User klik tombol `Tarik` pada rekening simpanan:
|
||||
|
||||
- isi tanggal,
|
||||
- isi nominal,
|
||||
- pilih kas/bank journal,
|
||||
- sistem validasi saldo tersedia,
|
||||
- sistem membuat `account.move`,
|
||||
- sistem post jurnal,
|
||||
- sistem simpan `move_id`,
|
||||
- saldo rekening diperbarui.
|
||||
|
||||
## Validasi yang Wajib Ada
|
||||
|
||||
Sebelum modul dipakai produksi, saya sarankan validasi berikut wajib dibuat:
|
||||
|
||||
- tidak boleh tarik melebihi saldo,
|
||||
- simpanan `pokok` bisa dibuat tidak boleh ditarik,
|
||||
- simpanan `wajib` bisa dibatasi hanya pada kondisi tertentu,
|
||||
- hanya transaksi `posted` yang memengaruhi saldo,
|
||||
- jurnal harus punya akun debit/kredit yang lengkap,
|
||||
- transaksi tidak boleh dihapus setelah posted, hanya bisa reverse/cancel.
|
||||
|
||||
## Perubahan Teknis Minimum yang Saya Rekomendasikan
|
||||
|
||||
### Tahap 1: Stabilkan model aktif
|
||||
|
||||
- rapikan `form.simpanan`,
|
||||
- perbaiki compute saldo agar `debit - credit`,
|
||||
- perbaiki workflow state,
|
||||
- matikan referensi ke `simpin_syariah.rekening` yang sudah tidak dipakai,
|
||||
- perbaiki bug `action_approve()` pada member.
|
||||
|
||||
### Tahap 2: Tambahkan posting accounting
|
||||
|
||||
- tambahkan `move_id` pada transaksi simpanan,
|
||||
- buat method `action_post_setor()` dan `action_post_tarik()`,
|
||||
- buat helper untuk menyiapkan line `account.move`,
|
||||
- post jurnal otomatis saat transaksi disetujui.
|
||||
|
||||
### Tahap 3: Rapikan konfigurasi
|
||||
|
||||
- buka kembali menu konfigurasi yang relevan,
|
||||
- sederhanakan master yang benar-benar dibutuhkan admin,
|
||||
- definisikan mapping akun per jenis simpanan.
|
||||
|
||||
### Tahap 4: Audit dan laporan
|
||||
|
||||
- buat smart button ke jurnal accounting,
|
||||
- buat laporan mutasi simpanan anggota,
|
||||
- buat laporan saldo per jenis simpanan.
|
||||
|
||||
## Rekomendasi Implementasi Praktis
|
||||
|
||||
Jika target Anda adalah segera memakai modul ini untuk koperasi, saya sarankan pendekatan berikut:
|
||||
|
||||
1. Jangan aktifkan kembali `simpin_syariah.rekening` apa adanya.
|
||||
2. Pertahankan `form.simpanan` sebagai rekening simpanan utama.
|
||||
3. Refactor `form.simpanan.line` agar menjadi transaksi yang bisa mem-post jurnal.
|
||||
4. Ambil pola pembuatan `account.move` dari modul `syariah_pinjaman.py` dan `syariah_investasi.py`.
|
||||
5. Gunakan satu mapping akun yang sederhana dulu untuk tiap jenis simpanan.
|
||||
|
||||
Dengan pendekatan ini, implementasi akan lebih cepat, lebih konsisten dengan UI saat ini, dan lebih aman untuk produksi dibanding menghidupkan ulang jalur lama.
|
||||
|
||||
## Status Rekomendasi
|
||||
|
||||
### Cocok untuk dilanjutkan
|
||||
|
||||
Modul ini **layak dilanjutkan** sebagai basis simpanan koperasi syariah.
|
||||
|
||||
### Tidak disarankan dipakai mentah-mentah
|
||||
|
||||
Jika dipakai langsung tanpa refactor, risiko utamanya adalah:
|
||||
|
||||
- saldo simpanan tidak akurat,
|
||||
- jurnal accounting tidak terbentuk,
|
||||
- proses approval/member bisa error,
|
||||
- masih ada referensi model lama yang tidak aktif.
|
||||
|
||||
## Langkah Berikutnya
|
||||
|
||||
Jika ingin, tahap lanjutan yang paling bernilai adalah:
|
||||
|
||||
1. refactor `form.simpanan` menjadi rekening simpanan final,
|
||||
2. tambah posting jurnal otomatis untuk setor dan tarik,
|
||||
3. rapikan konfigurasi akun per jenis simpanan,
|
||||
4. siapkan skenario uji transaksi simpanan anggota dari awal sampai jurnal posting.
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
Modul `grt_crm_business_category` dipakai untuk memisahkan data CRM berdasarkan Business Category, agar:
|
||||
- Pipeline bisa diikat ke kategori bisnis tertentu.
|
||||
- Akses user dibatasi berdasarkan kategori yang diizinkan.
|
||||
- User antar kategori tidak saling update data (kecuali admin/manager CRM).
|
||||
- User antar kategori tidak saling membaca atau update data lintas kategori.
|
||||
|
||||
## 2. Ringkasan Fitur yang Sudah Dibuat
|
||||
1. Master model `crm.business.category`.
|
||||
@@ -17,7 +17,9 @@ Modul `grt_crm_business_category` dipakai untuk memisahkan data CRM berdasarkan
|
||||
- `default_business_category_id`
|
||||
- `active_business_category_id`
|
||||
5. Rule security berbasis kategori (read/create/write/delete) sesuai role.
|
||||
6. Menu konfigurasi khusus:
|
||||
6. Isolasi strict untuk aktivitas CRM (`mail.activity`) berdasarkan kategori lead.
|
||||
7. Override rule default CRM yang terlalu permisif agar tidak membypass rule kategori.
|
||||
8. Menu konfigurasi khusus:
|
||||
- `CRM > Configuration > Business Categories`
|
||||
- `CRM > Configuration > Pipelines by Category`
|
||||
- `CRM > Configuration > User Category Access`
|
||||
@@ -64,6 +66,12 @@ Lokasi: `models/business_category_mixin.py`
|
||||
- `business.category.mixin` untuk dipakai ulang di modul lain.
|
||||
- Menyediakan field `business_category_id` dengan default dari active/default category user.
|
||||
|
||||
### 3.6 Extend `mail.activity`
|
||||
Lokasi: `models/mail_activity.py`
|
||||
- Tambah field `business_category_id` (computed + stored) untuk mirror kategori dari lead terkait.
|
||||
- Jika `res_model = crm.lead`, kategori aktivitas mengikuti `crm.lead.business_category_id`.
|
||||
- Field ini dipakai sebagai basis record rule agar aktivitas CRM hanya terlihat pada kategori user yang diizinkan.
|
||||
|
||||
## 4. Data Default
|
||||
Lokasi: `data/crm_business_category_data.xml`
|
||||
Dibuat 6 kategori awal:
|
||||
@@ -97,10 +105,23 @@ Lokasi: `security/ir.rule.csv`
|
||||
- Read-only kategori yang diizinkan.
|
||||
|
||||
#### Untuk manager/admin CRM (`sales_team.group_sale_manager`)
|
||||
- Full access (read/write/create/unlink) untuk:
|
||||
- `crm.lead`
|
||||
- `crm.team`
|
||||
- `crm.business.category`
|
||||
- `crm.lead`: read/write/create/unlink tetap dibatasi ke `user.effective_business_category_ids`.
|
||||
- `crm.team`: read/write/create/unlink dibatasi ke `user.effective_business_category_ids`.
|
||||
- `mail.activity` (khusus aktivitas CRM / `res_model = crm.lead`): read dibatasi ke `user.effective_business_category_ids`.
|
||||
|
||||
#### Untuk system admin (`base.group_system`)
|
||||
- `crm.team`: full access mengikuti company user.
|
||||
- `crm.activity.history`: access dibatasi ke `user.effective_business_category_ids`.
|
||||
|
||||
### 5.3 Override Rule Default CRM
|
||||
Lokasi: `security/crm_base_rule_overrides.xml`
|
||||
|
||||
Untuk menjaga policy strict category dan mencegah OR-combine rule default CRM membuka akses lintas kategori,
|
||||
rule bawaan berikut dinonaktifkan:
|
||||
1. `crm.crm_rule_all_lead`
|
||||
2. `crm.crm_rule_personal_lead`
|
||||
|
||||
Dengan override ini, evaluasi akses `crm.lead` mengikuti rule kategori pada modul ini.
|
||||
|
||||
## 6. Menu dan Konfigurasi Operasional
|
||||
|
||||
@@ -130,13 +151,15 @@ Fungsi: set `Allowed`, `Default`, dan `Active` business category per user.
|
||||
1. Di environment ini, inject ke tab default `Access Rights` user (`base.view_users_form`) sempat menimbulkan error validator `safe_eval` (opcode `RESUME/RETURN_CONST`).
|
||||
2. Karena itu, pengaturan user kategori dibuat lewat menu terpisah `User Category Access` agar stabil.
|
||||
3. Rule dipindah ke `ir.rule.csv` (bukan XML eval groups) untuk kompatibilitas environment saat ini.
|
||||
4. Mulai versi `14.0.2.12.0`, diberlakukan strict isolation untuk aktivitas CRM dan override rule default CRM yang permisif.
|
||||
|
||||
## 9. Checklist Testing
|
||||
1. Login sebagai manager CRM:
|
||||
- Bisa lihat semua kategori/team/lead.
|
||||
- Bisa create/edit/delete data lintas kategori.
|
||||
- Hanya bisa lihat lead/team/activity CRM pada kategori yang termasuk `effective_business_category_ids`.
|
||||
- Tidak bisa lihat lead/activity CRM dari kategori lain.
|
||||
2. Login sebagai user CRM biasa (category A):
|
||||
- Hanya bisa lihat lead/team/category di category A.
|
||||
- Hanya bisa lihat aktivitas CRM (`mail.activity` pada `crm.lead`) di category A.
|
||||
- Tidak bisa edit lead milik user lain walau sama category.
|
||||
- Bisa edit lead milik sendiri.
|
||||
3. Buat lead dengan team tanpa category:
|
||||
@@ -149,10 +172,12 @@ Fungsi: set `Allowed`, `Default`, dan `Active` business category per user.
|
||||
- `models/crm_business_category.py`
|
||||
- `models/crm_team.py`
|
||||
- `models/crm_lead.py`
|
||||
- `models/mail_activity.py`
|
||||
- `models/res_users.py`
|
||||
- `models/business_category_mixin.py`
|
||||
- `security/ir.model.access.csv`
|
||||
- `security/ir.rule.csv`
|
||||
- `security/crm_base_rule_overrides.xml`
|
||||
- `data/crm_business_category_data.xml`
|
||||
- `views/crm_business_category_views.xml`
|
||||
- `views/crm_team_business_category_views.xml`
|
||||
|
||||
@@ -9,11 +9,12 @@ This enables different staging flow per business category through team pipelines
|
||||
"author": "PT Gagak Rimang Teknologi",
|
||||
"website": "https://rimang.id",
|
||||
"category": "Sales/CRM",
|
||||
"version": "14.0.2.11.1",
|
||||
"version": "14.0.2.13.0",
|
||||
"depends": ["crm", "grt_business_category_base"],
|
||||
"data": [
|
||||
"security/ir.model.access.csv",
|
||||
"security/ir.rule.csv",
|
||||
"security/crm_base_rule_overrides.xml",
|
||||
"views/assets.xml",
|
||||
"views/crm_activity_history_views.xml",
|
||||
"views/crm_lead_views.xml",
|
||||
|
||||
@@ -5,6 +5,15 @@ from datetime import timedelta
|
||||
class MailActivity(models.Model):
|
||||
_inherit = "mail.activity"
|
||||
|
||||
business_category_id = fields.Many2one(
|
||||
"crm.business.category",
|
||||
string="Business Category",
|
||||
compute="_compute_business_category_id",
|
||||
store=True,
|
||||
readonly=True,
|
||||
index=True,
|
||||
)
|
||||
|
||||
kilometer = fields.Float(string="Kilometer (KM)", digits=(16, 2))
|
||||
gps_captured = fields.Boolean(string="GPS Captured")
|
||||
gps_latitude = fields.Float(string="GPS Latitude", digits=(9, 6))
|
||||
@@ -13,6 +22,20 @@ class MailActivity(models.Model):
|
||||
gps_client_tz = fields.Char(string="GPS Client TZ")
|
||||
gps_openstreetmap_url = fields.Char(string="OpenStreetMap URL")
|
||||
|
||||
@api.depends("res_model", "res_id")
|
||||
def _compute_business_category_id(self):
|
||||
lead_ids = {activity.res_id for activity in self if activity.res_model == "crm.lead" and activity.res_id}
|
||||
lead_category_map = {}
|
||||
if lead_ids:
|
||||
leads = self.env["crm.lead"].sudo().browse(list(lead_ids)).exists()
|
||||
lead_category_map = {lead.id: lead.business_category_id.id for lead in leads}
|
||||
|
||||
for activity in self:
|
||||
if activity.res_model == "crm.lead" and activity.res_id:
|
||||
activity.business_category_id = lead_category_map.get(activity.res_id)
|
||||
else:
|
||||
activity.business_category_id = False
|
||||
|
||||
@staticmethod
|
||||
def _has_valid_gps(lat, lon):
|
||||
if lat is None or lon is None:
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<!-- Enforce strict business category isolation by disabling permissive default CRM lead rules. -->
|
||||
<record id="crm.crm_rule_all_lead" model="ir.rule">
|
||||
<field name="active" eval="0"/>
|
||||
</record>
|
||||
|
||||
<record id="crm.crm_rule_personal_lead" model="ir.rule">
|
||||
<field name="active" eval="0"/>
|
||||
</record>
|
||||
</odoo>
|
||||
@@ -2,9 +2,16 @@ id,name,model_id:id,domain_force,groups:id,perm_read,perm_write,perm_create,perm
|
||||
crm_lead_business_category_rule_user_read_create,CRM Lead read/create by effective business category,crm.model_crm_lead,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",crm.group_use_lead,1,0,1,0
|
||||
crm_lead_business_category_rule_user_write_own,CRM Lead write own by effective business category,crm.model_crm_lead,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids),'|',('user_id','=',user.id),('create_uid','=',user.id)]",crm.group_use_lead,0,1,0,1
|
||||
crm_team_business_category_rule_user,CRM Team read by effective business category,sales_team.model_crm_team,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",crm.group_use_lead,1,0,0,0
|
||||
crm_stage_business_category_rule_user,CRM Stage read by effective business category,crm.model_crm_stage,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",crm.group_use_lead,1,0,0,0
|
||||
crm_lead_business_category_rule_manager,CRM Lead full access for manager in effective business category,crm.model_crm_lead,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_manager,1,1,1,1
|
||||
crm_team_business_category_rule_manager,CRM Team full access for manager in effective business category,sales_team.model_crm_team,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_manager,1,1,1,1
|
||||
crm_stage_business_category_rule_manager,CRM Stage full access for manager in effective business category,crm.model_crm_stage,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_manager,1,1,1,1
|
||||
crm_activity_history_rule_user,CRM Activity History by effective business category,model_crm_activity_history,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",crm.group_use_lead,1,0,0,0
|
||||
crm_activity_history_rule_manager,CRM Activity History full access for manager in effective business category,model_crm_activity_history,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_manager,1,1,1,1
|
||||
crm_team_business_category_rule_sysadmin,CRM Team full access for system admin,sales_team.model_crm_team,"[('company_id','in',user.company_ids.ids)]",base.group_system,1,1,1,1
|
||||
crm_team_business_category_rule_sysadmin,CRM Team access for system admin in effective business category,sales_team.model_crm_team,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
crm_stage_business_category_rule_sysadmin,CRM Stage access for system admin in effective business category,crm.model_crm_stage,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
crm_lead_business_category_rule_sysadmin,CRM Lead access for system admin in effective business category,crm.model_crm_lead,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
crm_activity_history_rule_sysadmin,CRM Activity History access for system admin in effective business category,model_crm_activity_history,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
mail_activity_business_category_rule_user_read,Mail Activity read by effective business category for CRM,mail.model_mail_activity,"['|',('res_model','!=','crm.lead'),('business_category_id','in',user.effective_business_category_ids.ids)]",crm.group_use_lead,1,0,0,0
|
||||
mail_activity_business_category_rule_manager_read,Mail Activity read by effective business category for manager,mail.model_mail_activity,"['|',('res_model','!=','crm.lead'),('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_manager,1,0,0,0
|
||||
mail_activity_business_category_rule_sysadmin_read,Mail Activity read by effective business category for system admin,mail.model_mail_activity,"['|',('res_model','!=','crm.lead'),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,0,0,0
|
||||
|
||||
|
@@ -10,7 +10,7 @@ for expense transactions and accounting entries.
|
||||
"author": "PT Gagak Rimang Teknologi",
|
||||
"website": "https://rimang.id",
|
||||
"category": "Human Resources/Expenses",
|
||||
"version": "14.0.1.1.0",
|
||||
"version": "14.0.1.2.0",
|
||||
"depends": [
|
||||
"hr_expense",
|
||||
"account",
|
||||
|
||||
@@ -2,17 +2,19 @@ id,name,model_id:id,domain_force,groups:id,perm_read,perm_write,perm_create,perm
|
||||
hr_expense_business_category_rule_user_read_create,Expense read/create by effective business category,hr_expense.model_hr_expense,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",hr_expense.group_hr_expense_user,1,0,1,0
|
||||
hr_expense_business_category_rule_user_write_own,Expense write own by effective business category,hr_expense.model_hr_expense,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids),'|',('employee_id.user_id','=',user.id),('create_uid','=',user.id)]",hr_expense.group_hr_expense_user,0,1,0,1
|
||||
hr_expense_business_category_rule_manager,Expense full access for expense manager in effective business category,hr_expense.model_hr_expense,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",hr_expense.group_hr_expense_manager,1,1,1,1
|
||||
hr_expense_business_category_rule_sysadmin,Expense full access for system admin,hr_expense.model_hr_expense,"[('company_id','in',user.company_ids.ids)]",base.group_system,1,1,1,1
|
||||
hr_expense_business_category_rule_sysadmin,Expense access for system admin in effective business category,hr_expense.model_hr_expense,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
hr_expense_sheet_business_category_rule_user,Expense Report read by effective business category,hr_expense.model_hr_expense_sheet,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",hr_expense.group_hr_expense_user,1,0,0,0
|
||||
hr_expense_sheet_business_category_rule_manager,Expense Report full access for expense manager in effective business category,hr_expense.model_hr_expense_sheet,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",hr_expense.group_hr_expense_manager,1,1,1,1
|
||||
hr_expense_sheet_business_category_rule_sysadmin,Expense Report full access for system admin,hr_expense.model_hr_expense_sheet,"[('company_id','in',user.company_ids.ids)]",base.group_system,1,1,1,1
|
||||
hr_expense_sheet_business_category_rule_sysadmin,Expense Report access for system admin in effective business category,hr_expense.model_hr_expense_sheet,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
expense_team_business_category_rule_user,Expense Team read by effective business category,model_expense_team,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",hr_expense.group_hr_expense_user,1,0,0,0
|
||||
expense_team_business_category_rule_manager,Expense Team full access for expense manager in effective business category,model_expense_team,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",hr_expense.group_hr_expense_manager,1,1,1,1
|
||||
expense_team_business_category_rule_sysadmin,Expense Team full access for system admin,model_expense_team,"[('company_id','in',user.company_ids.ids)]",base.group_system,1,1,1,1
|
||||
expense_team_business_category_rule_sysadmin,Expense Team access for system admin in effective business category,model_expense_team,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
crm_business_category_rule_expense_user,Business Category by user effective list for expense user,grt_business_category_base.model_crm_business_category,"[('company_id','in',user.company_ids.ids),('id','in',user.effective_business_category_ids.ids)]",hr_expense.group_hr_expense_user,1,0,0,0
|
||||
crm_business_category_rule_expense_manager,Business Category access for expense manager in effective business category,grt_business_category_base.model_crm_business_category,"[('company_id','in',user.company_ids.ids),('id','in',user.effective_business_category_ids.ids)]",hr_expense.group_hr_expense_manager,1,1,1,1
|
||||
crm_business_category_rule_expense_sysadmin,Business Category full access for system admin,grt_business_category_base.model_crm_business_category,"[('company_id','in',user.company_ids.ids)]",base.group_system,1,1,1,1
|
||||
crm_business_category_rule_expense_sysadmin,Business Category access for system admin in effective business category,grt_business_category_base.model_crm_business_category,"[('company_id','in',user.company_ids.ids),('id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
account_move_expense_business_category_rule_user,Journal Entry read by effective business category for expense user,account.model_account_move,"[('company_id','in',user.company_ids.ids),('expense_business_category_id','in',user.effective_business_category_ids.ids)]",hr_expense.group_hr_expense_user,1,0,0,0
|
||||
account_move_expense_business_category_rule_manager,Journal Entry access for expense manager in effective business category,account.model_account_move,"[('company_id','in',user.company_ids.ids),('expense_business_category_id','in',user.effective_business_category_ids.ids)]",hr_expense.group_hr_expense_manager,1,1,1,1
|
||||
account_move_expense_business_category_rule_sysadmin,Journal Entry access for system admin in effective business category,account.model_account_move,"[('company_id','in',user.company_ids.ids),('expense_business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
account_move_line_expense_business_category_rule_user,Journal Item read by effective business category for expense user,account.model_account_move_line,"[('company_id','in',user.company_ids.ids),('move_id.expense_business_category_id','in',user.effective_business_category_ids.ids)]",hr_expense.group_hr_expense_user,1,0,0,0
|
||||
account_move_line_expense_business_category_rule_manager,Journal Item access for expense manager in effective business category,account.model_account_move_line,"[('company_id','in',user.company_ids.ids),('move_id.expense_business_category_id','in',user.effective_business_category_ids.ids)]",hr_expense.group_hr_expense_manager,1,1,1,1
|
||||
account_move_line_expense_business_category_rule_sysadmin,Journal Item access for system admin in effective business category,account.model_account_move_line,"[('company_id','in',user.company_ids.ids),('move_id.expense_business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
|
||||
|
@@ -10,7 +10,7 @@ propagation for stock valuation journal entries.
|
||||
"author": "PT Gagak Rimang Teknologi",
|
||||
"website": "https://rimang.id",
|
||||
"category": "Inventory",
|
||||
"version": "14.0.1.1.2",
|
||||
"version": "14.0.1.2.0",
|
||||
"depends": [
|
||||
"stock_account",
|
||||
"sale_stock",
|
||||
|
||||
@@ -2,27 +2,29 @@ id,name,model_id:id,domain_force,groups:id,perm_read,perm_write,perm_create,perm
|
||||
stock_picking_business_category_rule_user_read_create,Transfer read/create by effective business category,stock.model_stock_picking,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",stock.group_stock_user,1,0,1,0
|
||||
stock_picking_business_category_rule_user_write_own,Transfer write own by effective business category,stock.model_stock_picking,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids),'|',('user_id','=',user.id),('create_uid','=',user.id)]",stock.group_stock_user,0,1,0,1
|
||||
stock_picking_business_category_rule_manager,Transfer full access for inventory manager in effective business category,stock.model_stock_picking,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",stock.group_stock_manager,1,1,1,1
|
||||
stock_picking_business_category_rule_sysadmin,Transfer full access for system admin,stock.model_stock_picking,"[('company_id','in',user.company_ids.ids)]",base.group_system,1,1,1,1
|
||||
stock_picking_business_category_rule_sysadmin,Transfer access for system admin in effective business category,stock.model_stock_picking,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
stock_move_business_category_rule_user,Stock Move by effective business category,stock.model_stock_move,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",stock.group_stock_user,1,0,0,0
|
||||
stock_move_business_category_rule_manager,Stock Move full access for inventory manager in effective business category,stock.model_stock_move,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",stock.group_stock_manager,1,1,1,1
|
||||
stock_move_business_category_rule_sysadmin,Stock Move full access for system admin,stock.model_stock_move,"[('company_id','in',user.company_ids.ids)]",base.group_system,1,1,1,1
|
||||
stock_move_business_category_rule_sysadmin,Stock Move access for system admin in effective business category,stock.model_stock_move,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
stock_warehouse_business_category_rule_user,Warehouse by effective business category,stock.model_stock_warehouse,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",stock.group_stock_user,1,0,0,0
|
||||
stock_warehouse_business_category_rule_manager,Warehouse full access for inventory manager in effective business category,stock.model_stock_warehouse,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",stock.group_stock_manager,1,1,1,1
|
||||
stock_warehouse_business_category_rule_sysadmin,Warehouse full access for system admin,stock.model_stock_warehouse,"[('company_id','in',user.company_ids.ids)]",base.group_system,1,1,1,1
|
||||
stock_warehouse_business_category_rule_sysadmin,Warehouse access for system admin in effective business category,stock.model_stock_warehouse,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
stock_team_business_category_rule_user,Inventory Team read by effective business category,model_stock_team,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",stock.group_stock_user,1,0,0,0
|
||||
stock_team_business_category_rule_manager,Inventory Team full access for inventory manager in effective business category,model_stock_team,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",stock.group_stock_manager,1,1,1,1
|
||||
stock_team_business_category_rule_sysadmin,Inventory Team full access for system admin,model_stock_team,"[('company_id','in',user.company_ids.ids)]",base.group_system,1,1,1,1
|
||||
stock_team_business_category_rule_sysadmin,Inventory Team access for system admin in effective business category,model_stock_team,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
crm_business_category_rule_inventory_user,Business Category by user effective list for inventory user,grt_business_category_base.model_crm_business_category,"[('company_id','in',user.company_ids.ids),('id','in',user.effective_business_category_ids.ids)]",stock.group_stock_user,1,0,0,0
|
||||
crm_business_category_rule_inventory_manager,Business Category access for inventory manager in effective business category,grt_business_category_base.model_crm_business_category,"[('company_id','in',user.company_ids.ids),('id','in',user.effective_business_category_ids.ids)]",stock.group_stock_manager,1,1,1,1
|
||||
crm_business_category_rule_inventory_sysadmin,Business Category full access for system admin,grt_business_category_base.model_crm_business_category,"[('company_id','in',user.company_ids.ids)]",base.group_system,1,1,1,1
|
||||
crm_business_category_rule_inventory_sysadmin,Business Category access for system admin in effective business category,grt_business_category_base.model_crm_business_category,"[('company_id','in',user.company_ids.ids),('id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
account_move_inventory_business_category_rule_user,Journal Entry read by effective business category for inventory user,account.model_account_move,"[('company_id','in',user.company_ids.ids),('inventory_business_category_id','in',user.effective_business_category_ids.ids)]",stock.group_stock_user,1,0,0,0
|
||||
account_move_inventory_business_category_rule_manager,Journal Entry access for inventory manager in effective business category,account.model_account_move,"[('company_id','in',user.company_ids.ids),('inventory_business_category_id','in',user.effective_business_category_ids.ids)]",stock.group_stock_manager,1,1,1,1
|
||||
account_move_inventory_business_category_rule_sysadmin,Journal Entry access for system admin in effective business category,account.model_account_move,"[('company_id','in',user.company_ids.ids),('inventory_business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
account_move_line_inventory_business_category_rule_user,Journal Item read by effective business category for inventory user,account.model_account_move_line,"[('company_id','in',user.company_ids.ids),('move_id.inventory_business_category_id','in',user.effective_business_category_ids.ids)]",stock.group_stock_user,1,0,0,0
|
||||
account_move_line_inventory_business_category_rule_manager,Journal Item access for inventory manager in effective business category,account.model_account_move_line,"[('company_id','in',user.company_ids.ids),('move_id.inventory_business_category_id','in',user.effective_business_category_ids.ids)]",stock.group_stock_manager,1,1,1,1
|
||||
account_move_line_inventory_business_category_rule_sysadmin,Journal Item access for system admin in effective business category,account.model_account_move_line,"[('company_id','in',user.company_ids.ids),('move_id.inventory_business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
product_template_business_category_rule_user,Product Template by effective business category,product.model_product_template,"[('business_category_id.company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_user,1,1,1,1
|
||||
product_template_business_category_rule_sysadmin,Product Template full access for system admin,product.model_product_template,"[(1,'=',1)]",base.group_system,1,1,1,1
|
||||
product_template_business_category_rule_sysadmin,Product Template access for system admin in effective business category,product.model_product_template,"[('business_category_id.company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
product_product_business_category_rule_user,Product Variant by effective business category,product.model_product_product,"[('business_category_id.company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_user,1,1,1,1
|
||||
product_product_business_category_rule_sysadmin,Product Variant full access for system admin,product.model_product_product,"[(1,'=',1)]",base.group_system,1,1,1,1
|
||||
product_product_business_category_rule_sysadmin,Product Variant access for system admin in effective business category,product.model_product_product,"[('business_category_id.company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
stock_quant_business_category_rule_user,Stock Quant by effective business category,stock.model_stock_quant,"[('company_id','in',user.company_ids.ids),('product_id.business_category_id','in',user.effective_business_category_ids.ids)]",stock.group_stock_user,1,0,0,0
|
||||
stock_quant_business_category_rule_manager,Stock Quant access for inventory manager in effective business category,stock.model_stock_quant,"[('company_id','in',user.company_ids.ids),('product_id.business_category_id','in',user.effective_business_category_ids.ids)]",stock.group_stock_manager,1,1,1,1
|
||||
stock_quant_business_category_rule_sysadmin,Stock Quant full access for system admin,stock.model_stock_quant,"[(1,'=',1)]",base.group_system,1,1,1,1
|
||||
stock_quant_business_category_rule_sysadmin,Stock Quant access for system admin in effective business category,stock.model_stock_quant,"[('company_id','in',user.company_ids.ids),('product_id.business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
|
||||
|
@@ -10,7 +10,7 @@ for purchasing transactions.
|
||||
"author": "PT Gagak Rimang Teknologi",
|
||||
"website": "https://rimang.id",
|
||||
"category": "Purchases",
|
||||
"version": "14.0.1.1.0",
|
||||
"version": "14.0.1.2.0",
|
||||
"depends": [
|
||||
"purchase",
|
||||
"account",
|
||||
|
||||
@@ -2,13 +2,16 @@ id,name,model_id:id,domain_force,groups:id,perm_read,perm_write,perm_create,perm
|
||||
purchase_order_business_category_rule_user_read_create,Purchase Order read/create by effective business category,purchase.model_purchase_order,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",purchase.group_purchase_user,1,0,1,0
|
||||
purchase_order_business_category_rule_user_write_own,Purchase Order write own by effective business category,purchase.model_purchase_order,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids),'|',('user_id','=',user.id),('create_uid','=',user.id)]",purchase.group_purchase_user,0,1,0,1
|
||||
purchase_order_business_category_rule_manager,Purchase Order full access for purchase manager in effective business category,purchase.model_purchase_order,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",purchase.group_purchase_manager,1,1,1,1
|
||||
purchase_order_business_category_rule_sysadmin,Purchase Order full access for system admin,purchase.model_purchase_order,"[('company_id','in',user.company_ids.ids)]",base.group_system,1,1,1,1
|
||||
purchase_order_business_category_rule_sysadmin,Purchase Order access for system admin in effective business category,purchase.model_purchase_order,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
purchase_team_business_category_rule_user,Purchase Team read by effective business category,model_purchase_team,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",purchase.group_purchase_user,1,0,0,0
|
||||
purchase_team_business_category_rule_manager,Purchase Team full access for purchase manager in effective business category,model_purchase_team,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",purchase.group_purchase_manager,1,1,1,1
|
||||
purchase_team_business_category_rule_sysadmin,Purchase Team full access for system admin,model_purchase_team,"[('company_id','in',user.company_ids.ids)]",base.group_system,1,1,1,1
|
||||
purchase_team_business_category_rule_sysadmin,Purchase Team access for system admin in effective business category,model_purchase_team,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
crm_business_category_rule_purchase_user,Business Category by user effective list for purchase user,grt_business_category_base.model_crm_business_category,"[('company_id','in',user.company_ids.ids),('id','in',user.effective_business_category_ids.ids)]",purchase.group_purchase_user,1,0,0,0
|
||||
crm_business_category_rule_purchase_manager,Business Category access for purchase manager in effective business category,grt_business_category_base.model_crm_business_category,"[('company_id','in',user.company_ids.ids),('id','in',user.effective_business_category_ids.ids)]",purchase.group_purchase_manager,1,1,1,1
|
||||
crm_business_category_rule_purchase_sysadmin,Business Category access for system admin in effective business category,grt_business_category_base.model_crm_business_category,"[('company_id','in',user.company_ids.ids),('id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
account_move_purchase_business_category_rule_user,Vendor Bill read by effective business category for purchase user,account.model_account_move,"[('company_id','in',user.company_ids.ids),('purchase_business_category_id','in',user.effective_business_category_ids.ids)]",purchase.group_purchase_user,1,0,0,0
|
||||
account_move_purchase_business_category_rule_manager,Vendor Bill access for purchase manager in effective business category,account.model_account_move,"[('company_id','in',user.company_ids.ids),('purchase_business_category_id','in',user.effective_business_category_ids.ids)]",purchase.group_purchase_manager,1,1,1,1
|
||||
account_move_purchase_business_category_rule_sysadmin,Vendor Bill access for system admin in effective business category,account.model_account_move,"[('company_id','in',user.company_ids.ids),('purchase_business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
account_move_line_purchase_business_category_rule_user,Journal Item read by effective business category for purchase user,account.model_account_move_line,"[('company_id','in',user.company_ids.ids),('move_id.purchase_business_category_id','in',user.effective_business_category_ids.ids)]",purchase.group_purchase_user,1,0,0,0
|
||||
account_move_line_purchase_business_category_rule_manager,Journal Item access for purchase manager in effective business category,account.model_account_move_line,"[('company_id','in',user.company_ids.ids),('move_id.purchase_business_category_id','in',user.effective_business_category_ids.ids)]",purchase.group_purchase_manager,1,1,1,1
|
||||
account_move_line_purchase_business_category_rule_sysadmin,Journal Item access for system admin in effective business category,account.model_account_move_line,"[('company_id','in',user.company_ids.ids),('move_id.purchase_business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
|
||||
|
@@ -9,7 +9,7 @@ plus a two-step approval flow: Sales Team Leader then Accounting Manager.
|
||||
"author": "PT Gagak Rimang Teknologi",
|
||||
"website": "https://rimang.id",
|
||||
"category": "Sales/Sales",
|
||||
"version": "14.0.1.2.2",
|
||||
"version": "14.0.1.3.0",
|
||||
"depends": [
|
||||
"sale_management",
|
||||
"sale_crm",
|
||||
@@ -25,6 +25,7 @@ plus a two-step approval flow: Sales Team Leader then Accounting Manager.
|
||||
"security/security.xml",
|
||||
"security/ir.model.access.csv",
|
||||
"security/ir.rule.csv",
|
||||
"security/sale_base_rule_overrides.xml",
|
||||
"views/customer_behavior_dashboard_views.xml",
|
||||
"views/customer_behavior_recompute_wizard_views.xml",
|
||||
"views/customer_behavior_segment_views.xml",
|
||||
|
||||
@@ -2,19 +2,27 @@ id,name,model_id:id,domain_force,groups:id,perm_read,perm_write,perm_create,perm
|
||||
sale_order_business_category_rule_user_read_create,Sale Order read/create by effective business category,sale.model_sale_order,"[('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_salesman,1,0,1,0
|
||||
sale_order_business_category_rule_user_write_own,Sale Order write own by effective business category,sale.model_sale_order,"[('business_category_id','in',user.effective_business_category_ids.ids),'|',('user_id','=',user.id),('create_uid','=',user.id)]",sales_team.group_sale_salesman,0,1,0,1
|
||||
sale_order_business_category_rule_manager,Sale Order full access for sales manager in effective business category,sale.model_sale_order,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_manager,1,1,1,1
|
||||
sale_order_business_category_rule_sysadmin,Sale Order full access for system admin,sale.model_sale_order,"[(1,'=',1)]",base.group_system,1,1,1,1
|
||||
sale_order_business_category_rule_sysadmin,Sale Order access for system admin in effective business category,sale.model_sale_order,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
crm_team_business_category_rule_sales_user,CRM Team read by effective business category for sales user,sales_team.model_crm_team,"[('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_salesman,1,0,0,0
|
||||
crm_team_business_category_rule_sales_manager,CRM Team full access for sales manager in effective business category,sales_team.model_crm_team,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_manager,1,1,1,1
|
||||
crm_team_business_category_rule_sales_sysadmin,CRM Team access for system admin in effective business category,sales_team.model_crm_team,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
crm_business_category_rule_sales_user,Business Category by user effective list for sales user,grt_business_category_base.model_crm_business_category,"[('id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_salesman,1,0,0,0
|
||||
crm_business_category_rule_sales_manager,Business Category access for sales manager in effective business category,grt_business_category_base.model_crm_business_category,"[('company_id','in',user.company_ids.ids),('id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_manager,1,1,1,1
|
||||
crm_business_category_rule_sales_sysadmin,Business Category access for system admin in effective business category,grt_business_category_base.model_crm_business_category,"[('company_id','in',user.company_ids.ids),('id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
customer_behavior_analysis_rule_sales_user,Customer Behavior Analysis by effective business category,model_customer_behavior_analysis,"[('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_salesman,1,0,0,0
|
||||
customer_behavior_analysis_rule_sales_manager,Customer Behavior Analysis full access for sales manager in effective business category,model_customer_behavior_analysis,"[('business_category_id.company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_manager,1,1,1,1
|
||||
customer_behavior_analysis_rule_sales_sysadmin,Customer Behavior Analysis access for system admin in effective business category,model_customer_behavior_analysis,"[('business_category_id.company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
account_move_business_category_rule_sales_user,Invoice read by effective business category for sales user,account.model_account_move,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_salesman,1,0,0,0
|
||||
account_move_business_category_rule_sales_manager,Invoice access for sales manager in effective business category,account.model_account_move,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_manager,1,1,1,1
|
||||
account_move_business_category_rule_sales_sysadmin,Invoice access for system admin in effective business category,account.model_account_move,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
account_payment_business_category_rule_sales_user,Payment read by effective business category for sales user,account.model_account_payment,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_salesman,1,0,0,0
|
||||
account_payment_business_category_rule_sales_manager,Payment access for sales manager in effective business category,account.model_account_payment,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_manager,1,1,1,1
|
||||
account_payment_business_category_rule_sales_sysadmin,Payment access for system admin in effective business category,account.model_account_payment,"[('company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
account_move_line_business_category_rule_sales_user,Journal Item read by effective business category for sales user,account.model_account_move_line,"[('company_id','in',user.company_ids.ids),('move_id.business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_salesman,1,0,0,0
|
||||
account_move_line_business_category_rule_sales_manager,Journal Item access for sales manager in effective business category,account.model_account_move_line,"[('company_id','in',user.company_ids.ids),('move_id.business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_manager,1,1,1,1
|
||||
account_move_line_business_category_rule_sales_sysadmin,Journal Item access for system admin in effective business category,account.model_account_move_line,"[('company_id','in',user.company_ids.ids),('move_id.business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
customer_behavior_config_rule_sales_manager,Customer Behavior Config access by effective business category,model_customer_behavior_config,"[('business_category_id.company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_manager,1,1,1,1
|
||||
customer_behavior_config_rule_sales_sysadmin,Customer Behavior Config access by effective business category for system admin,model_customer_behavior_config,"[('business_category_id.company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
customer_behavior_segment_rule_sales_user,Customer Behavior Segment read by effective business category,model_customer_behavior_segment,"[('business_category_id.company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_salesman,1,0,0,0
|
||||
customer_behavior_segment_rule_sales_manager,Customer Behavior Segment access by effective business category,model_customer_behavior_segment,"[('business_category_id.company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_manager,1,1,1,1
|
||||
customer_behavior_segment_rule_sales_sysadmin,Customer Behavior Segment access by effective business category for system admin,model_customer_behavior_segment,"[('business_category_id.company_id','in',user.company_ids.ids),('business_category_id','in',user.effective_business_category_ids.ids)]",base.group_system,1,1,1,1
|
||||
|
||||
|
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<!-- Disable permissive default sales rules to enforce strict business-category isolation. -->
|
||||
<record id="sale.sale_order_see_all" model="ir.rule">
|
||||
<field name="active" eval="0"/>
|
||||
</record>
|
||||
|
||||
<record id="sale.sale_order_personal_rule" model="ir.rule">
|
||||
<field name="active" eval="0"/>
|
||||
</record>
|
||||
</odoo>
|
||||
@@ -2,12 +2,13 @@
|
||||
{
|
||||
"name": "Odoo KPI CRM Trigger",
|
||||
"summary": "CRM event rules to send KPI values by assignment",
|
||||
"version": "14.0.1.0.0",
|
||||
"version": "14.0.1.1.0",
|
||||
"category": "Sales/CRM",
|
||||
"author": "Custom",
|
||||
"depends": ["crm", "mail", "hr", "odoo_kpi", "grt_crm_business_category"],
|
||||
"data": [
|
||||
"security/ir.model.access.csv",
|
||||
"security/ir.rule.csv",
|
||||
"views/kpi_crm_trigger_rule_views.xml",
|
||||
],
|
||||
"installable": True,
|
||||
|
||||
@@ -151,6 +151,13 @@ class KpiCrmTriggerRuleLine(models.Model):
|
||||
rule_id = fields.Many2one("kpi.crm.trigger.rule", required=True, ondelete="cascade", index=True)
|
||||
sequence = fields.Integer(default=10)
|
||||
active = fields.Boolean(default=True)
|
||||
business_category_id = fields.Many2one(
|
||||
"crm.business.category",
|
||||
related="rule_id.business_category_id",
|
||||
store=True,
|
||||
readonly=True,
|
||||
index=True,
|
||||
)
|
||||
stage_id = fields.Many2one("crm.stage", string="Stage")
|
||||
activity_type_id = fields.Many2one("mail.activity.type", string="Activity Type")
|
||||
employee_id = fields.Many2one(
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
id,name,model_id:id,domain_force,groups:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
kpi_crm_trigger_rule_category_kpi_manager,KPI CRM Trigger Rule by effective business category (KPI Manager),model_kpi_crm_trigger_rule,"[('business_category_id','in',user.effective_business_category_ids.ids)]",odoo_kpi.group_kpi_manager,1,1,1,1
|
||||
kpi_crm_trigger_rule_category_kpi_admin,KPI CRM Trigger Rule by effective business category (KPI Admin),model_kpi_crm_trigger_rule,"[('business_category_id','in',user.effective_business_category_ids.ids)]",odoo_kpi.group_kpi_admin,1,1,1,1
|
||||
kpi_crm_trigger_rule_category_sale_manager,KPI CRM Trigger Rule by effective business category (Sales Manager),model_kpi_crm_trigger_rule,"[('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_manager,1,1,1,1
|
||||
kpi_crm_trigger_rule_line_category_kpi_manager,KPI CRM Trigger Rule Line by effective business category (KPI Manager),model_kpi_crm_trigger_rule_line,"[('business_category_id','in',user.effective_business_category_ids.ids)]",odoo_kpi.group_kpi_manager,1,1,1,1
|
||||
kpi_crm_trigger_rule_line_category_kpi_admin,KPI CRM Trigger Rule Line by effective business category (KPI Admin),model_kpi_crm_trigger_rule_line,"[('business_category_id','in',user.effective_business_category_ids.ids)]",odoo_kpi.group_kpi_admin,1,1,1,1
|
||||
kpi_crm_trigger_rule_line_category_sale_manager,KPI CRM Trigger Rule Line by effective business category (Sales Manager),model_kpi_crm_trigger_rule_line,"[('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_manager,1,1,1,1
|
||||
|
@@ -2,12 +2,13 @@
|
||||
{
|
||||
"name": "Odoo KPI Customer Behavior Trigger",
|
||||
"summary": "Customer behavior event rules to send KPI values by assignment",
|
||||
"version": "14.0.1.0.0",
|
||||
"version": "14.0.1.1.0",
|
||||
"category": "Sales/Sales",
|
||||
"author": "Custom",
|
||||
"depends": ["sale_management", "hr", "odoo_kpi", "grt_sales_business_category"],
|
||||
"data": [
|
||||
"security/ir.model.access.csv",
|
||||
"security/ir.rule.csv",
|
||||
"views/kpi_customer_behavior_trigger_rule_views.xml",
|
||||
],
|
||||
"installable": True,
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
id,name,model_id:id,domain_force,groups:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
kpi_customer_behavior_trigger_rule_category_kpi_manager,KPI Customer Behavior Trigger Rule by effective business category (KPI Manager),model_kpi_customer_behavior_trigger_rule,"[('business_category_id','in',user.effective_business_category_ids.ids)]",odoo_kpi.group_kpi_manager,1,1,1,1
|
||||
kpi_customer_behavior_trigger_rule_category_kpi_admin,KPI Customer Behavior Trigger Rule by effective business category (KPI Admin),model_kpi_customer_behavior_trigger_rule,"[('business_category_id','in',user.effective_business_category_ids.ids)]",odoo_kpi.group_kpi_admin,1,1,1,1
|
||||
kpi_customer_behavior_trigger_rule_category_sale_manager,KPI Customer Behavior Trigger Rule by effective business category (Sales Manager),model_kpi_customer_behavior_trigger_rule,"[('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_manager,1,1,1,1
|
||||
kpi_customer_behavior_trigger_rule_line_category_kpi_manager,KPI Customer Behavior Trigger Rule Line by effective business category (KPI Manager),model_kpi_customer_behavior_trigger_rule_line,"[('business_category_id','in',user.effective_business_category_ids.ids)]",odoo_kpi.group_kpi_manager,1,1,1,1
|
||||
kpi_customer_behavior_trigger_rule_line_category_kpi_admin,KPI Customer Behavior Trigger Rule Line by effective business category (KPI Admin),model_kpi_customer_behavior_trigger_rule_line,"[('business_category_id','in',user.effective_business_category_ids.ids)]",odoo_kpi.group_kpi_admin,1,1,1,1
|
||||
kpi_customer_behavior_trigger_rule_line_category_sale_manager,KPI Customer Behavior Trigger Rule Line by effective business category (Sales Manager),model_kpi_customer_behavior_trigger_rule_line,"[('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_manager,1,1,1,1
|
||||
|
@@ -2,12 +2,13 @@
|
||||
{
|
||||
"name": "Odoo KPI Sales Trigger",
|
||||
"summary": "Sales event rules to send KPI values by assignment",
|
||||
"version": "14.0.1.0.2",
|
||||
"version": "14.0.1.1.0",
|
||||
"category": "Sales/Sales",
|
||||
"author": "Custom",
|
||||
"depends": ["sale_management", "account", "hr", "odoo_kpi", "grt_sales_business_category"],
|
||||
"data": [
|
||||
"security/ir.model.access.csv",
|
||||
"security/ir.rule.csv",
|
||||
"views/kpi_sales_trigger_rule_views.xml",
|
||||
],
|
||||
"installable": True,
|
||||
|
||||
@@ -106,6 +106,13 @@ class KpiSalesTriggerRuleLine(models.Model):
|
||||
rule_id = fields.Many2one("kpi.sales.trigger.rule", required=True, ondelete="cascade", index=True)
|
||||
sequence = fields.Integer(default=10)
|
||||
active = fields.Boolean(default=True)
|
||||
business_category_id = fields.Many2one(
|
||||
"crm.business.category",
|
||||
related="rule_id.business_category_id",
|
||||
store=True,
|
||||
readonly=True,
|
||||
index=True,
|
||||
)
|
||||
employee_id = fields.Many2one(
|
||||
"hr.employee",
|
||||
related="assignment_id.employee_id",
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
id,name,model_id:id,domain_force,groups:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
kpi_sales_trigger_rule_category_kpi_manager,KPI Sales Trigger Rule by effective business category (KPI Manager),model_kpi_sales_trigger_rule,"[('business_category_id','in',user.effective_business_category_ids.ids)]",odoo_kpi.group_kpi_manager,1,1,1,1
|
||||
kpi_sales_trigger_rule_category_kpi_admin,KPI Sales Trigger Rule by effective business category (KPI Admin),model_kpi_sales_trigger_rule,"[('business_category_id','in',user.effective_business_category_ids.ids)]",odoo_kpi.group_kpi_admin,1,1,1,1
|
||||
kpi_sales_trigger_rule_category_sale_manager,KPI Sales Trigger Rule by effective business category (Sales Manager),model_kpi_sales_trigger_rule,"[('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_manager,1,1,1,1
|
||||
kpi_sales_trigger_rule_line_category_kpi_manager,KPI Sales Trigger Rule Line by effective business category (KPI Manager),model_kpi_sales_trigger_rule_line,"[('business_category_id','in',user.effective_business_category_ids.ids)]",odoo_kpi.group_kpi_manager,1,1,1,1
|
||||
kpi_sales_trigger_rule_line_category_kpi_admin,KPI Sales Trigger Rule Line by effective business category (KPI Admin),model_kpi_sales_trigger_rule_line,"[('business_category_id','in',user.effective_business_category_ids.ids)]",odoo_kpi.group_kpi_admin,1,1,1,1
|
||||
kpi_sales_trigger_rule_line_category_sale_manager,KPI Sales Trigger Rule Line by effective business category (Sales Manager),model_kpi_sales_trigger_rule_line,"[('business_category_id','in',user.effective_business_category_ids.ids)]",sales_team.group_sale_manager,1,1,1,1
|
||||
|
Reference in New Issue
Block a user