1 DASAR-DASAR OPENERP: SISI TEKNIKAL DAN CONTOH KASUS oleh: Noprianto Whisnu Budhysantika Widoyo "Beberapa kelebihan buku ini: ditulis oleh para progr...
DASAR-DASAR OPENERP: SISI TEKNIKAL DAN CONTOH KASUS 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
Buku tersedia bebas di https://github.com/id-python/buku-openerp
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus 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/idpython/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) Noprianto
1/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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.2 Manifest __openerp__.py..............................................................................................................28 3.3 File-file dalam modul....................................................................................................................28 3.4 Lingkungan OpenERP...................................................................................................................29 3.5 Lokasi Modul................................................................................................................................30 3.6 Update daftar modul......................................................................................................................31 3.7 Mencari dari daftar modul.............................................................................................................31 3.8 Langkah berikut.............................................................................................................................31 4. Kasus: Perusahaan Rental Kendaraan..................................................................................................33 4.1 Pendahuluan..................................................................................................................................33 Periode............................................................................................................................................33 Tipe Penggunaan.............................................................................................................................33 4.2 Langkah implementasi..................................................................................................................34 Setup Identitas Perusahaan.............................................................................................................34 Memasang Modul...........................................................................................................................35 Terjemahan Bahasa Indonesia........................................................................................................35 Kode Rekening...............................................................................................................................35 Data Awal........................................................................................................................................37 Operasi............................................................................................................................................41 Laporan...........................................................................................................................................45 5. Model pada OpenERP..........................................................................................................................49 5.1 Hirarki class...................................................................................................................................49 5.2 orm.Model, osv.Model dan osv.osv...............................................................................................51 2/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus 5.3 Atribut............................................................................................................................................52 5.4 Atribut: _columns..........................................................................................................................54 Nama field spesial...........................................................................................................................54 Class _column.................................................................................................................................54 Tipe field: boolean..........................................................................................................................55 Tipe field: integer............................................................................................................................55 Tipe field: reference........................................................................................................................55 Tipe field: char................................................................................................................................56 Tipe field: text.................................................................................................................................56 Tipe field: html...............................................................................................................................56 Tipe field: float...............................................................................................................................56 Tipe field: date................................................................................................................................57 Tipe field: datetime.........................................................................................................................57 Tipe field: binary............................................................................................................................57 Tipe field: selection........................................................................................................................58 Tipe field: many2one......................................................................................................................59 Tipe field: one2many......................................................................................................................59 Tipe field: many2many...................................................................................................................60 Tipe field: function.........................................................................................................................60 Tipe field: related............................................................................................................................61 Tipe field lain..................................................................................................................................61 5.5 Atribut: _constraints......................................................................................................................62 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 6.7 Form: attrs dan atribut lain..........................................................................................................100 3/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus 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 7.1 Definisi........................................................................................................................................115 7.2 Report dengan RML....................................................................................................................117 7.3 Kerangka RML............................................................................................................................118 7.4 Report pada model.......................................................................................................................119 7.5 Custom parser..............................................................................................................................122 7.6 Wizard.........................................................................................................................................127 8. Tip dan Trik........................................................................................................................................134 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.3 XML-RPC dan Python................................................................................................................148 9.4 Pustaka oerpapi............................................................................................................................149 OErpClient....................................................................................................................................149 OErpModel...................................................................................................................................150 OErpDb.........................................................................................................................................152 OErpReport...................................................................................................................................154 Exception......................................................................................................................................155 Memeriksa hasil login...................................................................................................................156 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 9.11 Menggunakan xmlrpclib............................................................................................................174 10. Lampiran: Python Dasar..................................................................................................................177 Tentang dokumen ini.........................................................................................................................177 10.1 Penulisan source code...............................................................................................................178 10.2 Sekilas tentang Python..............................................................................................................180 10.3 Interpreter Python (interaktif)...................................................................................................181 10.4 Script Python.............................................................................................................................182 4/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus 10.5 Tipe builtin, collection dan operator..........................................................................................183 Collection......................................................................................................................................186 Operator........................................................................................................................................187 10.6 Kondisi......................................................................................................................................190 Sintaks if.......................................................................................................................................190 10.7 Perulangan.................................................................................................................................192 Sintaks for.....................................................................................................................................192 Sintaks while.................................................................................................................................192 Catatan..........................................................................................................................................193 10.8 Fungsi........................................................................................................................................194 Deklarasi fungsi............................................................................................................................194 Documentation String (docstring)................................................................................................194 Pemanggilan fungsi......................................................................................................................195 Variabel global..............................................................................................................................195 Argumen fungsi............................................................................................................................197 Argumen default...........................................................................................................................198 Argumen *arg (tuple)....................................................................................................................199 Argumen **arg (dictionary).........................................................................................................200 10.9 Class..........................................................................................................................................202 10.10 Modul-modul...........................................................................................................................212 Contoh modul...............................................................................................................................213 Search path....................................................................................................................................216 Compiled module..........................................................................................................................216 Nama module................................................................................................................................216 Package.........................................................................................................................................217 10.11 Exception.................................................................................................................................220 Try...except...finally......................................................................................................................220 Try...finally...................................................................................................................................223 Informasi exception......................................................................................................................223 Membangkitkan exception............................................................................................................224 10.12 File...........................................................................................................................................225 Membuka dan menutup file..........................................................................................................225 Membaca isi file...........................................................................................................................226 Menulis ke file..............................................................................................................................228 Statement with..............................................................................................................................229
5/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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: • CRM • Social Network • eInvoicing & Payments • Point of Sale • Project Management • Issue Tracker • Accounting and Finance • Sales Management • Warehouse Management • MRP • Purchase Management • Employee Directory • Timesheets • Leave Management • Expense Management • Assets Management • Payroll Kesemua modul yang terinstall dirancang untuk dapat saling terhubung.
6/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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. Jika sudah pernah menginstall komponen OpenERP sebelumnya, maka disarankan untuk dilakukan uninstall terlebih dahulu, sebab beberapa komponen dari instalasi sebelumnya dapat menghambat proses instalasi baru. Pastikan bahwa semua komponen dari OpenERP dan PostgreSQL sebelumnya terhapus. 7/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
Klik ganti pada file installer untuk menginstall OpenERP dan Accept semua parameter default, seperti pada contoh berikut. 1. 2. 3. 4. 5.
Pilih Bahasa → English Welcome Box Licence Agreement Pilih komponen yang akan diinstall (Pilih semua komponen) 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): sudo apt-get install postgresql postgresql-client pgadmin3 python-dateutil python-feedparser pythongdata python-ldap python-libxslt1 python-lxml python-mako python-openid python-psycopg2 pythonpybabel python-pychart python-pydot python-pyparsing python-reportlab python-simplejson python8/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus 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
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> Pastikanlah pengaturan authentication (contoh: /etc/postgresql/9.3/main/pg_hba.conf) telah dilakukan dengan baik.
9/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus 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: • File konfigurasi terletak di /etc/openerp/openerp-server.conf • Service openerp dapat digunakan untuk start/stop server OpenERP.
10/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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. Duplicate 11/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus 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 • Load a Translation, memilih bahasa yang akan dipergunakan
12/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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 • Aktiflah pada tab Access Rights • Aktifkan pilihan Technical Features • Klik tombol Save
13/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
Ketika kita melakukan reload halaman, maka menu lain akan tersedia pada Settings.
14/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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 • Products, berisi data produk yang dimiliki.
15/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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. • Suppliers, berisi data supplier. Dibeberapa sistem bagian ini disebut Master Vendor.
16/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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. • Sales Receipts Analysis, berisi laporan analisis Sales Receipts.
17/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
18/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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.
Untuk mengaktifkan fasilitas ini, bisa dengan cara mengakses menu About OpenERP (terdapat di drop down menu user yang login), lalu klik link Activate the developer mode pada dialog yang ditampilkan.
19/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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. • JS Test, berfungsi untuk melakukan debugging terhadap seluruh modul yang ada dalam sebuah database. Kita akan diminta untuk menginput data nama database, password untuk mengakses database tersebut dan admin password-nya. Selanjutnya adalah proses pengecekan modul oleh OpenERP dan setelah selesai akan terlihat hasilnya. Bila ditemukan error, maka akan ditandai 20/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
• • •
•
•
• • • • • •
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. Edit Action, berfungsi untuk melakukan pengubahan pada action. Edit Workflow, berfungsi untuk melakukan CRUD terhadap workflow. Print Workflow, berfungsi untuk melakukan printing terhadap workflow.
21/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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 Saat kita membuka Manage Views, fasilitas ini akan langsung memberikan petunjuk di view mana sekarang ini kita sedang berada (selected radio button), sebab secara default semua view yang berkaitan akan ditampilkan. Kita tidak perlu memilih view yang lainnya (kecuali kita tahu). Kita tinggal klik tombol edit.
22/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
Semua field yang aktif, ditampilkan dalam format XML . 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. Saat mengkilk icon plus (+), kita akan dihadapkan ke sebuah dialog yang meminta kita untuk menginput data Node Type (pilih field) dan Position, selanjutnya klik tombol New Field untuk membuat field baru ataupun memilih field yang telah dibuat sebelumnya untuk menambahkan field pada view.
23/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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. • Read Only, bila dipilih, maka field ini akan menjadi field yang tidak bisa diubah isi defaultnya. • Translatable, bila dipilih, dapat diterjemahkan.
24/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
25/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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. • Icon panah hijau mengarah ke bawah: untuk pengaturan urutan tampilan field. Bila icon ini di klik maka field tersebut akan turun ke urutan tampilan di bawah dari sebelumnya.
26/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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. Selain itu, terdapat kustomisasi yang lebih kompleks, yang hanya dapat dilakukan lewat pemrograman dengan Python.
27/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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 Untuk bekerja dengan suatu model, umumnya kita tempatkan dalam sebuah modul Python tersendiri (file .py). Modul tersebut kemudian kita import dari __init__.py.
28/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus 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 doc install openerp openerp.egg-info win32 LICENSE MANIFEST.in openerp-server PKG-INFO README setup.cfg setup.nsi setup.py setup_rpm.sh
Kita bisa melihat satu direktori openerp. Ini merupakan sebuah paket Python: $ ls -1 --group-directories-first openerp addons cli conf modules osv report service tests tools workflow exceptions.py import_xml.rng __init__.py loglevels.py netsvc.py PKG-INFO pooler.py release.py sql_db.py
29/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus Kita akan banyak bekerja dengan osv: $ ls -1 --group-directories-first openerp/osv/ expression.py fields.py __init__.py orm.py osv.py query.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 diset 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: $ file openerp/addons/ openerp/addons/: directory $ ls -1 openerp/addons/ | head -n10 account account_accountant account_analytic_analysis account_analytic_default account_analytic_plans account_anglo_saxon account_asset account_bank_statement_extensions
30/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus 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. Mulailah dengan mengembangkan satu modul sederhana, yang menambahkan satu field pada satu 31/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
• •
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.
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. Untuk informasi tentang model, kita akan membahasnya di bab 5.
32/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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 3. Service rutin
33/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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 laporanlaporan 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 lainlain. Untuk rekening bank, bisa lebih dari satu. • Configuration: Berisi mata uang dan masalah logistik. • Overdue Payments: Berisi template untuk pelanggan bila terjadi keterlambatan membayar tagihan.
34/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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. Lalu untuk mendapatkan daftar kode rekening, klik menu Akuntansi → Configuration → Akun → Templates → Akun → Account Templates.
35/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
36/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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 Untuk menambahkan produk jual, klik pada menu POS → Produk → Produk, kemudian klik tombol Create.
37/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus 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 Untuk menambah kendaraan, klik menu Fleet → Vehicle → Vehicle, kemudian klik tombol Create.
38/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
Kendaraan yang telah ditambahkan akan tampil pada daftar kendaraan.
39/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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. Data pelanggan dapat dilihat dari menu Sales → Sales → Customers.
40/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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 Pencatatan sewa kendaraan dapat dimulai dari membuat penawaran yang dilakukan melalui menu Sales → Sales → Order Penjualan dan klik tombol Create.
41/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
Setelah selesai mengisi data-data, lalu klik tombol Confirm Sale. Setelah ini, maka kita bisa membuat tagihan / faktur. Setelah Buat Faktur, lalu View Invoice dan klik tombol Validasi, maka faktur sudah final yang dapat dicetak untuk pelanggan sebagai bahan tagihan.
42/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
Untuk mencatat penerimaan pembayaran, klik tombol Register Payment. Pada dialog yang ditampilkan, isikan pembayaran dan klik tombol Pay.
43/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
Hal ini akan membuat status dari penjualan ini sudah terbayar.
Pencatatan Biaya Kendaraan
44/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
Laporan Ada berbagai laporan keuangan dapat dihasilkan dari openERP. Berikut ini beberapa screenshot yang mungkin berkaitan dengan Laporan. Laporan dapat diakses dari menu Reporting. Dashboard Laporan
45/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
Laporan Biaya Kendaraan (Fleet Cost)
46/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
Laporan Analisa Penjualan
Laporan Akuntansi
47/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
48/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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. Dengan komentar tidak disertakan, ini adalah definisi seutuhnya dari class Model.
49/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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 >>> osv.Model >>> >>> >>> from openerp.osv import orm >>> orm.Model >>> >>>
Walaupun kita tetap bisa menggunakan osv.osv, untuk kode baru yang ditujukan untuk dijalankan pada OpenERP versi baru, kita akan menggunakan orm.Model.
51/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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
_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'
_sequence
None
_description
None
_needaction
False
_group_by_full
{}
Apabila True, maka tabel akan dibuat secara otomatis.
Field untuk keperluan sort
52/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus Atribut _transient
Default
Catatan
False
_inherit
[Pada inheritance tradisional] merupakan _name dari business object parent (wajib, apabila kita menurunkan).
_inherits
{}
_inherit_fields
{}
_all_columns
{}
_table
None
_invalids
set()
_log_access
Apabila tidak Apabila True, maka 4 field akan dibuat ditentukan, maka otomatis: create_uid, create_date, write_uid, nilai diambil write_date, untuk keperluan log. berdasarkan _auto, dengan default adalah True
_log_create
False
Nama tabel database. Secara default adalah _name dengan titik diganti dengan underscore.
_sql
SQL code untuk membuat table/view apabila _auto adalah False.
Beberapa atribut akan dibahas secara khusus pada bagian-bagian berikut. 53/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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
Nama field spesial Terdapat beberapa nama field spesial yang tidak dapat digunakan (beberapa akan dibuat secara otomatis oleh sistem): id, name, active, sequence, state, parent_id, parent_left, parent_right, create_date, create_uid, write_date, write_uid.
Class _column 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', '_classic_read', '_classic_write', '_context', '_deprecated', '_domain', '_multi', '_obj', '_prefetch', '_properties', '_symbol_c', '_symbol_f', '_symbol_get',
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. Class dan constructor: 55/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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 Merupakan tipe dasar, digunakan untuk menampung bilangan floating point. 56/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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 Merupakan tipe dasar. Sesuai konvensi legacy OpenERP adalah untuk transfer/menyimpan data biner sebagai string dalam encoding base64. Sebagai contoh adalah isi file binary. 57/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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. Contoh (cuplikan dari program 5-1): … … … SELECTION_1 = [ ('pilihan1', 'Pilihan 1'), ('pilihan2', 'Pilihan 2'), ('pilihan3', 'Pilihan 3'), ] SELECTION_2 = [ ('pilihan4', 'Pilihan 4'), ('pilihan5', 'Pilihan 5'), ('pilihan6', 'Pilihan 6'), ('pilihan7', 'Pilihan 7'), ('pilihan8', 'Pilihan 8'), ('pilihan9', 'Pilihan 9'), ('pilihan10', 'Pilihan 10'), ]
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
… … … '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', ondelete='cascade', select=True, [('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). Contoh (cuplikan dari openerp/addons/sale/sale.py): 59/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus 'order_line': readonly=True, 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', id2='category_id', string='Tags'),
id1='partner_id',
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: … … … def _function_test(self, cr, uid, ids, field, arg, context=None):
60/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus res = {} for i in ids: res[i] = random.random() return res _columns = { }
… … … 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. Class dan constructor: class related(function) | __init__(self, *arg, **args) Salah satu contoh tipe field ini yang dapat ditemukan pada OpenERP adalah field country_id dan country pada res.partner. Contoh (cuplikan dari openerp/addons/base/res/res_partner.py): '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) • dummy(function) • serialized(_column) • property(function) 61/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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. Ketika kita memberikan input pada user interface OpenERP, pesan kesalahan akan ditampilkan apabila input tidak sesuai kriteria.
62/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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.
Apa yang kita lakukan dengan _name sama dengan _inherit adalah class inheritance, yang kita gunakan dalam bab ini. Alternatif adalah: 63/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus • •
_name tidak sama dengan _inherit (inheritance by prototype) dimana data disimpan pada tabel lain. Menggunakan _inherits (inheritance by delegation).
64/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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__
Kalau kita cermati argumen fungsi, kita akan menemukan beberapa yang umum seperti berikut. 66/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus 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 Untuk bekerja dengan model lain, kita bisa menggunakan self.pool.get(nama_model).
67/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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 >>> pool >>>
Setelah itu, untuk langkah ketiga, kita melakukan inisialisasi kursor database: >>> cr = db.cursor() >>> cr >>>
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 openerp/addons/sale/sale.py: Python script, ASCII text executable, with very long
68/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus 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 >>>
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. Selanjutnya, kita tinggal menggunakan method dari Model. Kita akan membahasnya di beberapa bagian berikut.
69/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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 [98, 69, 6, 50, 53, 17, 43, 70, 11, 55, 13, 36, 71, 16, 18, 32, 40, 7, 75, 91, 44, 37, 67, 92, 58, 56, 25, 52, 39, 41, 38, 29, 54, 61, 49, 47, 57, 48, 15, 64, 12, 31, 19, 60, 21, 63, 35, 62, 42, 34, 51, 59, 65, 46, 28, 95, 96, 97, 14, 22, 30, 27, 45, 93, 94, 33] >>> search_result.sort() >>> 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] >>>
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): '&', '|', ('name', 'ilike', 'tes'), ('id', '<', 3), ('website', '=', '')
70/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
Dan, kita tempatkan pada sebuah list: ['&', '|', ('name', 'ilike', 'tes'), ('id', '<', 3), ('website', '=', '')]
71/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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 {'website': False, 'name': u'A', 'id': 98} >>>
72/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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 {'website': u'http://domain.tld', 'name': u'A', 'id': 98} >>>
73/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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 >>> 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() >>>
Perhatikanlah bahwa kita memanggil fungsi commit dari kursor koneksi database.
74/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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 >>> uid 1 >>> so_id 17L >>> so.unlink(cr, uid, [so_id]) True >>> cr.commit() >>>
75/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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.
'buku_field_1': fields.char('Buku Field 1', size=20, required=True, help='Contoh help'), 'buku_field_2': fields.float('Buku Field 2', digits=(4, 2)), 'buku_field_3': fields.integer('Buku Field 3', size=10), 'buku_field_4': fields.boolean('Buku Field 4'), 'buku_field_5': fields.date('Buku Field 5'), 'buku_field_6': fields.datetime('Buku Field 6'), 'buku_field_7': fields.selection(SELECTION_1, 'Buku Field 7'), 'buku_field_8': fields.selection(_get_selection_2, 'Buku Field
}
buku_partner_nop_1_view.xml
77/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus res.partner.formres.partnerform <notebook position="inside"> <page string="Buku (4-1)">
78/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
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.
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
5.16 Program 5-3: constraint Pada contoh program 5-3, kita akan bekerja dengan constraint 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_3. Pastikanlah modul ditempatkan pada direktori addons yang terdaftar, dan telah dilakukan update pada daftar modul.
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
83/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
5.17 Program 5-4: field functional Pada contoh program 5-4, kita akan menambahkan field functional pada model res.partner. Pembahasan tentang view akan dilakukan pada bab tersendiri. Program akan didistribusikan sebagai modul OpenERP buku_partner_nop_4. Pastikanlah modul ditempatkan pada direktori addons yang terdaftar, dan telah dilakukan update pada daftar modul. __init__.py from . import buku_partner_nop_4
buku_partner_nop_4.py import random from openerp.osv import orm, fields class res_partner(orm.Model): _name = 'res.partner' _inherit = 'res.partner' def _function_test(self, cr, uid, ids, field, arg, context=None): res = {} for i in ids: res[i] = random.random() return res _columns = {
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus res.partner.formres.partnerform <notebook position="inside"> <page string="Buku (4-4)">
85/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
5.18 Program 5-5: method create/write Pada contoh program 5-5, kita akan melakukan override method create dan write milik model res.partner. Program akan didistribusikan sebagai modul OpenERP buku_partner_nop_5. Pastikanlah modul ditempatkan pada direktori addons yang terdaftar, dan telah dilakukan update pada daftar modul. __init__.py from . import buku_partner_nop_5
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
6. Dasar-dasar View Penulis: Noprianto Pada bab-bab sebelumnya, kita telah melihat view yang didefinisikan dalam file-file XML. Di bab ini, kita akan membahas lebih lanjut tentang dasar-dasar view pada OpenERP. Termasuk bagaimana menambahkan menu/menu item. OpenERP mendukung beberapa macam tipe view. Namun, kita hanya akan membahas tentang form dan tree. Form digunakan untuk menampilkan suatu record secara detil. Sementara, tree digunakan untuk menampilkan beberapa record sekaligus (list). Keduanya dapat pula digunakan untuk menambahkan/mengedit data, walau pada tree, ini akan lebih terbatas. Pembahasan akan dilakukan langsung pada contoh modul. Catatan: definisi view umumnya ditempatkan dalam sub direktori view dalam modul.
6.1 Kerangka Berikut ini adalah kerangka definisi view dalam sebuah file XML: <definisi view> …. …. …. <definisi view>
Di dalam bab ini, kita akan menggunakan tag-tag berikut: • dengan atribut model=”ir.ui.view”, untuk mendefinisikan view itu sendiri. • dengan atribut model=”ir.actions.act_window”, untuk link action ke view. • <menuitem>, untuk membuat entri pada menu dan link ke action. Contoh 1:
… … …
87/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
Contoh 2:
… … …
Contoh 3:
… … …
Contoh 4: <menuitem name="Buku" id="menu_buku"/>
Di dalam setiap , kita umumnya bekerja dengan tag dengan berbagai atribut, name="inherit_id" ref="base.view_partner_form"/> name="arch" type="xml">
… … …
Mari kita lihat lebih lanjut dalam contoh pembahasan modul.
88/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
6.2 Field pada model Untuk merujuk pada suatu field pada model, kita menggunakan tag dengan atribut name=”nama_field”, sebagai contoh:
Lebih lanjut, terdapat sejumlah atribut tambahan yang bisa diberikan pada tag ini, yang mana akan memiliki arti/efek. Contoh 1:
Contoh 2:
Contoh 3:
Contoh 4:
89/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
6.3 Inheritance pada view Ketika kita menurunkan dari suatu model, misal untuk menambah field, kita umumnya fokus pada apa yang kita tambahkan tersebut. Walau, tentu saja, kita selalu bisa merujuk pada field-field yang ada sebelumnya. Begitupun juga dengan view. View dapat diturunkan, dan kita bisa fokus pada perubahan spesifik yang ingin kita lakukan. Perubahan spesifik yang dimaksud tidak harus selalu mendefinisikan bagaimana field yang kita tambahkan, dapat ditampilkan. Kita tidak harus selalu menambahkan field dan mendefinisikan pada view. Ketika menurunkan dari suatu view, kita bisa mengubah apa yang telah didefinisikan sebelumnya. Dengan demikian, sama seperti pada model, ketika kita ingin mengubah suatu view yang ada, kita tidak edit langsung. Tapi, kita turunkan dan lakukan perubahan pada apa yang kita kerjakan. Untuk menurunkan, kita perlu mengetahui id sebuah view. Salah satu cara nyaman untuk mengetahui id suatu view aktif adalah dengan mengaktifkan developer mode dan memilih Manage Views pada pilihan yang ada. Untuk mencoba, bukalah informasi detil untuk partner tertentu (form). Kemudian, pilihlah Manage Views. Dari popup yang tampil, kita bisa melihat berbagai informasi yang ada, termasuk External ID. Id tersebut dapat kita gunakan pada tag dengan atribut name=”inherit_id”, seperti pada contoh berikut:
90/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
Catatan: pada saat kita mendefinisikan view, kita juga memberikan nilai id unik per modul.
91/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
6.4 Form: mengatur ulang posisi field Dalam contoh modul buku_partner_nop_6, kita bekerja pada model res.partner dan akan mengatur ulang posisi field, dimana posisi fax dan mobile akan kita tukar. Pada modul ini, kita tidak menambah field apapun pada model res.partner.
Berikut adalah definisi view selengkapnya (buku_partner_nop_6_view.xml): res.partner.formres.partner
92/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
Mari kita fokus pada blok:
Tag dapat digunakan untuk perubahan pada beberapa lokasi sekaligus.
Apa yang kita lakukan adalah: • Menghapus field fax. Menghapus dapat dilakukan dengan memberikan atribut position=”replace” (mengganti dengan sebuah elemen kosong).
•
Menambah field fax sebelum field mobile. Kita akan mulai dari field mobile dengan position=”before”, barulah mendefinisikan field fax di dalamnya.
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
6.5 Form: menambah field Dalam contoh modul buku_partner_nop_7, kita bekerja pada model res.partner dan menambahkan beberapa field. Sebagian dari field yang ditambahkan pada model, akan didefinisikan pada view, dengan pengaturan posisi tertentu.
Field yang ditambahkan (file buku_partner_nop_7.py): from openerp.osv import orm, fields class res_partner(orm.Model): _name = 'res.partner' _inherit = 'res.partner' _columns = {
File __init__.py dalam module: from . import buku_partner_nop_7
96/232
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
6.6 Form: notebook dan group Dalam contoh modul buku_partner_nop_8, kita bekerja pada model res.partner dan akan mengelompokkan beberapa field yang ditambahkan pada buku_partner_nop_7, dalam notebook dan group tersendiri.
Dasar-dasar OpenERP: sisi teknikal dan contoh kasus
Apa yang kita lakukan adalah: • Membuat sebuah notebook/tab terpisah, didefinisikan dengan <notebook> dan <page>. <notebook> <page string="contoh notebook/page">
… … …
•
Menambahkan sebuah field di dalam page tersebut. Per OpenERP versi 7.0, tidak menampilkan label, kecuali ditempatkan di dalam . Oleh karena itu, kita menggunakan