Update Currency Rate Otomatis

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 …

Advertisements

14 thoughts on “Update Currency Rate Otomatis

  1. Jangan lupa ditambahin di optionnya servicenya mas seperti contoh diatas :

    
    '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),
        
    
    

    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 …

  2. mantab…it’s work…
    untuk kasus saya berarti hanya SGD dan USD saja yg perlu di update ya? atau IDR juga perlu?

  3. 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…

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s