Commit fca6cf09 by Owo Sugiana

Tambah tab Bantuan bagi Kepala Keluarga

1 parent cf9430e3
2023-06-23
----------
- Tambah kolaborasi
2023-06-19
----------
- Tambah field Nama Panggilan
- Tambah field Pekerjaan
- Tambah field Agama
2023-06-16
----------
- Kali pertama
Catat Warga
===========
Modul Odoo untuk pencatatan warga. Aplikasi digunakan oleh pengurus RT.
Ini adalah modul Odoo untuk pencatatan warga. Aplikasi ini digunakan oleh
pengurus RT.
Fitur
-----
Berikut fiturnya:
1. Konsepnya seperti Google Drive yaitu memungkinkan lokasi yang sama (RT, RW,
1. Konsepnya seperti Google Docs yaitu memungkinkan lokasi yang sama (RT, RW,
hingga provinsi yang sama) dibuat oleh user A dan B. Dengan begitu sebuah
server dapat digunakan secara luas se-Indonesia.
2. Setiap user bisa membuat beberapa lokasi.
3. Pendaftaran menggunakan teknik undangan. User A klik menu Undangan dan
masukkan nama serta email calon user. Kemudian sistem akan mengirim tautan
unik untuk pendaftaran.
4. User A bisa memberi hak akses ke user B sebagai editor.
Tabel Referensi
---------------
Tabel referensi seperti Hubungan Keluarga, Agama, atau Jenis Bantuan melekat
di setiap "dokumen" (baca: dokumen RT). Misalkan user A menambahkan jenis
bantuan Pakaian di RT 7 maka pilihan tersebut tidak tampak di RT 2 meskipun ia
yang membuatnya.
TODO
----
Rencana berikutnya:
1. User A bisa memberi hak akses ke user B sebagai *pembaca* atau *pengubah*
data warga.
2. Ekspor ke CSV
1. Ekspor ke CSV
2. Impor dari CSV
3. Manajemen iuran
from . import (
res_company,
partner_religion,
hubungan_keluarga,
jenis_bantuan,
res_partner,
)
from odoo import (
models,
fields,
api,
)
class HubunganKeluarga(models.Model):
_name = 'hubungan.keluarga'
_order = 'name'
_description = 'Hubungan Keluarga'
partner_id = fields.Many2one('res.partner', ondelete='cascade')
name = fields.Char(string='Hubungan Keluarga', required=True)
_sql_constraints = [
('unique_name', 'UNIQUE (partner_id, name)',
'Nama hubungan keluarga harus unik')]
@api.model
def create(self, vals): # Override
if not vals.get('partner_id'):
vals['partner_id'] = self.env.context.get('root_partner_id')
return super().create(vals)
from odoo import (
models,
fields,
api,
)
class JenisBantuan(models.Model):
_name = 'jenis.bantuan'
_description = 'Jenis Bantuan'
partner_id = fields.Many2one(
'res.partner', required=True, ondelete='cascade')
name = fields.Char(string='Jenis Bantuan', required=True)
_sql_constraints = [
('unique_name', 'UNIQUE (partner_id, name)',
'Nama jenis bantuan harus unik')]
@api.model
def create(self, vals): # Override
if not vals.get('partner_id'):
vals['partner_id'] = self.env.context.get('root_partner_id')
return super().create(vals)
from odoo import (
models,
fields,
api,
)
# https://github.com/open-synergy/opnsynid-partner-contact/tree/8.0/partner_contact_religion/models
class PartnerReligion(models.Model):
_name = 'partner.religion'
_order = 'id'
_description = 'Agama'
partner_id = fields.Many2one('res.partner', ondelete='cascade')
name = fields.Char(string='Religion', required=True)
_sql_constraints = [
('unique_name', 'UNIQUE (partner_id, name)',
'Nama agama harus unik')]
@api.model
def create(self, vals): # Override
if not vals.get('partner_id'):
vals['partner_id'] = self.env.context.get('root_partner_id')
return super().create(vals)
......@@ -18,6 +18,9 @@ RELIGIONS = [
'Islam', 'Kristen', 'Katholik', 'Hindu', 'Budha', 'Konghucu',
'Kepercayaan Lain']
JENIS_BANTUAN = [
'Sembako', 'Pendidikan', 'Makanan Sehat', 'Perbaikan Rumah', 'BPJS']
ERR_NIK = ValidationError(f'NIK harus 16 angka')
......@@ -34,29 +37,6 @@ def nik_validation(val):
raise ERR_NIK
class HubunganKeluarga(models.Model):
_name = 'hubungan.keluarga'
_order = 'name'
_description = 'Hubungan Keluarga'
name = fields.Char(string='Hubungan Keluarga', required=True)
_sql_constraints = [
('unique_name', 'UNIQUE (create_uid, name)', 'Nama harus unik')]
# https://github.com/open-synergy/opnsynid-partner-contact/tree/8.0/partner_contact_religion/models
class PartnerReligion(models.Model):
_name = 'partner.religion'
_order = 'id'
_description = 'Agama'
name = fields.Char(string='Religion', required=True)
_sql_constraints = [
('unique_name', 'UNIQUE (create_uid, name)', 'Nama harus unik')]
class Kolaborasi(models.Model):
_name = 'partner.kolaborasi'
_description = 'Kolaborasi Warga'
......@@ -124,6 +104,23 @@ class KolaborasiWizard(models.TransientModel):
self.env['partner.kolaborasi'].sudo().create(d)
class Bantuan(models.Model):
_name = 'partner.bantuan'
_description = 'Layak Dibantu'
partner_id = fields.Many2one(
'res.partner', required=True, ondelete='cascade')
bantuan_id = fields.Many2one(
'jenis.bantuan', required=True, ondelete='cascade')
# Isinya partner_id.parent_id, digunakan sebagai ID RT saat INSERT tabel
# jenis_bantuan.
root_partner_id = fields.Many2one(
'res.partner', required=True, ondelete='cascade')
_sql_constraints = [
('unique', 'UNIQUE (partner_id, bantuan_id)', 'Bantuan harus unik')]
class Partner(models.Model):
_inherit = 'res.partner'
......@@ -161,7 +158,9 @@ class Partner(models.Model):
kolaborasi_ids = fields.One2many('partner.kolaborasi', 'partner_id')
# RT
root_partner_id = fields.Many2one('res.partner')
bantuan_ids = fields.One2many('partner.bantuan', 'partner_id')
# Tombol Tambah di Tab Kolaborasi
def action_kolaborasi(self):
return {
'type': 'ir.actions.act_window',
......@@ -172,22 +171,14 @@ class Partner(models.Model):
'context': {
'default_partner_id': self.id}}
def _create_hubungan_keluarga(self):
# Buat daftar Hubungan Keluarga
def _create_hubungan_keluarga(self, partner):
for name in HUBUNGAN_KELUARGA:
res = self.env['hubungan.keluarga'].search(
[('name', '=', name)], limit=1)
if not res:
d = dict(name=name)
d = dict(partner_id=partner.id, name=name)
self.env['hubungan.keluarga'].create(d)
def _create_religion(self):
# Buat daftar Agama
def _create_religion(self, partner):
for name in RELIGIONS:
res = self.env['partner.religion'].search(
[('name', '=', name)], limit=1)
if not res:
d = dict(name=name)
d = dict(partner_id=partner.id, name=name)
self.env['partner.religion'].create(d)
def _create_kolaborasi_pemilik(self, partner):
......@@ -205,6 +196,11 @@ class Partner(models.Model):
status=k.status)
self.env['partner.kolaborasi'].sudo().create(d)
def _create_jenis_bantuan(self, partner):
for name in JENIS_BANTUAN:
d = dict(partner_id=partner.id, name=name)
self.env['jenis.bantuan'].create(d)
@api.model
def create(self, vals): # Overrride
hk = vals.get('hubungan_keluarga')
......@@ -226,9 +222,10 @@ class Partner(models.Model):
if self.env.ref('warga.res_partner_category_warga_rt') == \
res.category_id:
# Sebagai institusi RT
self._create_hubungan_keluarga()
self._create_religion()
self._create_hubungan_keluarga(res)
self._create_religion(res)
self._create_kolaborasi_pemilik(res)
self._create_jenis_bantuan(res)
else:
# Sebagai warga
self._create_kolaborasi_semua(res)
......
......@@ -5,3 +5,5 @@ access_hubungan_keluarga,access_hubungan_keluarga,model_hubungan_keluarga,base.g
access_partner_religion,access_partner_religion,model_partner_religion,base.group_user,1,1,1,1
access_partner_kolaborasi,access_partner_kolaborasi,model_partner_kolaborasi,base.group_user,1,0,0,0
access_kolaborasi_wizard,access_kolaborasi_wizard,model_kolaborasi_wizard,base.group_user,1,1,1,0
access_jenis_bantuan,access_jenis_bantuan,model_jenis_bantuan,base.group_user,1,1,1,1
access_partner_bantuan,access_partner_bantuan,model_partner_bantuan,base.group_user,1,1,1,1
......@@ -15,16 +15,9 @@
</field>
<field name="groups" eval="[Command.link(ref('warga.group_warga'))]"/>
</record>
<record model="ir.rule" id="akses_hubungan_keluarga">
<field name="name">Akses Hubungan Keluarga"</field>
<field name="model_id" ref="model_hubungan_keluarga"/>
<field name="domain_force">
[('create_uid', '=', user.id)]
</field>
</record>
<record model="ir.rule" id="akses_partner_religion">
<field name="name">Akses Agama</field>
<field name="model_id" ref="model_partner_religion"/>
<record model="ir.rule" id="akses_jenis_bantuan">
<field name="name">Akses Jenis Bantuan</field>
<field name="model_id" ref="model_jenis_bantuan"/>
<field name="domain_force">
[('create_uid', '=', user.id)]
</field>
......
......@@ -65,7 +65,7 @@
<field name="street" string="Jalan / No."/>
<field name="mobile"/>
</tree>
<form string="Kepala Keluarga">
<form>
<field name="parent_id" invisible="1"/>
<field name="type" invisible="1"/>
<field name="city" invisible="1"/>
......@@ -83,7 +83,9 @@
<field name="phone" widget="phone"/>
<field name="nationality_id"/>
<field name="function" string="Pekerjaan"/>
<field name="religion_id"/>
<field name="religion_id" domain="[('partner_id', '=', parent_id)]"
context="{'root_partner_id': parent_id}"
attrs="{'invisible': [('parent_id', '=', False)]}"/>
</group>
<group>
<label for="street" string="Alamat"/>
......@@ -102,7 +104,7 @@
</div>
</group>
</group>
<notebook colspan="2">
<notebook colspan="3">
<page string="Anggota Keluarga">
<field name="child_ids" context="{'default_parent_id': active_id,
'default_category_id': [3],
......@@ -116,7 +118,8 @@
'default_kelurahan_id': kelurahan_id,
'default_rw': rw, 'default_rt': rt,
'default_zip': zip,
'default_religion_id': religion_id}">
'default_religion_id': religion_id,
'default_root_partner_id': parent_id}">
<tree>
<field name="name"/>
<field name="ref" string="Panggilan"/>
......@@ -126,6 +129,7 @@
<field name="mobile"/>
</tree>
<form>
<field name="root_partner_id" invisible="1"/>
<field name="parent_id" invisible="1"/>
<field name="type" invisible="1"/>
<field name="city" invisible="1"/>
......@@ -137,13 +141,21 @@
<field name="gender"/>
<field name="birthdate_date" placeholder="17-8-1945"/>
<field name="age" attrs="{'invisible': [('birthdate_date', '=', False)]}"/>
<field name="hubungan_keluarga_id" domain="[('name', '!=', 'Kepala Keluarga')]"/>
<field name="hubungan_keluarga_id"
domain="[
('partner_id', '=', root_partner_id),
('name', '!=', 'Kepala Keluarga')]"
context="{'root_partner_id': root_partner_id}"
attrs="{'invisible': [('root_partner_id', '=', False)]}"/>
<field name="mobile" widget="phone"/>
<field name="email" widget="email"/>
<field name="phone" widget="phone"/>
<field name="nationality_id"/>
<field name="function" string="Pekerjaan"/>
<field name="religion_id"/>
<field name="religion_id"
domain="[('partner_id', '=', root_partner_id)]"
context="{'root_partner_id': root_partner_id}"
attrs="{'invisible': [('root_partner_id', '=', False)]}"/>
</group>
<group>
<label for="rt" string="Alamat"/>
......@@ -166,7 +178,26 @@
</field>
</page>
<page string="Catatan">
<field name="comment" placeholder="Tulis hal menarik"/>
<field name="comment"
placeholder="Tulis hal menarik tentang keluarga ini"/>
</page>
<page string="Layak Dibantu"
attrs="{'invisible': [('parent_id', '=', False)]}">
<!--
partner_id = keluarga
root_partner_id = RT bila tabel jenis.bantuan ditambah
-->
<field name="bantuan_ids"
context="{'default_partner_id': active_id,
'default_root_partner_id': parent_id}">
<tree editable="bottom">
<field name="partner_id" invisible="1"/>
<field name="root_partner_id" invisible="1"/>
<field name="bantuan_id"
domain="[('partner_id', '=', root_partner_id)]"
context="{'root_partner_id': root_partner_id}"/>
</tree>
</field>
</page>
</notebook>
</form>
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!