11 Desember 2013

Mohon maaf..

Bismillahirrahmaanirrahiim

Dear all, mohon maaf untuk komen2 yang belum sempat saya jawab.
DIkarenakan kondisi saya yang baru punya baby (udah 2 bulan sii), jadi gak sempet update2 blog ini..
Jadi, kalau ada pertanyaan, bisa email saya saja yaa..
ke siti.mawaddah@gmail.com

Terima kasih banyakk

29 Agustus 2013

Contoh Penggunaan attribut on_change dalam fields

Bismillahirrahmaanirrahiim

Tadi pagi ada yang email nanya sehubungan dengan attribut on_change..
Monggo dicoba.. ini blind code sii.. saya gak nyobain ... mudah2an gak ada yang salah...
kalau ada yang salah baru saya cobain :D

Contoh:
kita punya 3 field dengan tipe char:
field1
field2
field3

dan 1 field yang diharapkan berisi gabungan dari ketiga field di atas. Sebutlah nama fieldnya:
field_gab

Jadi contoh:
di form kita isi field berikut:
field1 = "aku"
field2 = "adalah"
field3 = "saya"

maka harapannya field_gab akan otomatis berisi: "aku adalah saya" dan perubahan isi dari ke-3 field akan otomatis meng-update field_gab tersebut.

bagaimana caranya?
manfaatkan attribut on_change

jadi di form view kita set atribut dari ke-4 field di atas.


kemudian di pythonnya kita buat method onchange_fields:

udah deh selesai.. cona direstart dan diupgrade modulnya...
ohya kenapa field_gab musti ditambahkan on_change juga?
agar tidak dimungkinkan dilakukan perubahan terhadap field tersebut...
jadi field_gab isinya tetap konsisiten gabungan dari ke-3 field sebelumnya..

semoga bermanfaat...

26 Juli 2013

[Extra] Koneksi Database MySQL dengan Python

Bismillahirrahmaanirrahiim

  • Pastikan sudah mengintal package libmysqlclient-dev dengan:
    apt-get install libmysqlclient-dev
  • DOwnload modul MySQLdb. DOwnload dari sini 
  • Instal modul tersebut dengan cara (Pastikan login sebagai root ya):
    $ gunzip MySQL-python-1.2.2.tar.gz
    $ tar -xvf MySQL-python-1.2.2.tar
    $ cd MySQL-python-1.2.2
    $ python setup.py build
    $ python setup.py install
  • Coba deh buat satu script seperti berikut (contoh: test.py):
import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","root","password","nama_database" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# execute SQL query using execute() method.
cursor.execute("SELECT VERSION()")

# Fetch a single row using fetchone() method.
data = cursor.fetchone()

print "Database version : %s " % data

# disconnect from server
db.close()
  • Terus test deh...
    python test.py
Hasilnyaaaaaaaaa

root@mawaddah-Aspire-4750:/home/mawaddah# python test.py 
Database version : 5.1.66-0ubuntu0.11.10.3


Selesai dehhhh

referensi: http://www.tutorialspoint.com/python/python_database_access.htm

12 Mei 2013

Dasar-Dasar Kustomisasi OpenERP: Menambahkan field/kolom baru

Bismillahirrahmaanirrahiim

Contoh, kebutuhan untuk menambahkan nama proyek yang berhubungan dengan expense karyawan

Maka yang perlu kita cari tahu pertama kali adalah, ada di modul apakah form tersebut.
Tentunya ada di modul hr_expense dengan tabel di database hr_expense_expense

di modul hr_expense, yang perlu diperhatikan adalah file python hr_expense.py tempat definisi tabel dan proses-proses yang terjadi.
dan file xml untuk mendefinisikan tampilan form tersebut.

terus.... kita ubahkah kedua file tersebut? BIG NO!!
Biarkan modul tersebut apa adanya, jangan menambah, mengubah, menghapus, apapun di situ...
hmm biasanya siii saya cuma menambahkan _logger.. untuk debug kalo ada bugs...

Lalu apa yang kita lakukan?

Kita buat satu modul baru ..

contoh: smcus_hr_expense 
apa itu smcus? yaa ini hanya initial nama saya saja sm(siti mawaddah) cus (custom) 
jadi untuk mempermudah mencari modul2 hasil custom kita...

SO, kita buat folder baru di dalam folder addons


terus diisi apa aja nih..
karena saya bilang ini dasar-dasar... maka cukup 4 file saja:
  • __init__.py
  • __openerp__.py
  • hr_expense.py
  • hr_expense_view.xml
__init__.py

isinya apa nih?
cukup 1 baris:
import hr_expense
hr_expense menunjukkan  nama file python yang akan digunakan yaitu hr_expense.py
kalau ada 2 file misal hr_expense_expense.py, dan keduanya digunakan ya tambahin lagi aja

import hr_expense
import hr_expense_expense

__openerp__.py


Kodenya seperti berikut ini:

-
'name': menunjukkan nama modulnya
'depends': menunjukkan modul yang terkait dengan custom modul ini. yaitu hr_expense
'data': file yang akan diikutsertakan dalam proses, bisa file xml untuk view atau file csv sebagai contoh data.
Dalam hal ini hanya file hr_expense_view.xml
'category': free text untuk memudahkan kita mencari modul yang kita sudah buat di list modul OpenERP


hr_expense.py

Di awal kita menentukan bahwa kita mau tambahkan field project, maka kita tambahkan di dictionary _columns seperti ini
-

Perhatikan baris
_inherit = 'hr.expense.expense'

'hr.expense.expense' menunjukkan nama object yang diinherit... 
Kalau kita cek di class parent nya... ada di hr_expense/hr_expense.py seperti ini:
-
di file parent nama object ditunjukkan pada baris
_name = 'hr.expense.expense'

sedangkan nama class boleh tidak sama dengan nama class parent

untuk dictionary _columns di parent object terdiri dari sejumlah field dengan berbagai variasi type. 
Selanjutnya anda dapat mempelajari masing-masing type yang dapat digunakan 
dengan mempelajari openerp development doc di 

atau bisa langsung cek aja di folder instalasi openerp
biasanya ada di /opt/openerp/openerp/doc 

cukup lengkap kok

untuk dict _defaults digunakan untuk menentukan nilai default dari setiap field... 
kalau tidak perlu ya dikosongkan saja

hr_expense_view.xml

Untuk bagian ini, kita tentukan dulu di awal field Project itu mau dimunculkan di mana saja?
di form saja, atau juga di tree dan search view

untuk saat ini kita tambahkan di form dan tree saja yaa

hmm semuanya aja deh ...

yang perlu kita cari pertama kalo adalah model view di file asli hr_expense/hr_expense_view.xml
cari nama object yang sesuai yaitu hr.expense.expense

sudah ketemu?
ya kita perhatikan

record id="view_expenses_tree" untuk tree view
record id="view_expenses_form" untuk form view

untuk yang pertama tree... sekali lagi kita perlu membuat inheritance model seperti ini:

atribut model:  diisi dengan nama object (nama tabel)yang bersesuaian
atribut inherit_id: diisi dengan "nama_modul_asli.id_view_parent"
                            karena itu kita isi dengan "hr_expense.view_expenses_tree"
nah kemudian di dalam tag dg atribut arch, kita tentukan posisi field baru yang dibuat

Kalau dilihat model view_expense_tree, kita tentukan posisi field smcus_project_name ada setelah field employee_id (Employee)

karena itu kita buat

                <field name="employee_id" position="after">
                    <field name="smcus_project_name"/>
                </field>

position dapat diisi "before" (posisi sebelum field bersangkutan) dan "replace" (menimpa field)

untuk model form
Kita tentukan posisinya ada di bawah field currency
maka kita buat model view berikut ini:


Kalau sudah, kita gabungkan tree dan form ke dalam 1 file hr_expense_view.xml berikut ini: -
Selanjutnya pastikan sudah save semua file

Restart openerp server dengan perintah:
 sudo /etc/init.d/openerp restart

Instal modul baru, dengan cara:

  1. Login sebagai admin
  2. Masuk ke menu Settings > Update Modules List, agar modul baru kita terdaftar di daftar modul di menu Settings > Installed Modules
  3. Cari modul baru yang kita buat yaitu smcus_hr_expense

    Klik install
  4. Maka kita cek di menu Human Resources > Expenses > Expenses

Selesai dehh

Selanjutnya, selamat bereksperimen dengan sejumlah dokumentasi yang ada...

Semoga bermanfaat








17 Februari 2013

Record Rules: Membatasi Hak Akses terhadap Record tertentu

Bismillahirrahmaanirrahiim

Contoh kasus:
Kebutuhan untuk membuat user Sales hanya bisa akses data customer yang dibuat sendiri oleh sales tersebut atau customer yang diset si Sales sebagai Salesperson dari customer tersebut.


Masuk ke menu Settings > Technical > Security > Record Rules

Tambahkan rules baru: 
Untuk user Sales Own Leads: hanya bisa akses data customer yang dibuat sendiri oleh user atau customer dg Salesperson user tersebut.
Lihat contoh di image berikut.




Penjelasan:
1. nama rule
2. pilih object / nama tabel: ketikkan res.partner untuk mendapatkan tabel Partner 
3. definisi aturan:
   hanya yg dibuat sendiri oleh user: create_uid=user.id
   salesperson customer adalah user: user_id=user.id
4. Nama group, jika tidak pilih maka rule berlaku global (untuk semua user)

Cek di menu: Settings > Users > Groups

lihat di group Sales Own Leads, maka di tab RUles akan muncul Record Rules baru.

Selanjutnya user di Group Sales Own Leads hanya bisa lihat customer yang dibuat sendiri oleh si user atau yg salesperson dari customer tsb adalah user tsb.

Selain di group Sales Own Leads,
juga harus disetting Record Rules untuk group Sales All Leads
karena group Sales All Leads inherit semua rules dari Sales Own Leads.

Jadi kita definisikan Record Rules: All Customer
bisa akses semua data customer. Lihat di gambar berikut:




Kemudian, dikarenakan setiap membuat data user otomatis dibuat partner terpisah. Sedangkan partner dari user tersebut tidak masuk ke dalam rules:
   hanya yg dibuat sendiri oleh user: create_uid=user.id
   salesperson customer adalah user: user_id=user.id
Sehingga data user malah tidak bisa diakses sendiri oleh Sales tersebut.

Maka untuk setting awal, setiap partner user diset Salesperson = user tersebut. 



Demikan,
semoga bermanfaat..... ^^

14 Februari 2013

Definisi Fiscal Position

Bismillahirrahmaanirrahiim

Menu: Accounting > Configuration > Taxes > Fiscal Positions

Tujuan fungsi ini adalah me-replace Pajak dan Account dari setiap produk yang sudah diset secara default ketika membuat Sales Order/ Purchase Order/ Customer Invoice/Supplier Invoice

Contoh:
Produk A memiliki income account: Penjualan Lain-Lain
dan Sale Tax: PPN 10%

Kemudian didefinisikan Fiscal Position untuk Customer ABC yang sudah ditentukan bahwa semua penjualan ke customer tersebut akan dimapping ke account Penjualan Customer ABC dengan tax PPN 10% - Include


 Kemudian untuk customer tersebut, diset default Fiscal Position Special for Schneider


Sehingga ketika akan membuat Customer Invoice, maka Account dan Tax dari setiap item akan direplace dengan tax dan account yang ditentukan di Fiscal Position

24 Januari 2013

Uncaught TypeError: Cannot read property 'message_subtype_data' of undefined

Bismillahirrahmaanirrahiim

Sering mendapatkan error message seperti judul di atas ketika pakai OpenERP versi 7.0??

Error ini ada di setiap form yg ada fasilitas message dan follower di bagian bawah. sepeti
Sales Order, Purchase Order dan lain sebagainya.......

Test nya begini.
Masuk ke menu Sales Quotation,
buka salah satu record,
lalu click tombol Create untuk membuat record baru,
maka muncul deh error berikut.



Memang tidak akan membuat miss functionalitas.. tapi kan mengganggu banget, setiap create record baru muncul pop up error message tsb

Setelah mabok semaleman sampe pagi, debug sana sini dengan kata kunci 'message_subtype_data' (terimakasih kepada pembuat tools Grep :D)
akhirnya saya menemukan kunci masalahanya.

Coba cek di file addons/mail/static/src/js/mail_follower.js

lihat di method


        display_subtypes:function (data) {
            var self = this;
            var subtype_list_ul = this.$('.oe_subtype_list');
            subtype_list_ul.empty();
            var records = data[this.view.datarecord.id || this.view.dataset.ids[0]].message_subtype_data;
            var nb_subtype = 0;
            _(records).each(function (record) {nb_subtype++;});
            if (nb_subtype > 1) {
                _(records).each(function (record, record_name) {
                    record.name = record_name;
                    record.followed = record.followed || undefined;
                    $(session.web.qweb.render('mail.followers.subtype', {'record': record})).appendTo( self.$('.oe_subtype_list') );
                });
            }
        },

Lihat yang saya highlight.. 
di situ ada kebutuhan untuk mendapatkan id record.. 

tapii.. karena yang kita lakukan adalah membuat record baru, maka tentu saja id tersebut tidak akan didapatkan alias 'Undefined'

Cek lagi errornya:
Uncaught TypeError: Cannot read property 'message_subtype_data' of undefined

Jadi... kita handle di sini deehh...

tambahkan if clause seperti berikut ini

        display_subtypes:function (data) {
            var self = this;
            var subtype_list_ul = this.$('.oe_subtype_list');
            subtype_list_ul.empty();
            if (this.view.datarecord.id>0) {
               var records = data[this.view.datarecord.id || this.view.dataset.ids[0]].message_subtype_data;
               var nb_subtype = 0;
               _(records).each(function (record) {nb_subtype++;});
               if (nb_subtype > 1) {
                   _(records).each(function (record, record_name) {
                       record.name = record_name;
                       record.followed = record.followed || undefined;
                       $(session.web.qweb.render('mail.followers.subtype', {'record': record})).appendTo( self.$('.oe_subtype_list') );
                    });
                }
            }
        },

Udah deh... jadi initinya adalah si script ingin mendapatkan data message dan follower dari form tsb.
Tapi, karena memang ini adalah data baru, maka tentunya kita buat pengecualian... karena memang belum ada data message dan follower nya kaan..

Sudah deh...
logout OpenERP nya, login kembali
trus coba lagi deh test case di atas:

Masuk ke menu Sales Quotation,
buka salah satu record,
lalu click tombol Create untuk membuat record baru,
maka muncul deh error tersebut. error tersebut tidak akan muncul lagi,

Nah begitu saja...
Mohon dicek ulang yaa..
Mudah2an bener2 sudah solved masalahnya....

Jangan lupa setelah ubah file js nya, logout dan login kembali untuk melihat perubahan..

Demikan.. semoga bermanfaat

10 Januari 2013

tidak bisa reset password

Bismillahirrahmaanirrahiim

Saat admin reset password untuk user tertentu, seharusnya akan terkirim otomatis email ke user tersebut,
tapi ternyata gagal dengan Warning:

Cannot send email: no outgoing email server configured.\nYou can configure it under Settings/General Settings

ehehehe ternyata ada package yg ketinggalan saat instal di awal
yaitu .............. python-jinja2

yuukk marii install

05 Januari 2013

Setup thousand separator

Bismillahirrahmaanirrahiim

Untuk view angka dengan separator seperti 165,000,500

Itu konfigurasinya ada di translation.

Bisa cek juga di menu berikut:

Cek di separator format nya dan thousand separator nya yaa


No such external ID currently defined in the system: product.product_product_consultant

Bismillahirrahmaanirrahiim

Jadi, ini error yg saya dapat ketika setup modul sales di menu Settings..

Cari dan mencari..

solusinya adalah:

temukan file addons/product/product_data.xml

ganti baris:

    <data noupdate="1">

menjadi
    <data>

Lalu upgrade modul product

Sekian....



04 Januari 2013

Script auto run OpenERP 7.0

Bismillahirrahmaanirrahiim


#!/bin/sh

### BEGIN INIT INFO
# Provides: openerp-server
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Should-Start: $network
# Should-Stop: $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Enterprise Resource Management software
# Description: Open ERP is a complete ERP and CRM software.
### END INIT INFO

PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/opt/openerp/openerp-7.0/openerp-server
NAME=openerp-server7
DESC=openerp-server7
CONFIG=/etc/openerp-server.conf
LOGFILE=/var/log/openerp/openerp-server-7.log
USER=openerp

test -x ${DAEMON} || exit 0

set -e

case "${1}" in
start)
echo -n "Starting ${DESC}: "

start-stop-daemon --start --quiet --pidfile /var/run/${NAME}.pid \
--chuid ${USER} --background --make-pidfile \
--exec ${DAEMON} -- --config=${CONFIG} \
   --logfile=${LOGFILE}

echo "${NAME}."
;;

stop)
echo -n "Stopping ${DESC}: "

start-stop-daemon --stop --quiet --pidfile /var/run/${NAME}.pid \
--oknodo

echo "${NAME}."
;;

restart|force-reload)
echo -n "Restarting ${DESC}: "

start-stop-daemon --stop --quiet --pidfile /var/run/${NAME}.pid \
--oknodo

sleep 1

start-stop-daemon --start --quiet --pidfile /var/run/${NAME}.pid \
--chuid ${USER} --background --make-pidfile \
--exec ${DAEMON} -- --config=${CONFIG} \
   --logfile=${LOGFILE}

echo "${NAME}."
;;

*)
N=/etc/init.d/${NAME}
echo "Usage: ${NAME} {start|stop|restart|force-reload}" >&2
exit 1
;;
esac

exit 0

---
Kemudian save sebagai misalkan openerp7 di /etc/init.d/

pastikan bisa dijalankan
/etc/init.d/openerp7 start untuk menyalakan
/etc/init.d/openerp7 stop untuk mematikan
/etc/init.d/openerp7 restart untuk restart

kalau yakin sudah berhasil lakukan perintah berikut untuk memastikan bisa auto start setiap PC dinyalakan
cd /etc/init.d/
sudo update-rc.d openerp7 defaults

01 Januari 2013

Instal Modul Baru di OpenERP 7.0

Bismillahirrahmaanirrahiim

Hmm OpenERP 7.0 memang perubahannya cukup drastis..
COntoh sederhana, biasanya di OpenERP 6.* kita dapat melihat langsung menu "Update Modules List" di bawah menu "Modules"

tapii di OpenERP7.0, tidak muncul secara default,
Jadi apa yg harus dilakukan?

Masuk ke menu Users
Edit user Administrator
Click tab "Access Rights"
Click checkbox "Technical Features"

Lalu Save, kemudian Logout... dan login kembali,,
maka di menu Settings baru deh muncul sub menu Update Module List dll nya...

Begitu dehhhh
Smeoga membantu

~udah gk konsen mau tiddur