Salah satu permasalahan multi currency adalah rate yang selalu berubah-ubah dan kita harus menginputnya secara periodik baik bulanan, mingguan, bahkan harian. Alhamdulillah ternyata disana -komunitas- telah membuat modul untuk memprovide kebutuhan ini, untuk mencoba anda bisa memdownload modulnya disini dan ikuti tutorial penggunaannya disini.
Sebenarnya modul diatas cukup lengkap dan powerfull, tetapi sayangnya hal ini -update rate- dilakukan hanya bersumber pada situs-situs global dunia, seperti European Central Bank, Yahoo Finance, Bank of Canada, dll. Sedangkan kita harus bersumber pada Bank Indonesia yang diambil pada situs ini : http://www.bi.go.id/id/moneter/informasi-kurs/transaksi-bi/Default.aspx
Olehkarna itu penulis mencoba mencustom modul ini agar sesuai dengan lokalisasi di Indonesia. Penulis hanya menambahkan pilihan ‘Bank Indonesia’ disalah satu sumber informasinya. Hal pertama yang dilakukan adalah dengan menambahkan pilihan ‘Bank Indonesia’ seperti dibawah ini :
class Currency_rate_update_service(osv.Model): _name = "currency.rate.update.service" _columns = { 'note':fields.text('update notice'), 'company_id' : fields.many2one('res.company', 'linked company'), 'currency_to_update' : fields.many2many('res.currency', 'res_curreny_auto_udate_rel', 'service_id', 'currency_id', 'currency to update with this service'), 'max_delta_days': fields.integer('Max delta days', required=True, help="If the time delta between the rate date given by the webservice and the current date exeeds this value, then the currency rate is not updated in OpenERP."), 'service' : fields.selection([('BankIndo_getter','Bank Indonesia'), ('Admin_ch_getter','Admin.ch'), ('ECB_getter','European Central Bank'), ('Yahoo_getter','Yahoo Finance '), ('PL_NBP_getter','Narodowy Bank Polski'), ('Banxico_getter', 'Banco de México'), ('CA_BOC_getter','Bank of Canada - noon rates')], "Webservice to use", required = True), }
Pada tampilan code diatas penulis hanya menambahkan 1 baris, yaitu (‘BankIndo_getter’,’Bank Indonesia’), pada field tipe selection dengan nama ‘service’. Setelah kita menambahkan pilihan selectionnya, kemudian kita ‘daftarkan’ pilihan tersebut pada class Currency_getter_factory() yang hasilnya seperti ini (‘BankIndo_getter’) :
class Currency_getter_factory(): def register(self, class_name): allowed = [ 'BankIndo_getter', 'Admin_ch_getter', 'PL_NBP_getter', 'ECB_getter', 'NYFB_getter', 'Google_getter', 'Yahoo_getter', 'Banxico_getter', 'CA_BOC_getter', ] if class_name in allowed: class_def = eval(class_name) return class_def() else : raise UnknowClassError
Sesuai dengan method register() diatas, maka kita diharuskan membuat sebuah class yang memiliki nama yang sesuai yang telah di daftarkan. Sehingga kita buatkan class BankIndo_getter() yang isinya seperti dibawah ini :
class BankIndo_getter(Curreny_getter_interface) : def get_updated_currency(self, currency_array, main_currency, max_delta_days): # Gunakan library urllib2 untuk request dan crawl/scrap data html dari situs BI usock = urllib2.urlopen('http://www.bi.go.id/id/moneter/informasi-kurs/transaksi-bi/Default.aspx') webpage = usock.read() usock.close() # Gunakan library beautifulsoup untuk parsing data htmlnya soup = BeautifulSoup(webpage) # Simpan datanya pada variable tables yang hasilnya sesuai pencarian dengan keyword element tables yang memiliki id dibawah tables = soup.find_all('table', id='ctl00_PlaceHolderMain_biWebKursTransaksiBI_GridView1') # Lakukan breakdown sampai kita dapatkan baris currency ratenya for table in tables: trs = table.find_all('tr') for tr in trs: datas = [tag.text.strip() for tag in tr.find_all('td')] if len(datas) == 5 and datas[0] in currency_array: # Simpan hasilnya pada varibal (dict) bawaan class ini yaitu self.updated_currency self.updated_currency[datas[0]] = float(datas[1])/float(datas[3].replace(',', '')) return self.updated_currency, self.log_info
Inti dari class BankIndo_getter() adalah mengambil informasi rate berbagai currency yang bersumber pada situs BI yang setiap harinya mengupdate currency rate. Ada perbedaan antara web BI dan web Global lainnya, yaitu web BI tidak menyediakan web service yang akan memudahkan developer untuk pengambilan ratenya, sehingga kita ‘dipaksa’ untuk membaca (grabbing) code html dari situs tersebut. Hal ini dikarenakan peraturan Bank Indonesia terkait informasi perbankan untuk public yang hingga saat ini belum dimungkinkan untuk akses langsung ke data perbankan termasuk kurs dari system public. Akibat dari hal ini kita harus melalukan coding ulang sesuai dengan perubahan interface web BI tersebut.
Mungkin ini saja yang bisa sampaikan ditengah menunggu waktu berbuka puasa. Selamat mencoba dan Selamat berbuka puasa …
bagus sekali tutorialnya. terima aksih sudah berbagi.
btw saya coba kok Bank Indonesai tidak ada di list ya?
ini previewnya : http://prntscr.com/444vq6
apa yg salah/kurang ya?
terima kasih sebelumnya
Jangan lupa ditambahin di optionnya servicenya mas seperti contoh diatas :
Setelah itu jangan lupa di restart servernya …
terima kasih, itu td yg terlewat..restart server 😦
btw tanya 1 lagi,
saya menggunakan 3 mata uang SGD, USD dan IDR….
setting base currencynya IDR ….jadi nanti SGD dan USD jadinya 0.000083 dan 0.000104. bisa kan ya?
Iya mas, sudah otomatis terkonversi 1/rate ..
Untuk membuktikannya secara langsung (tanpa menunggu scheduler) bisa di klik button Refresh Currency …
upsa muncul error “2014-07-19 04:29:37 ERROR : global name ‘urllib2’ is not defined” kenapa ya?
Jangan lupa diimport dulu library 2 itu yaitu urllib2 dan BeautifulSoup :
import urllib2
from bs4 import BeautifulSoup
mantab…it’s work…
untuk kasus saya berarti hanya SGD dan USD saja yg perlu di update ya? atau IDR juga perlu?
Sip mas, cukup SGD & USD saja, intinya yang selain base currency ….
kalo misalkan, ada kesalahan rate mas.. misalnya rate pertama 0,0098— kemudian bikin invoice
lalu ada koreksi rate menjadi 0,0070, nasib invoice yang sudah dibuat gimana ya? post jurnal nya apa berubah atau tidak
Ada 2 cara :
1. Edit ratenya secara manual lalu cancel invoicenya dan validate kembali, maka jurnal yg baru akan terbuat
2. Langsung edit manual jurnalnya di menu jurnal entries sesuai rate yg benar
Semoga membantu…
pa udah ada module untuk odoo 8 nya gak ya? , makasih
Belum ada, tapi modul ini bisa digunakan untuk v8 dengan beberapa pengeditan …
selamat sore,
untuk odoo 9 apakah ada tutorialnya?
terima kasih
Insya Allah langsung odoo 10 …
nice tutorial !!!
selamat siang, apakah ada cara utk melakukan purchase order di odoo versi 8 dengan otomatis dengan data sesuai dari file purchase order sebelumnya ? terima kasih
Bisa, dengan button duplicate di form Purchase Order