• Tidak ada hasil yang ditemukan

DASAR DASAR OPENERP SISI TEKNIKAL DAN CO

N/A
N/A
Protected

Academic year: 2018

Membagikan "DASAR DASAR OPENERP SISI TEKNIKAL DAN CO"

Copied!
231
0
0

Teks penuh

(1)

oleh: Noprianto Whisnu Budhysantika

Widoyo

"Beberapa kelebihan buku ini: ditulis oleh para programer dan praktisi yang bukan saja pernah mengimplementasi tapi juga memodifikasi OpenERP, ditujukan tidak hanya untuk Windows tapi juga

Linux, dan diterbitkan secara independen dan dengan lisensi terbuka. Disarankan dibaca."

Steven Haryanto

"OpenERP merupakan produk open source yang mudah dikembangkan dan konsisten. Meski begitu dukungannya cenderung komersil. Ini membuat developer pas-pasan seperti saya kesulitan mempelajarinya. Kita beruntung Noprianto dkk bersedia membuat buku yang cukup rinci ini

dihadirkan tanpa dipungut biaya."

Owo Sugiana

“Menemukan materi teknis yang ditulis dalam bahasa Indonesia bagaikan mencari jarum di dalam jerami. Bukan karena orang Indonesia tidak ada

yang pakar dalam hal teknis ini tapi lebih karena tidak ada yang mau, tidak sempat, atau tidak memiliki kemampuan menulis. Dan memang

menulis hal teknis dalam bahasa Indonesia memiliki tantangan tersendiri. Penulisan buku OpenERP dengan model terbuka dan sukarelawan ini patut diacungi jempol. Bagian studi kasus membantu memberikan gambaran kepada pembaca hal apa yang bisa diselesaikan menggunakan OpenERP. Bagi yang belum terbiasa dengan Python bisa mulai

dengan bagian lampiran Python Dasar. ”

Zaki Akhmad

(2)

TENTANG BUKU

DASAR-DASAR OPENERP: SISI TEKNIKAL DAN CONTOH KASUS (c) 2014 Noprianto, Whisnu Budhysantika, Widoyo

Revisi: 0 (27 Agustus 2014, publikasi sendiri)

Buku ini dapat dikopi dan disebarluaskan secara bebas, baik dalam bentuk softcopy ataupun tercetak, dengan beberapa catatan berikut:

• Buku ini diharapkan dapat berguna, namun tidak menggaransi apapun.

• Setiap halaman dalam buku ini merupakan satu kesatuan dan tidak terpisahkan.

• Apabila mengutip sebagian dari buku ini, cantumkanlah setidaknya judul buku, pengarang dan nomor revisi.

• Softcopy buku (dalam format OpenDocument dan PDF) tersedia bebas di https://github.com/id-python/buku-openerp

MEREK DAGANG

• Windows adalah merek dagang terdaftar dari Microsoft Corporation. • Python adalah merek dagang dari Python Software Foundation. • Linux adalah merek dagang terdaftar dari Linus Torvalds. • OpenERP adalah merek dagang dari OpenERP s.a.

KATA PENGANTAR

Pertama-tama, saya mengucapkan terima kasih kepada Whisnu Budhysantika dan Widoyo yang telah bersedia sama-sama menulis buku ini. Juga terima kasih kepada Owo Sugiana, Steven Haryanto, dan Zaki Akhmad yang telah bersedia memberikan pujian untuk buku ini.

Menulis buku, sebagai proyek komunitas, tanpa ada kejelasan akan diterbitkan, pastinya bukan pekerjaan yang menarik :) Perlu komitmen, terutama ketika ditengah proses penulisan, semua penerbit yang kami hubungi tidak tertarik. Kami memilih untuk terus menulis dan menyediakan bukunya secara bebas!

Buku ini dipersembahkan untuk komunitas Python Indonesia (http://www.python.or.id)

(3)

Daftar Isi

1. Memulai OpenERP...6

1.1 Instalasi...7

Instalasi di Microsoft Windows...7

Instalasi di distribusi Linux Ubuntu...8

1.2 Bekerja dengan database...11

Membuat database...11

Operasi lain...11

1.3 Settings dan technical features...12

1.4 Modul Sales Management...15

2. Dasar-Dasar Kustomisasi...19

2.1 Developer Mode...19

2.2 Menambah dan menampilkan field...22

Manage Views...22

Field baru...24

2.3 Menyembunyikan dan mengatur posisi field...26

2.4 Kelebihan dan kekurangan...27

Kelebihan...27

Kekurangan...27

3. Dasar Pengembangan Modul OpenERP...28

3.1 Paket Python...28

3.7 Mencari dari daftar modul...31

3.8 Langkah berikut...31

4. Kasus: Perusahaan Rental Kendaraan...33

4.1 Pendahuluan...33

(4)

5.3 Atribut...52

5.6 Model, tabel database dan field...63

5.7 Method...65

Bekerja dengan model lain...67

5.8 Mengakses OpenERP tanpa server dijalankan...68

5.9 Method: search...70

5.10 Method: read...72

5.11 Method: write...73

5.12 Method: create...74

5.13 Method: unlink...75

5.14 Program 5-1: menambah field...76

5.15 Program 5-2: readonly dan nilai default...79

5.16 Program 5-3: constraint...81

5.17 Program 5-4: field functional...84

5.18 Program 5-5: method create/write...86

6. Dasar-dasar View...87

6.1 Kerangka...87

6.2 Field pada model...89

6.3 Inheritance pada view...90

6.4 Form: mengatur ulang posisi field...92

6.5 Form: menambah field...94

6.6 Form: notebook dan group...97

(5)

6.8 Form: on change...103

6.9 Form: on change (2)...106

6.10 Tree: tambah/hapus field...108

6.11 Menuitem dan editable tree...110

7. Dasar-dasar Report...115

8.1 Pelajarilah source code OpenERP...134

8.2 Generate file konfigurasi...136

8.3 Lebih dari satu lokasi addons...137

8.4 Pustaka notation dan notasi prefix/postfix...138

8.5 Lisensi pada modul OpenERP...142

8.6 Perubahan pada file python dalam modul...144

8.7 Menampilkan pesan kesalahan...144

8.8 Format tanggal/waktu...145

9. Web Service dengan XML-RPC...146

9.1 ERP dan sistem berjalan...146

9.2 Membangun frontend sendiri...147

9.5 Program: pilih dan login ke database...157

9.6 Program: buat, update, baca, hapus...159

9.7 Program: melakukan pencarian...162

9.8 Program: laporan...166

9.9 Program: buat, ganti nama, kopi, hapus database...169

9.10 Program: dump dan restore database...172

(6)
(7)

1. Memulai OpenERP

Penulis: Whisnu Budhysantika

OpenERP (dulu bernama TinyERP, sekarang bernama Odoo) adalah sebuah perangkat lunak Enterprise Resource Planning (ERP) atau perangkat lunak perencanaan sumber daya perusahaan yang dilisensikan free/open source. OpenERP dikembangkan dengan bahasa pemrograman Python. Source code dan informasi selengkapnya tentang OpenERP bisa didapatkan di website http://www.openerp.com.

Perangkat lunak perencanaan sumber daya perusahaan akan memberikan manfaat yang besar kepada sebuah perusahaan dalam membantu mengelola sumber daya di sebuah perusahaan sehingga semua sumber daya yang dimiliki dapat tercatat, terkontrol dan dapat dengan mudah diberdayakan.

Sebagaimana lazimnya sistem aplikasi modern, arsitektur sistem pada OpenERP menerapkan sistem modular. Setiap adopsi terhadap kebutuhan baru dapat menghasilkan modul baru. Modul-modul tersebut bisa diinstall bila dibutuhkan. Saat ini tersedia ribuan modul, termasuk yang datang bersama OpenERP seperti:

(8)

OpenERP mengembangkan jaringan partnership dengan berbagai perusahaan di seluruh dunia untuk bersama-sama menjadi pelopor dalam pengembangan OpenERP serta menjadi ujung tombak customer support kepada pengguna OpenERP.

1.1 Instalasi

Server OpenERP dapat dijalankan pada berbagai sistem operasi populer, dan relatif tidak sulit untuk diinstal. Bahkan, pada sistem operasi Microsoft Windows, tersedia installer yang siap digunakan. Sementara, untuk client, hanya dibutuhkan web browser.

Berbagai komponen OpenERP, termasuk database, bisa diinstal pada satu server yang sama, ataupun dipisahkan ke beberapa server.

Installer ataupun source code OpenERP bisa didownload dari websitenya.

Instalasi di Microsoft Windows

Untuk menginstall OpenERP dan PostgreSQL, harus menggunakan user dengan hak Administrator.

(9)

Klik ganti pada file installer untuk menginstall OpenERP dan Accept semua parameter default, seperti pada contoh berikut.

1. Pilih Bahasa → English 2. Welcome Box

3. Licence Agreement

4. Pilih komponen yang akan diinstall (Pilih semua komponen)

5. Configure PostgreSQL → Hostname: localhost, Port: 5432, Username: openpg, Password: openpgpwd

6. Pilih Folder untuk lokasi instalasi 7. Install

8. Selesai

Setelah selesai proses instalasi, kita tidak perlu menjalankan server OpenERP secara manual, sebab telah terinstall sebagai service.

Untuk menggunakan OpenERP, bukalah web browser dan ketikkanlah URL server OpenERP, gunakan port 8069 (default), misal http://localhost: 8069

Beberapa catatan:

• Bila tampilan dari http://localhost:8069 kosong, maka cobalah untuk start dan stop service OpenERP dari Start → All Program → OpenERP Server.

• Periksa kembali konfigurasi OpenERP yang umumnya tersimpan di C:\Program Files\OpenERP All In One\openerp-server.conf. Bukalah filenya dan perhatikan dengan seksama terutama pada bagian database (diawali dengan db_).

• Pastikanlah server database PostgreSQL telah berjalan.

• Apabila diperlukan, bukalah log OpenERP yang biasanya tersimpan di C:\Program Files\OpenERP All In One\openerp-server.log

Instalasi di distribusi Linux Ubuntu

Cara pertama

Updatelah database paket sistem dengan perintah berikut: sudo apt-get update

Kemudian, installah paket-paket berikut, termasuk server database (diketikkan sebagai satu baris perintah):

(10)

python-vatnumber python-vobject python-tz python-webdav python-werkzeug python-yaml python-xlwt python-zsi python-setuptools python-unittest2 python-mock python-jinja2

Berikutnya, untuk OpenERP, kita punya pilihan untuk: • Menggunakan paket deb yang disediakan

• Menggunakan source code

Apabila menggunakan paket deb, downloadlah paket deb dari

http://nightly.openerp.com/7.0/nightly/deb/ dan installlah paket tersebut:

sudo dpkg -i <file.deb>

Apabila menggunakan source code, ekstraklah arsip source code dan masuklah ke dalam direktori hasil ekstrak.

Cara kedua

Tambahkanlah entri berikut ke /etc/apt/sources.list:

deb http://nightly.openerp.com/7.0/nightly/deb/ ./

Kemudian jalankan:

sudo apt-get update

sudo apt-get install openerp

Persiapan database

Buatlah sebuah user database (kita berikan hak untuk membuat database). Gantilah <user> dengan nama user yang diinginkan.

sudo -u postgres createuser --pwprompt --createdb <user>

(11)

File konfigurasi dan server

Apabila menjalankan dari source code, pertama-tama, kita akan buat file konfigurasi dan simpan sebagai config.ini:

./openerp-server -s -c config.ini –stop-after-init

Selanjutnya, editlah file config.ini, terutama untuk parameter koneksi database (diawali db_). Server kemudian bisa dijalankan dengan perintah:

./openerp-server -c config.ini

Apabila menggunakan paket deb:

(12)

1.2 Bekerja dengan database

Akseslah server OpenERP menggunakan web browser. Apabila server terinstall pada localhost, gunakanlah URL http://localhost:8069

Membuat database

Untuk membuat database, akses bagian Manage Databases, pada bagian create isi nama database yang kita inginkan, misal db_latihan, isi password user admin untuk database tersebut. Bagian Master Password secara default akan terisi dengan admin. Untuk mengubahnya, masuk ke bagian Password.

Untuk menambahkan demo data, aktifkanlah pilihan Load demonstration data. Tunggulah proses yang berlangsung dan setelah selesai, kita akan login otomatis sebagai user admin dan diarahkan ke halaman settings, dimana kita bisa melihat modul-modul yang telah terinstall.

Jika kita mengaktifkan pilihan Load demonstration data, maka setelah kita menginstall modul, data sampel akan disertakan. Ini umumnya kita lakukan ketika mempelajari OpenERP.

Operasi lain

Selain pembuatan database yang telah dibahas sebelumnya, di bagian Manage Databases, kita dapat pula melakukan berbagai operasi berikut. Semuanya membutuhkan password master OpenERP.

(13)

Membuat duplikat dari sebuah database. Informasi yang diperlukan: • Original database name, nama database yang akan diduplikasi.

• New database name, nama database yang akan menjadi hasil proses duplikasi.

Drop

Menghapus database. Kita akan diminta untuk memilih nama database yang akan dihapus.

Backup

Membackup sebuah database. Kita akan diminta untuk memilih nama database yang akan dibackup.

Restore

Membuat database baru berdasarkan hasil backup yang tersedia sebelumnya. Informasi yang diperlukan:

• File, file backup

• New database name, nama database baru yang akan dibuat

Password

Mengubah password master. Kita akan diminta untuk memasukkan informasi: • New master password, password master baru

• Confirm new master password, konfirmasi password master baru

1.3 Settings dan technical features

Di bagian settings, dimana kita diarahkan ketika pertama kali login sebagai admin, setelah membuat database, kita akan menemukan beberapa menu dasar berikut.

• Modules • Apps • Updates

• Installed Modules, daftar modul yang telah kita instal. Apabila kriteria installed pada search dihapus, kita bisa mencari dari semua modul yang tersedia.

• Users

• Users, daftar user OpenERP • Translations

(14)

Apabila kita ingin melakukan pengaturan lebih lanjut, kita dapat mengaktifkan technical features untuk user tertentu. Sebagai contoh, ketika masih login sebagai admin, di bagian Settings:

• pilihlah Users → Users

• Pilihlah Administrator (admin) dari daftar user • Klik tombol Edit

(15)
(16)

1.4 Modul Sales Management

Masih di Settings, pada bagian Modules → Installed Modules, hapuslah kriteria installed pada kotak pencarian. Daftar modul lengkap akan ditampilkan. Kliklah pada tombol Install di modul Sales Management.

Setelah instalasi dilakukan, kita akan diminta untuk mengatur: • Accounting Package, pilih Custom

• Company, pilih perusahaan

Berikutnya, kita dapat mengatur opsi Accounting: • Company, pilih perusahaan

• Currency, mata uang. Kita bisa pilih IDR • Sale Tax, pajak pada penjualan

• Purchase Tax, pajak pada pembelian

Untuk mengubah data perusahaan, kliklah logo perusahaan (Edit Company data).

Untuk bekerja dengan Sales Management, kita bisa klik pada link Sales di baris menu bagian atas layar:

• Sales

• Customers, berisi data customer yang tercatat dalam database kita. • Quotations, berisi quotation yang tercatat dalam database kita. • Sales Orders, berisi sales order yang tercatat dalam database kita. • Products

(17)

Untuk bekerja dengan invoice, kita bisa akses melalui link Invoicing di baris menu bagian atas layar: • Customers

• Customer Invoices, berisi data invoice untuk customer yang tercatat dalam database kita. • Customer Refunds, berisi refund dari customer yang tercatat dalam database kita. Refund

adalah dokumen yang berisikan pengurangan sejumlah tagihan dalam invoice yang telah dibuat untuk customer. Selain melalui bagian ini, refund juga bisa di-generate dari Customer Invoices. • Sales Receipts, berisi data Sales Receipts yang kita terima dari customer. Sales Receipts ini

diperlukan untuk pembuatan Customer Payments.

• Customer Payments, berisi data pembayaran yang kita terima dari customer. Kita juga bisa membuat data pembayaran dari Sales Receipts atau Customer Invoice yang statusnya masih Open.

• Customers, berisi data customer. • Suppliers

• Supplier Invoices, berisi data invoice dari supplier yang tercatat dalam database kita. • Supplier Refunds, berisi refund supplier yang tercatat dalam database kita.

• Purchase Receipts, berisi data Purchase Receipts yang kita terima dari supplier. Purchase Receipts ini diperlukan untuk pembuatan data Supplier Payments.

• Supplier Payments, berisi data pembayaran dari kita kepada para supplier. Kita juga bisa membuat data pembayaran dari Purchase Receipts.

(18)

Untuk bekerja dengan laporan, kita bisa akses melalui link Reporting di baris menu bagian atas layar: • Dashboards

• My Dashboard, berisi berbagai laporan yang kita ingin tampilkan sesuai kebutuhan kita. Berbagai laporan yang terlihat di bagian ini bisa selalu kita ubah-ubah dengan cara masuk ke modul yang kita inginkan laporannya, klik bagian Graph View dan dari drop down menu di bagian search, klik Add to Dashboard.

• Sales, berisi dashboard mengenai laporan Sales. Secara default bagian ini berisi daftar Quotation dan grafik Monthly Turnover.

• Sales

• Sales Analysis, berisi daftar Sales dari setiap personal yang bisa ditampilkan dalam format list ataupun grafik.

• Accounting

• Invoices Analysis, berisi laporan analisis invoice.

(19)
(20)

2. Dasar-Dasar Kustomisasi

Penulis: Whisnu Budhysantika

2.1 Developer Mode

Developer mode adalah sebuah fasilitas built-in yang terdapat dalam OpenERP. Yang menjadi ciri utama dari fasilitas ini adalah hadirnya drop down Debug View di samping sebuah nama model.

(21)

Salah satu fitur yang sangat berguna ketika developer mode diaktifkan adalah kita bisa mengetahui nama dan informasi lain tentang suatu field, ketika kursor mouse diarahkan pada label suatu field.

Selain itu, ketika sedang aktif pada suatu view, kita akan mendapatkan berbagai fasilitas berikut dari drop down Debug View (item-item berikut tersedia apabila relevan):

• View Log (perm_read), menampilkan data: • ID, Identitas unik dari sebuah obyek

• XML ID, file xml yang berkaitan dengan obyek. • Creation User, menampilkan data pembuat

• Creation Date, menampilkan data tanggal pembuatan • Latest Modification By, menampilkan data pengubah

• Latest Modification Date, menampilkan data tanggal pengubahan data • Toggle Form Layout Outline, menampilkan layout dari sebuah form.

• Set Defaults, fasilitas untuk membuat value yang ada dalam formulir tersebut menjadi default value untuk form sejenis. Saat kita memilih fungsi ini, maka akan terdapat form baru yang berisi:

• Default, berisi Dropdown mengenai value yang berada dalam form tersebut, misal alamat email, language, signature dan timezone tergantung pada jenis form-nya.

• Opsi Only You dan All Users, bila dipilih Only You, maka default value tersebut hanya berlaku untuk user yang saat ini sedang login saja. Bila dipilih All Users, maka berlaku untuk semua user yang terdaftar dalam database tersebut.

(22)

dengan warna merah dan bisa di-extend untuk melihat detailnya.

• View Fields, berfungsi untuk menampilkan field-field apa saja yang dimiliki dalam model tersebut. • Fields View Get, berfungsi untuk menampilkan data layout/view field-field untuk model tersebut. • Manage Filters. Dalam setiap model OpenERP, kita bisa menambahkan filter dengan

mendefinisikan domain dan context-nya. Fasilitas Manage Filters dimaksudkan untuk melakukan CRUD (Create Retrieve Update & Delete) terhadap filter-filter yang kita butuhkan.

• Technical translation, bagian ini berfungsi untuk mendefinisikan translasi teknis dari Field, Object, Report/Template ,View, Wizard Button, Wizard Field, Wizard View, XSL, Help, Code, Constraint, SQL Constraint.

• Manage Views, berfungsi untuk mengatur view dari model yang sedang dilihat, mengatur field apa saja yang ditampilkan, mengubah field, menambahkan ataupun menghapus field yang sedang ditampilkan.

• Edit View, berfungsi untuk mengedit view.

• Edit FormView, berfungsi untuk mengedit form view. • Edit SearchView, berfungsi untuk mengedit search view.

(23)

2.2 Menambah dan menampilkan field

Untuk menambahkan field pada sebuah model, bisa dilakukan dengan beberapa cara, yaitu:

• Dari Manage Views: Cara ini adalah cara yang sangat mudah dilakukan dan tidak memerlukan pengetahuan mengenai pemrograman python. Dapat dilakukan dengan mengaktifkan Developer Mode, kemudian dari Debug View pilih Manage Views.

• Dengan mengubah database structure. Aktifkanlah terlebih dahulu technical features untuk user yang diinginkan, kemudian aktiflah di Settings. Di bagian Technical, pilihlah Database Structure → Fields. Kita bisa gunakan tombol Create untuk membuat field baru.

• Dengan membangun modul sendiri (dibahas mulai dari bab 3).

Manage Views

(24)

Semua field yang aktif, ditampilkan dalam format XML <field name=nama_field>. Untuk menambahkan sebuah field baru, kita tinggal mengklik icon plus (+) yang terdapat dibagian kanan setiap field. Dengan cara ini pula kita bisa memastikan field baru tersebut akan terlihat dibagian mana dari tampilan.

(25)

Field baru

Pada dialog penambahan field baru, kita akan diminta untuk memberikan data: • Wajib diisi

• Field name: adalah nama field di database. Untuk penamaan field custom, harus diawali dengan x_.

• Field Label, label yang akan terlihat oleh pengguna.

• Field Type, tipe field (untuk selengkapnya, bacalah juga bab 5). • Model, nama model openerp, misal res.partner untuk partner.

• Searchable, bila dipilih, maka akan disertakan dalam proses pencarian data. • Tidak wajib diisi:

• Domain, python expression, contoh [(‘color’=’red’)] yang menunjukkan kemungkinan kriteria dari field.

• Serialized Field, jika di set maka field ini tidak akan dibuatkan dalam struktur database tapi hanya di buat dalam sparse struktur.

• Required, bila dipilih, maka field ini akan menjadi field yang wajib diisi.

(26)
(27)

2.3 Menyembunyikan dan mengatur posisi field

Menggunakan Manage Views, untuk setiap field, kita bisa klik tombol minus (-) untuk menyembunyikan field. Ketika kita klik pada tombol Remove, kita hanya menghapusnya dari view.

Lebih lanjut, selain tombol + dan -, berikut ada fungsi dari berbagai tombol lainnya:

• Icon kertas dan pensil: untuk memodifikasi/mengubah properti sebuah field (dari sisi view): • Name, nama sebuah field.

• String, label dari sebuah field

• Required, bila dipilih, maka field tersebut wajib diisi.

• Readonly, bila dipilih, maka isi field tersebut tidak bisa diubah.

• Invisible, bila dipilih, maka field tersebut tidak akan terlihat (tersembunyi).

• Domain, digunakan untuk keperluan filter seperti domain="[('partner_id','=',partner_id)]". • Context, parameter kontekstual, seperti bahasa.

• Attrs, atribut sebuah field, lebih lanjut bacalah juga bab 6. • Eval, ekspresi kode python, untuk data non string.

• Ref, referensi sebuah field.

• On change, fungsi on change, lebih lanjut bacalah juga bab 6.

• No Label, bila dipilih, maka label dari field tersebut tidak akan ditampilkan.

• Completion, bila dipilih, maka saat field tersebut diisi, akan terdapat saran dalam pengisiannya. • Colspan, pendefinisian jumlah kolom yang ditempati field.

• Widget, contoh dari widget adalah mail_thread dan many2many_tags_email. Widget akan mendefiniskan action yang akan diambil bila field ini digunakan.

• Groups, mendefiniskan tempat field tersebut akan berada.

• Icon panah hijau mengarah ke atas: untuk pengaturan urutan tampilan field. Bila icon ini di klik maka field tersebut akan naik ke urutan tampilan di atas dari sebelumnya.

(28)

2.4 Kelebihan dan kekurangan

Kelebihan

Proses kostumisasi OpenERP dengan menggunakan fasilitas yang disediakan oleh OpenERP yaitu Developer Mode dan Technical Features akan membawa kita pada pengalaman kemudahan memodifikasi sistem tanpa harus repot bekerja dengan kode Python.

Kemudahan ini menjadi keunggulan tersendiri dari OpenERP. Saat kita membangun sebuah sistem informasi, baik itu pada skala kecil ataupun skala besar seperti ERP, dan kemudian kita harus menerangkan sistem tersebut pada pengguna akhir, pertanyaan yang kemudian selalu muncul adalah “jika ingin menambahkan ini atau itu bagaimana?”. Pertanyaan tersebut seringkali menjadi justifikasi dari pengguna bahwa sebuah sistem itu sulit dan kurang user friendly saat mereka dihadapkan pada kenyataan bahwa “pengubahan harus melalui pengubahan pada pemrograman”.

Tetapi ketika pengubahan itu dengan sangat mudah kita terangkan pada calon pengguna bahwa pengubahan baik itu yang sifatnya penambahan, pengurangan dan lain-lain dapat dibuat dengan sangat mudah hanya dengan beberapa kali klik saja, seringkali menjadi poin tersendiri dan dianggap bahwa sistem yang kita buat sangat baik dan user friendly dari kacamata pengguna tersebut.

OpenERP didesain sedemikian rupa untuk bisa mengadopsi dengan baik setiap penambahan, pengurangan ataupun perubahan terhadap sebuah field tanpa harus melakukan pemrograman.

Kekurangan

Apa yang kita lakukan sejauh ini berdampak pada satu database. Bayangkanlah apabila kita harus melakukan sejumlah kustomisasi yang sama tersebut pada database lain, misal ketika instalasi ulang dilakukan.

Apabila kita terjemahkan setiap apa yang kita lakukan dalam satu atau lebih modul, modul-modul yang kita kembangkan tersebut dapat diinstall dan diuninstall setiap kali diperlukan. Sehingga kita bisa bekerja dengan satu atau lebih database dengan lebih mudah.

(29)

3. Dasar Pengembangan Modul OpenERP

Penulis: Whisnu Budhysantika / Noprianto

3.1 Paket Python

Sebuah modul OpenERP terdiri dari satu direktori dan juga merupakan sebuah paket Python yang valid. Dan, oleh karenanya, file __init__.py harus tersedia.

File __init__.py bisa berupa file kosong, ataupun berisikan kode-kode inisialiasi. Di dalam bab-bab berikut, dalam contoh modul, kita bisa melihat bahwa kode-kode inisialiasi tidak diperlukan apabila kita tidak bekerja dengan kode Python, dan hanya fokus pada view, sebagai contoh. Sebaliknya, apabila kita bekerja dengan model (misal: menambah field), maka __init__.py umumnya berisi statement import untuk modul lain di dalam paket.

3.2 Manifest __openerp__.py

Supaya sebuah modul dikenal oleh OpenERP dan informasi lebih rinci tentang modul bisa disediakan, maka kita perlu membuat sebuah file manifest, dengan nama file __openerp__.py, di dalam direktori modul yang kita kembangkan.

File ini akan berisikan sebuah dictionary Python, dengan key berikut. • name: nama modul

• version: versi modul • author: pengembang

• license: lisensi modul (default AGPL-3). Bacalah juga bab 8 apabila diperlukan. • description: deskripsi apa yang dilakukan oleh modul

• category: kategori modul • website: website modul (URL)

• depends: daftar modul lain yang dibutuhkan

• data: daftar file yang di-load (umumnya XML) pada saat modul diinstall atau diupdate

• demo: daftar file tambahan yang di-load (umumnya XML) pada saat modul diinstall atau diupdate dan flag demo aktif.

3.3 File-file dalam modul

(30)

Untuk bekerja dengan view, dalam bentuk file XML, umumnya file-file XML ditempatkan di dalam subdirektori view.

File-file yang diperlukan untuk report ataupun wizard umumnya ditempatkan pada subdirektori tersendiri (report dan wizard sebagai contoh).

3.4 Lingkungan OpenERP

Apabila kita melihat pada source code OpenERP: $ ls -1 --group-directories-first

debian

Kita bisa melihat satu direktori openerp. Ini merupakan sebuah paket Python: $ ls -1 --group-directories-first openerp

(31)

Kita akan banyak bekerja dengan osv:

$ ls -1 --group-directories-first openerp/osv/ expression.py

Terutama pada modul orm.py dan fields.py: $ file openerp/osv/orm.py

openerp/osv/orm.py: Python script, ASCII text executable

$ file openerp/osv/fields.py

openerp/osv/fields.py: Python script, UTF-8 Unicode text executable

Apabila kita berada dalam direktori source code OpenERP (root), kita bisa import orm.py dan fields.py dengan cara berikut:

>>> from openerp.osv import orm, fields >>> orm

<module 'openerp.osv.orm' from 'openerp/osv/orm.py'> >>> fields

<module 'openerp.osv.fields' from 'openerp/osv/fields.py'> >>>

Namun, apabila kita berada di luar source code, maka environment variabel PYTHONPATH perlu di-set terlebih dahulu, pada saat kita ingin bekerja dengan nyaman menggunakan IDE (yang mendukung). Kita tidak perlu lakukan ini pada level modul ketika instalasi dilakukan.

3.5 Lokasi Modul

Modul yang kita kembangkan perlu ditempatkan pada direktori yang dikenal oleh OpenERP, sebagai direktori addons. Pada tree source code OpenERP, ini adalah:

(32)

account_budget account_cancel

Kita bisa kopikan modul yang kita kembangkan ke dalam direktori addons yang dikenal, apabila memiliki hak tulis, atau kita bisa gunakan direktori lain. Direktori lain tersebut kemudian perlu diinformasikan ke server OpenERP. Bacalah juga bab 8 apabila diperlukan.

3.6 Update daftar modul

Apabila diperlukan, pada saat kita menambahkan modul baru di file sistem, kita mungkin perlu memberitahu server OpenERP bahwa ada modul baru yang ditambahkan.

Untuk keperluan tersebut, pertama-tama, aktifkanlah terlebih dahulu Technical features untuk user admin dan:

• Aktiflah di menu Settings

• Klik Modules → Update Modules List

• Sebuah dialog akan ditampilkan, kliklah pada tombol Update

3.7 Mencari dari daftar modul

Apabila modul kita dikenal, maka kita bisa mencari dan melihat informasi detilnya. Di menu Settings, pilihlah Modules → Installed Modules. Pada kotak pencarian, hapuslah kriteria installed dan isikan dengan nama modul kita. Apabila berhasil, modul akan tampil dan kita bisa klik install untuk melakukan instalasi.

Apabila modul kita tidak dikenal:

• Pastikan kita telah tempatkan pada direktori addons yang dikenal oleh OpenERP. Apabila menempatkan pada direktori lain, pastikan kita sudah melakukan konfigurasi yang tepat.

• Pastikan modul kita merupakan paket Python yang valid. Dengan pengaturan PYTHONPATH yang tepat, Anda bisa coba lakukan import.

• Pastikan manifest __openerp__.py telah benar.

• Pastikan tidak ada sintaks yang salah sebagai sebuah modul Python. • Apabila diperlukan, lakukanlah update daftar modul.

3.8 Langkah berikut

• Sebuah IDE yang nyaman sangat disarankan. Pilihlah IDE favorit Anda, dan daftarkanlah PYTHONPATH ataupun hal serupa pada IDE Anda. Apabila didukung, kita bisa memanfaatkan fasilitas code completion, sebagai contoh.

(33)

model. Kita bisa tampilkan field tersebut lewat UI supaya modul kita cukup sederhana.

• Pastikan modul dikenal oleh OpenERP. Cobalah untuk install dan pastikan tidak ada pesan kesalahan.

• Apabila modul Anda menambahkan field pada model tertentu, maka Anda bisa juga melihatnya ke dalam tabel database. Gunakanlah client PostgreSQL yang nyaman, seperti pgAdmin III.

Contoh modul buku_contoh.

__init__.py

from . import buku_contoh

__openerp__.py {

'name': 'Contoh', 'version': '1.0', 'author': 'noprianto',

'description': 'Contoh modul sederhana', 'category': 'Buku',

'website': 'https://github.com/id-python/buku-openerp', 'depends': ['base'],

'data': [], }

buku_contoh.py

from openerp.osv import orm, fields

class res_partner(orm.Model):

Pada contoh tersebut, kita akan menambahkan satu field, tapi tidak menampilkan dalam view. Ketika modul sukses diinstall, tidak ada perubahan apapun yang ditampilkan pada model res.partner. Padahal, sesungguhnya, sebuah field telah ditambahkan. Cobalah untuk menampilkan field buku_contoh dengan Manage Views.

(34)

4. Kasus: Perusahaan Rental Kendaraan

Penulis: Widoyo

4.1 Pendahuluan

Sebuah perusahaan persewaan kendaraan, melayani sewa kendaraan: 1. Dengan sopir

2. Tanpa sopir

Periode

1. Harian 2. Mingguan 3. Bulanan

Tipe Penggunaan

1. Pribadi / keluarga 2. Dinas

Perawatan kendaraan menjadi tanggung jawab pemilik persewaan, terdiri dari: 1. Ganti oli

2. Ban

(35)

4.2 Langkah implementasi

Pastikanlah server OpenERP telah terinstall. Kemudian, buatlah sebuah database dengan nama majulancar.

Setup Identitas Perusahaan

Bagian ini merupakan hal pokok, informasi identitas perusahaan, salah satunya untuk tampilan laporan-laporan yang nanti akan dihasilkan.

OpenERP mendukung sistem banyak perusahaan, namun dalam kasus ini hanya dicontohkan untuk satu perusahaan.

Untuk melakukan ini, klik menu Settings → Companies → Companies

Pada setup perusahaan ini dibagi dalam beberapa bagian:

• General Information: Berisi informasi umum perusahaan seperti nama, alamat, telepon, dan lain-lain. Untuk rekening bank, bisa lebih dari satu.

• Configuration: Berisi mata uang dan masalah logistik.

(36)

Setelah selesai diberikan informasi perusahaan, kita dapat klik pada tombol Preview Header/Footer untuk melihat header/footer.

Memasang Modul

Lakukanlah instalasi untuk modul-modul berikut: • Fleet Management

• Point of Sale

• eInvoicing & Payments (akan terinstall dengan sendirinya sebagai dependency)

Terjemahan Bahasa Indonesia

Kita dapat pula menggunakan terjemahan ke Bahasa Indonesia, dengan cara memilih menu Settings → Translations → Load a translation, kemudian pilihlah Indonesian / Bahasa Indonesia.

Setelah itu, untuk setiap user, masuklah ke pengaturan Preference (drop down sisi kanan atas layar, klik pada nama user), kemudian ubahlah Language ke Indonesian / Bahasa Indonesia.

Kode Rekening

Untuk mencatat semua transaksi agar dapat langsung masuk ke dalam catatan akuntansi (jurnal), perlu disiapkan kode rekening-kode rekening (Chart of Account – COA) yang nanti akan dipergunakan.

Untuk melakukan hal ini, pertama aktifkan Full accounting features, melalui menu Settings → Configuration → Akuntansi → Full accounting features: journals, legal statements, chart of accounts, etc.

(37)
(38)

Data Awal

Data awal di sini dimaksudkan sebagai data-data dasar yang menjadi acuan data lain pada saat pengoperasian. Data di sini pada saat berjalan juga masih tetap bisa dilakukan perbaikan, misalnya ditambah, dihapus, atau diubah.

Beberapa data awal yang perlu untuk diisikan adalah: 1. Layanan persewaan, termasuk harga

2. Kendaraan yang dimiliki

3. Pelanggan yang telah pernah menggunakan jasa

Layanan Persewaan

Data ini adalah item-item yang nanti dijual. Mengikuti dari contoh kasus di atas, maka perlu disiapkan penjelasan dari layanan yang akan dijual, antara lain:

1. Dengan atau tidak dengan sopir

2. Waktu sewa: harian (setengah hari dan sehari penuh), mingguan, dan bulanan 3. Keluarga atau dinas

(39)

Setiap produk perlu untuk dihubungkan dengan kode akun.

Kendaraan

Kendaraan perlu dicatat ke dalam sistem sebagai bagian dari aset. Administrasi kendaraan ini dilakukan dari menu Fleet. Beberapa data yang perlu diadministrasi antara lain:

1. Kendaraan

2. Service, baik berkala maupun yang berbasis kejadian 3. Bahan bakar, yaitu pencatatan penggunaan bahan bakar 4. Biaya lain

5. Kontrak, misalnya bila kendaaraan disewa dalam jangka waktu yang lama atau berbasis kontrak

(40)
(41)

Pelanggan

Pelanggan ini adalah pilihan, artinya tidak wajib ditambahkan. Namun lebih baik ditambahkan, hal ini akan memberi nilai tambah sistem agar dapat diketahui loyalitas pelanggan. Selain itu juga berguna untuk menjaga hubungan agar pelanggan tetap loyal dan perbaikan layanan.

Pelanggan dapat berupa perorangan maupun perusahaan. Data pelanggan perlu dihubungkan dengan kode rekening yang telah disiapkan sebelumnya.

(42)

Operasi

Setelah data-data disiapkan, sistem dapat dioperasikan untuk mencatat transaksi-transaksi yang terjadi. Beberapa transaksi yang mungkin terjadi pada sistem antara lain:

1. Pelanggan melakukan sewa kendaraan 2. Kendaraan dilakukan perbaikan 3. Laporan keuangan

Pelayanan Sewa Kendaraan

Ada beberapa langkah untuk hingga menerima pembayaran, yaitu: 1. Membuat penawaran

2. Konfirmasi penjualan 3. Membuat tagihan / invoice 4. Terima pembayaran

(43)
(44)
(45)

Hal ini akan membuat status dari penjualan ini sudah terbayar.

(46)

Laporan

Ada berbagai laporan keuangan dapat dihasilkan dari openERP. Berikut ini beberapa screenshot yang mungkin berkaitan dengan Laporan.

Laporan dapat diakses dari menu Reporting.

(47)
(48)

Laporan Analisa Penjualan

(49)
(50)

5. Model pada OpenERP

Penulis: Noprianto

Di bab sebelumnya, kita telah membahas dasar-dasar pengembangan modul OpenERP. Kita mengetahui bahwa kita perlu membuat manifest dan informasi apa saja yang perlu disertakan ke dalam file manifest suatu modul agar dapat dikenal oleh OpenERP. Kita juga membuat class, yang diturunkan dari orm.Model dan kemudian bekerja dengan model yang telah disediakan. Kita mengetahui bahwa kita dapat menambahkan field dengan tipe tertentu.

Di bab ini, kita akan membahas lebih lanjut tentang class orm.Model tersebut. Termasuk diantaranya sebagian dari atribut dan method yang telah disediakan.

5.1 Hirarki class

Ketika kita bekerja dengan suatu business object, kita menurunkan dari class orm.Model. Pada source code OpenERP, class ini didefinisikan pada openerp/osv/orm.py. Class ini merupakan turunan dari BaseModel, yang juga didefinisikan pada file yang sama. Lebih lanjut, class BaseModel merupakan base class untuk model pada OpenERP.

| Method resolution order: | Model

| BaseModel

| __builtin__.object

Untuk bekerja dengan class ini, kita melakukan import dengan cara: >>> from openerp.osv import orm

Atau, ketika ingin menambahkan field:

>>> from openerp.osv import orm, fields

Apa yang kita lakukan pada contoh terakhir adalah mengimport modul orm dan fields dari package openerp.osv. Sebagai catatan, modul fields mendefinisikan class-class tipe field yang didukung oleh OpenERP.

Dengan menurunkan dari class Model ini, kita dapat menggunakan dan/atau mengoverride sejumlah atribut dan method yang telah disediakan.

(51)

class Model(BaseModel): _auto = True

_register = False

(52)

5.2 orm.Model, osv.Model dan osv.osv

Pada berbagai modul yang kita gunakan (baik yang disertakan ataupun dari pihak ketiga), kita akan menemukan class yang diturunkan dari osv.osv. Pada dokumentasi tertentu, kita juga akan menjumpai osv.Model.

Apabila kita mencermati file openerp/osv/osv.py, kita bisa melihat bahwa osv.osv digunakan untuk backward compatibility:

# deprecated - for backward compatibility. osv = Model

osv_memory = TransientModel

osv_abstract = AbstractModel # ;-)

Lebih lanjut, modul orm diimport oleh modul osv:

import orm …

from openerp.osv.orm import MetaModel, Model, TransientModel, AbstractModel

Dengan cara demikian, kita bisa menggunakan osv.osv dan osv.Model untuk backward compatibility.

Di prompt interaktif Python:

>>> from openerp.osv import osv >>> osv.osv

>>> from openerp.osv import orm >>> orm.Model

<class 'openerp.osv.orm.Model'> >>>

>>>

(53)

5.3 Atribut

Class BaseModel memiliki sejumlah atribut yang memiliki peranan/arti tertentu dalam OpenERP. Dan, class Model, sebagai turunan, hanya mendefinisikan ulang beberapa dari atribut tersebut. Class yang kita bangun, sebagai turunan dari Model, juga melakukan hal yang lebih kurang sama.

Dalam contoh yang akan kita bahas, dimana kita menambah field pada model tertentu, apa yang kita lakukan adalah:

• Membuat sebuah class baru (menurunkan dari Model)

• Mendefinisikan ulang beberapa atribut seperti _name, _inherit dan _columns.

Tanpa kita melakukan lebih jauh lagi, field secara otomatis akan ditambahkan.

Berikut adalah sejumlah atribut yang disediakan oleh Model.

Atribut Default Catatan

_auto True Apabila True, maka tabel akan dibuat secara otomatis.

_register False

_name None [Wajib] merupakan nama business object dalam notasi titik (misal: res.partner)

_columns {} berisikan nama field dan tipenya

_constraints [] List dari tuple (nama_fungsi, pesan_kesalahan, fields) untuk memastikan input adalah valid.

_custom False

_defaults {} Berisikan nilai default, dengan key adalah nama kolom. Bisa berupa literal ataupun fungsi _rec_name None Field alternatif untuk digunakan sebagai name

_parent_name 'parent_id'

_parent_store False

_parent_order False

_date_name 'date'

_order 'id' Field untuk keperluan sort

_sequence None

_description None

_needaction False

(54)

Atribut Default Catatan

_transient False

_inherit [Pada inheritance tradisional] merupakan

_name dari business object parent (wajib, _name dengan titik diganti dengan underscore.

_invalids set() otomatis: create_uid, create_date, write_uid, write_date, untuk keperluan log.

_log_create False

_sql SQL code untuk membuat table/view apabila

_auto adalah False.

(55)

5.4 Atribut: _columns

Sebagaimana dibahas sebelumnya, atribut _columns digunakan untuk menentukan field dan tipenya, dalam sebuah dictionary.

Apabila kita menurunkan dari business object yang ada, dengan tujuan untuk menambah field, maka kita cukup mendefinisikan field-field yang ingin kita tambahkan saja.

Mari kita ingat kembali ketika melakukan import modul orm dan fields: >>> from openerp.osv import orm, fields

Modul fields mendefinisikan class-class field yang didukung oleh OpenERP. Contoh output dari dir() module fields:

>>> dir(fields)

['Binary', 'DT', 'SUPERUSER_ID', '_', '__builtin__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_column', '_logger', '_symbol_set',

'_symbol_set_char', 'base64', 'binary', 'boolean', 'char', 'column_info', 'date', 'datetime', 'dummy', 'field_to_dict', 'float', 'float_repr', 'float_round',

'function', 'get_nice_size', 'html', 'html_sanitize', 'integer',

'invalid_xml_low_bytes', 'logging', 'many2many', 'many2one', 'one2many', 'openerp', 'property', 'pytz', 're', 'reference', 'related', 'sanitize_binary_value',

'selection', 'serialized', 'simplejson', 'sparse', 'text', 'tools', 'xmlrpclib'] >>>

Modul fields mendefinisikan sebuah class dengan nama _column, yang merupakan base class untuk semua tipe field. Berikut adalah atribut yang didefinisikan:

>>> from openerp.osv import orm, fields >>> c = fields._column()

>>> dir(c)

['__class__', '__delattr__', '__dict__', '__doc__', '__format__',

'__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__',

'__subclasshook__', '__weakref__', '_as_display_name', '_auto_join',

(56)

'_symbol_set', '_type', 'as_display_name', 'change_default', 'deprecated', 'get', 'group_operator', 'groups', 'help', 'manual', 'ondelete', 'priority', 'read', 'readonly', 'required', 'restart', 'search', 'select', 'selectable', 'set', 'size', 'states', 'string', 'translate', 'view_load', 'write']

>>>

Beberapa dari atribut tersebut memiliki arti khusus, sebagai contoh: • string: label field

• required: harus diisi

• readonly: hanya dapat dibaca • help: tooltip help

Tipe field: boolean

Merupakan tipe dasar, digunakan untuk benar/salah.

Class dan constructor:

class boolean(_column)

| __init__(self, string='unknown', required=False, **args)

Contoh (cuplikan dari program 5-1):

'buku_field_4': fields.boolean('Buku Field 4'),

Tipe field: integer

Merupakan tipe dasar, digunakan untuk integer.

Class dan constructor:

class integer(_column)

| __init__(self, string='unknown', required=False, **args)

Contoh (cuplikan dari program 5-1):

'buku_field_3': fields.integer('Buku Field 3', size=10),

Tipe field: reference

Merupakan tipe dasar. Berisikan dynamic relationship ke object lain.

(57)

class reference(_column)

| __init__(self, string, selection, size, **args)

Tipe field: char

Merupakan tipe dasar, digunakan untuk menampung string (panjang dibatasi).

Class dan constructor:

class char(_column)

| __init__(self, string='unknown', size=None, **args)

Catatan: size, ketika diberikan, akan menentukan maksimal panjang field.

Contoh (cuplikan dari program 5-1):

'buku_field_1': fields.char('Buku Field 1', size=20,

required=True, help='Contoh help'),

Tipe field: text

Merupakan tipe dasar, digunakan untuk menampung teks.

Class:

class text(_column)

Tipe field: html

Merupakan tipe dasar. Merupakan turunan dari text.

Class:

class html(text)

Tipe field: float

(58)

Class dan constructor:

class float(_column)

| __init__(self, string='unknown', digits=None, digits_compute=None, required=False, **args)

Catatan: digits diberikan dalam format (precision, scale). Gunakanlah selalu apabila bekerja dengan nilai nominal uang.

Contoh (cuplikan dari program 5-1):

'buku_field_2': fields.float('Buku Field 2', digits=(4, 2)),

Tipe field: date

Merupakan tipe dasar, digunakan untuk menampung tanggal.

Class:

class date(_column)

Contoh (cuplikan dari program 5-1):

'buku_field_5': fields.date('Buku Field 5'),

Tipe field: datetime

Merupakan tipe dasar, digunakan untuk menampung tanggal/waktu.

Class:

class datetime(_column)

Contoh (cuplikan dari program 5-1):

'buku_field_6': fields.datetime('Buku Field 6'),

Tipe field: binary

(59)

Class dan constructor:

class binary(_column)

| __init__(self, string='unknown', filters=None, **args)

Tipe field: selection

Merupakan tipe dasar, digunakan untuk pilihan.

Class dan constructor:

class selection(_column)

| __init__(self, selection, string='unknown', **args)

Catatan: selection diberikan dalam list dari tuple (key, label) ataupun dengan menggunakan fungsi.

(60)

… … …

'buku_field_7': fields.selection(SELECTION_1, 'Buku Field 7'),

'buku_field_8': fields.selection(_get_selection_2, 'Buku Field 8'),

Tipe field: many2one

Merupakan tipe relasional, digunakan untuk relasi many to one (banyak ke satu). Penerapannya adalah umumnya pada relasi ke object parent (menggunakan foreign key).

Class dan constructor:

class many2one(_column)

| __init__(self, obj, string='unknown', auto_join=False, **args)

Salah satu contoh tipe field ini yang umum ditemukan pada OpenERP adalah model sale.order.line, dimana field order_id (many) berhubungan dengan model sale.order.

Contoh (cuplikan dari openerp/addons/sale/sale.py):

'order_id': fields.many2one('sale.order', 'Order Reference', required=True, ondelete='cascade', select=True, readonly=True, states={'draft': [('readonly',False)]}),

Tipe field: one2many

Merupakan tipe relasional, digunakan untuk relasi one to many (satu ke banyak). Merupakan kebalikan dari many2one.

Class dan constructor:

class one2many(_column)

| __init__(self, obj, fields_id, string='unknown', limit=None, auto_join=False, **args)

Salah satu contoh tipe field ini yang umum ditemukan pada OpenERP adalah model sale.order, dimana field order_line (one) berhubungan dengan model sale.order.line (pada field order_id).

(61)

'order_line': fields.one2many('sale.order.line', 'order_id', 'Order Lines', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly',

False)]}),

Tipe field: many2many

Merupakan tipe relasional, digunakan untuk relasi many to many (banyak ke banyak). Merupakan multiple relationship dua arah antara object.

Class dan constructor:

class many2many(_column)

| __init__(self, obj, rel=None, id1=None, id2=None, string='unknown', limit=None, **args)

Salah satu contoh tipe field ini yang umum ditemukan pada OpenERP adalah hubungan antara model res.partner dengan model res.partner.category.

Contoh (cuplikan dari openerp/addons/base/res/res_partner.py):

'category_id': fields.many2many('res.partner.category', id1='partner_id', id2='category_id', string='Tags'),

Tipe field: function

Merupakan tipe functional, yang mensimulasikan field sesungguhnya, melalui proses komputasi.

Class dan constructor:

class function(_column)

| __init__(self, fnct, arg=None, fnct_inv=None, fnct_inv_arg=None, type='float', fnct_search=None, obj=None, store=False, multi=False, **args)

Untuk argumen fnct, fungsi harus didefinisikan sebagai berikut:

fnct(model, cr, uid, ids, field_name(s), arg, context)

Kita akan membahas contoh sederhana pada program 5-4. Cuplikan kode:

… … …

(62)

res = {}

Untuk contoh tersebut, field buku_field_12 tidak disimpan pada tabel database.

Tipe field: related

Merupakan tipe related, diturunkan dari function, yang merujuk pada data di dalam field lain untuk record aktif.

'country_id': fields.many2one('res.country', 'Country'),

'country': fields.related('country_id', type='many2one', relation='res.country', string='Country',

deprecated="This field will be removed as of OpenERP 7.1, use country_id instead"),

Tipe field lain

Beberapa tipe field berikut didefinisikan di dalam modul fields: • sparse(function)

(63)

5.5 Atribut: _constraints

Sebagaimana dibahas sebelumnya, atribut _constraints dapat digunakan untuk membantu memastikan input adalah valid.

Atribut ini didefinisikan dalam bentuk sebuah list dari tuple (nama_fungsi, pesan_kesalahan, fields).

Mari kita lihat cuplikan dari program 5-3 berikut.

Kita memiliki sebuah field dengan nama buku_field_11:

class res_partner(orm.Model): _name = 'res.partner'

_inherit = 'res.partner'

_columns = {

'buku_field_11': fields.char('Buku Field 11', size=20, required=True),

}

Dan, kita ingin agar isi field tersebut, yang bertipe char, harus memiliki panjang minimal tiga karakter. Kita dapat definisikan _constraints dan fungsi untuk memeriksa, sebagai berikut:

def _check_field_11(self, cr, uid, ids, context=None): for i in self.browse(cr, uid, ids, context=context): if len(i.buku_field_11) >= 3:

return True

return False

_constraints = (

[_check_field_11, 'Panjang harus minimal 3 karakter', ['buku_field_11']],

)

Untuk nama_fungsi, kita gunakan _check_field_11.

(64)

5.6 Model, tabel database dan field

Sebagaimana dibahas sebelumnya, nama tabel database secara default adalah nama model (_name) dengan titik diganti dengan underscore. Dengan demikian, untuk model res.partner sebagai contoh, tabel pada database adalah res_partner. Atau, untuk model res.partner.category, tabel pada database adalah res_partner_category.

Ketika kita menambahkan suatu field dengan cara menurunkan dari suatu model (_name sama dengan _inherit), maka field tersebut akan ditambahkan pada tabel (untuk tipe field/pengaturan tipe field yang mendukung).

Dari user interface OpenERP, kita bisa mengamati ini dengan: • Aktifkanlah terlebih dahulu developer mode

• Buka salah satu model, misal res.partner, dengan mengakses Sales → Customers. Pilihlah salah satu partner (buka form).

• Pada pilihan DebugView, pilihlah View Fields.

• Sebuah dialog akan ditampilkan, berisikan field-field apa saja yang telah didefinisikan.

(65)
(66)

5.7 Method

Class BaseModel memiliki sejumlah method yang dapat kita gunakan (langsung atau tidak) ataupun override.

Override umumnya kita perlukan ketika fungsi yang ditawarkan perlu disesuaikan lebih lanjut. Sebagai contoh, kita menurunkan dari res.partner dan ketika suatu partner dibuat atau diedit, kita ingin melakukan fungsi tambahan, selain fungsi default yang telah disediakan.

Method-method yang ada dapat pula diakses lewat web service. Bacalah juga bab 9 apabila diperlukan.

Berikut adalah sejumlah method yang disediakan oleh Model. Dokumentasi yang disediakan secara umum cukup lengkap. Kita akan membahas beberapa diantaranya setelah ini, dalam bagian-bagian tersendiri.

Method Argumen

__init__ self, pool, cr

browse self, cr, uid, select, context=None, list_class=None, fields_process=None

check_access_rights self, cr, uid, operation, raise_exception=True check_access_rule self, cr, uid, ids, operation, context=None check_field_access_rights self, cr, user, operation, fields, context=None check_recursion self, cr, uid, ids, context=None, parent=None

clear_caches self

copy self, cr, uid, id, default=None, context=None copy_data self, cr, uid, id, default=None, context=None copy_translations self, cr, uid, old_id, new_id, context=None create self, cr, user, vals, context=None

default_get self, cr, uid, fields_list, context=None

distinct_field_get self, cr, uid, field, value, args=None, offset=0, limit=None exists self, cr, uid, ids, context=None

export_data self, cr, uid, ids, fields_to_export, context=None

fields_get self, cr, user, allfields=None, context=None, write_access=True fields_get_keys self, cr, user, context=None

fields_view_get self, cr, user, view_id=None, view_type='form', context=None, toolbar=False, submenu=False

(67)

Method Argumen get_invalid_fields self, cr, uid

get_xml_id, get_external_id self, cr, uid, ids, *args, **kwargs

import_data self, cr, uid, fields, datas, mode='init', current_module='', noupdate=False, context=None, filename=None

is_transient self

load self, cr, uid, fields, data, context=None

log self, cr, uid, id, message, secondary=False, context=None name_create self, cr, uid, name, context=None

name_get self, cr, user, ids, context=None

name_search self, cr, user, name='', args=None, operator='ilike', context=None, limit=100

perm_read self, cr, user, ids, context=None, details=True perm_write self, cr, user, ids, fields, context=None

read self, cr, user, ids, fields=None, context=None, load='_classic_read' read_group self, cr, uid, domain, fields, groupby, offset=0, limit=None,

context=None, orderby=False

read_string self, cr, uid, id, langs, fields=None, context=None

resolve_2many_commands self, cr, uid, field_name, commands, fields=None, context=None resolve_o2m_commands_to_

record_dicts,

resolve_2many_commands

self, cr, uid, field_name, commands, fields=None, context=None

search self, cr, user, args, offset=0, limit=None, order=None, context=None, count=False

search_count self, cr, user, args, context=None unlink self, cr, uid, ids, context=None user_has_groups self, cr, uid, groups, context=None

view_header_get self, cr, user, view_id=None, view_type='form', context=None view_init self, cr, uid, fields_list, context=None

write self, cr, user, ids, vals, context=None write_string self, cr, uid, id, langs, vals, context=None

(68)

Argumen Catatan

cr Cursor koneksi database (SQL Query dapat dilakukan)

user, uid Merupakan user id yang melakukan. Dalam hal ini merupakan nilai numerik, bukan nama user (string).

ids Id yang akan diproses. Umumnya berupa list dari id. Sebagai contoh, ketika memanggil unlink, yang akan menghapus record, ids dapat berisikan id-id record yang akan dihapus.

vals Merupakan nilai penting yang berhubungan langsung dengan apa yang akan dilakukan method. Umumnya berupa dictionary. Sebagai contoh, pada fungsi create yang akan membuat record baru, vals dalam hal ini adalah dictionary berisi nama field (key) dan nilainya (value).

fields Umumnya berisi list dari nama field.

context Informasi kontekstual, berupa dictionary. Sebagai contoh adalah language. Lewatkanlah ke dalam pemanggilan method (apabila ada dan diharapkan). Ketika menulis method baru, kita juga disarankan mengharapkan informasi ini.

Bekerja dengan model lain

(69)

5.8 Mengakses OpenERP tanpa server dijalankan

Sebelum membahas beberapa contoh method, kita akan membahas terlebih dahulu bagaimana kita dapat mengakses OpenERP dari prompt Python, bahkan tanpa server OpenERP dijalankan. Kita tidak lakukan lewat modul ataupun web service.

Pastikanlah bahwa server database telah dijalankan/authentikasi telah dikonfigur. Kemudian, PYTHONPATH telah diset dengan baik agar kita bisa melakukan import package/modul OpenERP. Ada baiknya pula untuk bekerja dengan database yang bersih, tanpa modul pihak ketiga terinstall. Kita bisa melakukan ini juga ketika server sedang berjalan.

Catatan penting: apa yang kita lakukan di sini hanyalah untuk keperluan mempelajari OpenERP saja dan sangat tidak disarankan untuk diterapkan pada server di lingkungan produksi.

Pertama-tama, kita harus dapat mengimport modul openerp:

>>> import openerp >>> openerp

<module 'openerp' from 'openerp/__init__.pyc'> >>>

Langkah kedua, kita mengakses koneksi database dan pool model:

>>> db, pool = openerp.pooler.get_db_and_pool('test_buku') No handlers could be found for logger "openerp.modules.module" >>> db

<openerp.sql_db.Connection object at 0xb5732aac> >>> pool

<openerp.modules.registry.Registry object at 0xb5732a2c> >>>

Setelah itu, untuk langkah ketiga, kita melakukan inisialisasi kursor database:

>>> cr = db.cursor() >>> cr

<openerp.sql_db.Cursor object at 0xb479a40c> >>>

Pada langkah keempat berikut, kita akan mengakses salah satu model. Sebagai contoh, kita akan bekerja dengan model sale_order.

>>> from openerp.addons.sale import sale

Dari manakah kita mendapatkan struktur package seperti itu? Perhatikanlah bahwa modul sale terletak pada:

$ file openerp/addons/sale/sale.py

(70)

lines

Apabila langkah keempat sukses dilakukan, kita akan melanjutkan dengan membuat instance dari model sale.order:

>>> so = sale.sale_order.create_instance(pool, cr) >>> so

<openerp.osv.orm.sale.order object at 0xb5407bec> >>>

Perhatikanlah bahwa di dalam modul sale, kita memiliki class sale_order. Sementara, class sale_order merupakan turunan dari osv.osv (orm.Model), dan kita memiliki class method create_instance.

(71)

5.9 Method: search

Method search digunakan untuk melakukan pencarian dan akan mengembalikan nilai berupa list id record yang memenuhi kriteria.

Melanjutkan dari pembahasan mengakses OpenERP tanpa server dijalankan, kita akan menggunakan method search.

Kita akan mencari dari daftar partner yang merupakan customer. Kriteria pencarian adalah customer=True.

Catatan: dalam OpenERP, kriteria pencarian umumnya juga dikenal dengan istilah domain.

>>> from openerp.addons.base.res import res_partner >>> uid = 1

>>> search_data = [('customer', '=', True)]

>>> partner = res_partner.res_partner.create_instance(pool, cr) >>> search_result = partner.search(cr, uid, search_data)

>>> search_result

Perhatikanlah bahwa kriteria pencarian dituliskan dalam Polish Notation atau prefix notation (notasi prefix). Sebagai contoh lain, kita akan mencari dari res.partner, untuk:

• nama yang mengandung 'tes' (tidak case-sensitive) atau untuk id < 3 • dan

• website = ''

Karena menggunakan Polish Notation, maka operator or '|' dan and '&' ditempatkan di depan.

Pertama-tama, kita menyusun untuk kriteria pertama (or): '|', ('name', 'ilike', 'tes'), ('id', '<', 3)

Setelah itu, kita gabungkan dengan kriteria kedua (and):

(72)

Dan, kita tempatkan pada sebuah list:

(73)

5.10 Method: read

Method read digunakan untuk membaca isi record dan akan mengembalikan (list dari) dictionary dengan informasi sesuai field-field yang diminta.

Melanjutkan dari pembahasan mengakses OpenERP tanpa server dijalankan dan Method: search sebelumnya, kita akan menggunakan method read.

Kita akan membaca dari hasil pencarian yang dilakukan sebelumnya, namun untuk partner dengan id yang tertinggi (yang dibuat terakhir), untuk field name dan website.

>>> from openerp.addons.base.res import res_partner >>> uid = 1

>>> partner = res_partner.res_partner.create_instance(pool, cr) >>> search_result

[6, 7, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 25, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 67, 69, 70, 71, 75, 91, 92, 93, 94, 95, 96, 97, 98]

>>> read_result = partner.read(cr, uid, search_result[-1], ['name', 'website']) >>> read_result

(74)

5.11 Method: write

Method write digunakan untuk mengupdate record berdasarkan ids dan vals yang dilewatkan.

Melanjutkan dari pembahasan mengakses OpenERP tanpa server dijalankan dan Method: search sebelumnya, kita akan menggunakan method write.

Kita akan mengupdate data dari hasil pencarian yang dilakukan sebelumnya, namun untuk partner dengan id yang tertinggi (yang dibuat terakhir), dimana website akan kita update dengan nilai: http://domain.tld.

>>> from openerp.addons.base.res import res_partner >>> uid = 1

>>> partner = res_partner.res_partner.create_instance(pool, cr) >>> search_result

[6, 7, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 25, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 67, 69, 70, 71, 75, 91, 92, 93, 94, 95, 96, 97, 98]

>>> partner.write(cr, uid, search_result[-1], {'website': 'http://domain.tld'}) True

>>> read_result = partner.read(cr, uid, search_result[-1], ['name', 'website']) >>> read_result

(75)

5.12 Method: create

Method create digunakan untuk membuat record baru, dan akan mengembalikan id dari record yang dibuat.

Melanjutkan dari pembahasan mengakses OpenERP tanpa server dijalankan dan Method: search sebelumnya, kita akan menggunakan method create untuk membuat sebuah sale_order baru.

Kita akan membuat sale_order dengan customer berupa partner dengan id yang tertinggi (yang dibuat terakhir) dari hasil pencarian.

>>> so

<openerp.osv.orm.sale.order object at 0xb5407bec> >>> search_result[-1]

98 >>> uid 1

>>> create_data = {

... 'partner_id': search_result[-1], ... 'partner_invoice_id': 1,

... 'partner_shipping_id': 1, ... 'pricelist_id': 1,

... }

>>> so_id = so.create(cr, uid, create_data) >>> so_id

17L

>>> cr.commit() >>>

(76)

5.13 Method: unlink

Method unlink digunakan untuk menghapus record sesuai ids yang dilewatkan.

Melanjutkan dari pembahasan mengakses OpenERP tanpa server dijalankan dan Method: create, kita akan menggunakan method unlink untuk menghapus sale_order yang dibuat sebelumnya.

>>> so

<openerp.osv.orm.sale.order object at 0xb5407bec> >>> uid

1

>>> so_id 17L

>>> so.unlink(cr, uid, [so_id]) True

(77)

5.14 Program 5-1: menambah field

Pada contoh program 5-1, kita akan menambah beberapa field pada model res.partner. Pembahasan tentang view akan dilakukan pada bab tersendiri.

Program akan didistribusikan sebagai modul OpenERP buku_partner_nop_1. Pastikanlah modul ditempatkan pada direktori addons yang terdaftar, dan telah dilakukan update pada daftar modul.

__init__.py

from . import buku_partner_nop_1

__openerp__.py {

'name': 'Partner 1', 'version': '1.0', 'author': 'noprianto',

'description': 'Contoh sederhana tambah field pada partner', 'category': 'Buku',

'website': 'https://github.com/id-python/buku-openerp', 'depends': ['base'],

(78)

}

buku_partner_nop_1.py

from openerp.osv import orm, fields

(79)

<record model="ir.ui.view" id="view_partner_form"> <field name="name">res.partner.form</field> <field name="model">res.partner</field>

<field name="inherit_id" ref="base.view_partner_form"/> <field name="type">form</field>

<field name="arch" type="xml"> <notebook position="inside"> <page string="Buku (4-1)"> <group>

<field name="buku_field_1"/> <field name="buku_field_2"/> <field name="buku_field_3"/> <field name="buku_field_4"/> <field name="buku_field_5"/> <field name="buku_field_6"/> <field name="buku_field_7"/> <field name="buku_field_8"/> </group>

</page> </notebook> </field>

(80)

5.15 Program 5-2: readonly dan nilai default

Pada contoh program 5-2, kita akan bekerja dengan readonly dan nilai default pada field yang ditambahkan pada model res.partner. Pembahasan tentang view akan dilakukan pada bab tersendiri.

Program akan didistribusikan sebagai modul OpenERP buku_partner_nop_2. Pastikanlah modul ditempatkan pada direktori addons yang terdaftar, dan telah dilakukan update pada daftar modul.

__init__.py

from . import buku_partner_nop_2

__openerp__.py {

'name': 'Partner 2', 'version': '1.0', 'author': 'noprianto',

'description': 'Contoh sederhana readonly dan default pada field', 'category': 'Buku',

'website': 'https://github.com/id-python/buku-openerp', 'depends': ['base'],

Gambar

tabel pada database adalah res_partner. Atau, untuk model res.partner.category, tabel pada database

Referensi

Dokumen terkait

LAKIP ini memberikan gambaran tentang kinerja penyelenggaraan pemerintahan pada tahun 2014, dan sebagai evaluasi untuk peningkatan kinerja kedepan yang diformulasikan dari

Berapa model lain yang telah dikembangkan untuk mengakomodasi adanya korelasi antar alternatif pilihan antara lain Model Probit Multinomial pendekatan klasik maupun bayesian.

Materi yang dibutuhkan untuk tujuan itu meliputi konsep Manajemen Berbasis Sekolah (MBS), prinsip pengembangan Manajemen Berbasis Sekolah, strategi pelaksanaan

Banyak merk terkemuka dalam sektor mainan diproduksi di Cina dan Indonesia dan dijual dengan banyak kemasan mewah.. Tidak ada di antara produsen mainan besar seperti Mattel,

Tari merak ini dulunya merupakan sebuah tarian penyambutan selamat datang kepada seorang raja atau tamu yang dianggap penting lainnya yang dilakukan oleh minimal

Diagram Alir Analisis Data Satelit Landsat untuk Memetakan Kekeringan Dari beberapa metode yang digunakan, klasifikasi dengan menggunakan pola spektral kondisi tanaman lebih efektif

Untuk dapat menjamin hasil belajar yang baik, maka siswa harus mempunyai perhatian terhadap bahan yang dipelajarinya, jika bahan pelajaran tidak menjadi perhatian siswa,

Bapak/Ibu Dosen Fakultas Hukum Universitas Sebelas Maret Surakarta yang dengan keikhlasan dan kemuliaan hati telah memberikan bekal ilmu kepada penulis selama