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 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: 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 hingga provinsi yang sama) dibuat oleh user A dan B. Dengan begitu sebuah
server dapat digunakan secara luas se-Indonesia. server dapat digunakan secara luas se-Indonesia.
2. Setiap user bisa membuat beberapa lokasi. 2. Setiap user bisa membuat beberapa lokasi.
3. Pendaftaran menggunakan teknik undangan. User A klik menu Undangan dan 3. Pendaftaran menggunakan teknik undangan. User A klik menu Undangan dan
masukkan nama serta email calon user. Kemudian sistem akan mengirim tautan masukkan nama serta email calon user. Kemudian sistem akan mengirim tautan
unik untuk pendaftaran. 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: Rencana berikutnya:
1. User A bisa memberi hak akses ke user B sebagai *pembaca* atau *pengubah*
data warga. 1. Ekspor ke CSV
2. Ekspor ke CSV 2. Impor dari CSV
3. Manajemen iuran
from . import ( from . import (
res_company, res_company,
partner_religion,
hubungan_keluarga,
jenis_bantuan,
res_partner, 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 = [ ...@@ -18,6 +18,9 @@ RELIGIONS = [
'Islam', 'Kristen', 'Katholik', 'Hindu', 'Budha', 'Konghucu', 'Islam', 'Kristen', 'Katholik', 'Hindu', 'Budha', 'Konghucu',
'Kepercayaan Lain'] 'Kepercayaan Lain']
JENIS_BANTUAN = [
'Sembako', 'Pendidikan', 'Makanan Sehat', 'Perbaikan Rumah', 'BPJS']
ERR_NIK = ValidationError(f'NIK harus 16 angka') ERR_NIK = ValidationError(f'NIK harus 16 angka')
...@@ -34,29 +37,6 @@ def nik_validation(val): ...@@ -34,29 +37,6 @@ def nik_validation(val):
raise ERR_NIK 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): class Kolaborasi(models.Model):
_name = 'partner.kolaborasi' _name = 'partner.kolaborasi'
_description = 'Kolaborasi Warga' _description = 'Kolaborasi Warga'
...@@ -124,6 +104,23 @@ class KolaborasiWizard(models.TransientModel): ...@@ -124,6 +104,23 @@ class KolaborasiWizard(models.TransientModel):
self.env['partner.kolaborasi'].sudo().create(d) 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): class Partner(models.Model):
_inherit = 'res.partner' _inherit = 'res.partner'
...@@ -161,7 +158,9 @@ class Partner(models.Model): ...@@ -161,7 +158,9 @@ class Partner(models.Model):
kolaborasi_ids = fields.One2many('partner.kolaborasi', 'partner_id') kolaborasi_ids = fields.One2many('partner.kolaborasi', 'partner_id')
# RT # RT
root_partner_id = fields.Many2one('res.partner') root_partner_id = fields.Many2one('res.partner')
bantuan_ids = fields.One2many('partner.bantuan', 'partner_id')
# Tombol Tambah di Tab Kolaborasi
def action_kolaborasi(self): def action_kolaborasi(self):
return { return {
'type': 'ir.actions.act_window', 'type': 'ir.actions.act_window',
...@@ -172,23 +171,15 @@ class Partner(models.Model): ...@@ -172,23 +171,15 @@ class Partner(models.Model):
'context': { 'context': {
'default_partner_id': self.id}} 'default_partner_id': self.id}}
def _create_hubungan_keluarga(self): def _create_hubungan_keluarga(self, partner):
# Buat daftar Hubungan Keluarga
for name in HUBUNGAN_KELUARGA: for name in HUBUNGAN_KELUARGA:
res = self.env['hubungan.keluarga'].search( d = dict(partner_id=partner.id, name=name)
[('name', '=', name)], limit=1) self.env['hubungan.keluarga'].create(d)
if not res:
d = dict(name=name)
self.env['hubungan.keluarga'].create(d)
def _create_religion(self): def _create_religion(self, partner):
# Buat daftar Agama
for name in RELIGIONS: for name in RELIGIONS:
res = self.env['partner.religion'].search( d = dict(partner_id=partner.id, name=name)
[('name', '=', name)], limit=1) self.env['partner.religion'].create(d)
if not res:
d = dict(name=name)
self.env['partner.religion'].create(d)
def _create_kolaborasi_pemilik(self, partner): def _create_kolaborasi_pemilik(self, partner):
d = dict( d = dict(
...@@ -205,6 +196,11 @@ class Partner(models.Model): ...@@ -205,6 +196,11 @@ class Partner(models.Model):
status=k.status) status=k.status)
self.env['partner.kolaborasi'].sudo().create(d) 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 @api.model
def create(self, vals): # Overrride def create(self, vals): # Overrride
hk = vals.get('hubungan_keluarga') hk = vals.get('hubungan_keluarga')
...@@ -226,9 +222,10 @@ class Partner(models.Model): ...@@ -226,9 +222,10 @@ class Partner(models.Model):
if self.env.ref('warga.res_partner_category_warga_rt') == \ if self.env.ref('warga.res_partner_category_warga_rt') == \
res.category_id: res.category_id:
# Sebagai institusi RT # Sebagai institusi RT
self._create_hubungan_keluarga() self._create_hubungan_keluarga(res)
self._create_religion() self._create_religion(res)
self._create_kolaborasi_pemilik(res) self._create_kolaborasi_pemilik(res)
self._create_jenis_bantuan(res)
else: else:
# Sebagai warga # Sebagai warga
self._create_kolaborasi_semua(res) self._create_kolaborasi_semua(res)
......
...@@ -5,3 +5,5 @@ access_hubungan_keluarga,access_hubungan_keluarga,model_hubungan_keluarga,base.g ...@@ -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_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_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_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 @@ ...@@ -15,16 +15,9 @@
</field> </field>
<field name="groups" eval="[Command.link(ref('warga.group_warga'))]"/> <field name="groups" eval="[Command.link(ref('warga.group_warga'))]"/>
</record> </record>
<record model="ir.rule" id="akses_hubungan_keluarga"> <record model="ir.rule" id="akses_jenis_bantuan">
<field name="name">Akses Hubungan Keluarga"</field> <field name="name">Akses Jenis Bantuan</field>
<field name="model_id" ref="model_hubungan_keluarga"/> <field name="model_id" ref="model_jenis_bantuan"/>
<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"/>
<field name="domain_force"> <field name="domain_force">
[('create_uid', '=', user.id)] [('create_uid', '=', user.id)]
</field> </field>
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
<h1> <h1>
<field name="name" placeholder="Contoh: RT 7. Bisa juga nama cluster atau apartemen"/> <field name="name" placeholder="Contoh: RT 7. Bisa juga nama cluster atau apartemen"/>
</h1> </h1>
<field name="create_uid" invisible="1"/> <field name="create_uid" invisible="1"/>
<group> <group>
<group> <group>
<field name="street"/> <field name="street"/>
...@@ -65,7 +65,7 @@ ...@@ -65,7 +65,7 @@
<field name="street" string="Jalan / No."/> <field name="street" string="Jalan / No."/>
<field name="mobile"/> <field name="mobile"/>
</tree> </tree>
<form string="Kepala Keluarga"> <form>
<field name="parent_id" invisible="1"/> <field name="parent_id" invisible="1"/>
<field name="type" invisible="1"/> <field name="type" invisible="1"/>
<field name="city" invisible="1"/> <field name="city" invisible="1"/>
...@@ -83,7 +83,9 @@ ...@@ -83,7 +83,9 @@
<field name="phone" widget="phone"/> <field name="phone" widget="phone"/>
<field name="nationality_id"/> <field name="nationality_id"/>
<field name="function" string="Pekerjaan"/> <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>
<group> <group>
<label for="street" string="Alamat"/> <label for="street" string="Alamat"/>
...@@ -102,7 +104,7 @@ ...@@ -102,7 +104,7 @@
</div> </div>
</group> </group>
</group> </group>
<notebook colspan="2"> <notebook colspan="3">
<page string="Anggota Keluarga"> <page string="Anggota Keluarga">
<field name="child_ids" context="{'default_parent_id': active_id, <field name="child_ids" context="{'default_parent_id': active_id,
'default_category_id': [3], 'default_category_id': [3],
...@@ -116,7 +118,8 @@ ...@@ -116,7 +118,8 @@
'default_kelurahan_id': kelurahan_id, 'default_kelurahan_id': kelurahan_id,
'default_rw': rw, 'default_rt': rt, 'default_rw': rw, 'default_rt': rt,
'default_zip': zip, 'default_zip': zip,
'default_religion_id': religion_id}"> 'default_religion_id': religion_id,
'default_root_partner_id': parent_id}">
<tree> <tree>
<field name="name"/> <field name="name"/>
<field name="ref" string="Panggilan"/> <field name="ref" string="Panggilan"/>
...@@ -126,6 +129,7 @@ ...@@ -126,6 +129,7 @@
<field name="mobile"/> <field name="mobile"/>
</tree> </tree>
<form> <form>
<field name="root_partner_id" invisible="1"/>
<field name="parent_id" invisible="1"/> <field name="parent_id" invisible="1"/>
<field name="type" invisible="1"/> <field name="type" invisible="1"/>
<field name="city" invisible="1"/> <field name="city" invisible="1"/>
...@@ -137,13 +141,21 @@ ...@@ -137,13 +141,21 @@
<field name="gender"/> <field name="gender"/>
<field name="birthdate_date" placeholder="17-8-1945"/> <field name="birthdate_date" placeholder="17-8-1945"/>
<field name="age" attrs="{'invisible': [('birthdate_date', '=', False)]}"/> <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="mobile" widget="phone"/>
<field name="email" widget="email"/> <field name="email" widget="email"/>
<field name="phone" widget="phone"/> <field name="phone" widget="phone"/>
<field name="nationality_id"/> <field name="nationality_id"/>
<field name="function" string="Pekerjaan"/> <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>
<group> <group>
<label for="rt" string="Alamat"/> <label for="rt" string="Alamat"/>
...@@ -166,7 +178,26 @@ ...@@ -166,7 +178,26 @@
</field> </field>
</page> </page>
<page string="Catatan"> <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> </page>
</notebook> </notebook>
</form> </form>
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!