Pull Data Dari Database Oracle ke Odoo

Odoo image and text block

Bismillah...

Assalamu'alaikum Warohmatullah Wabarokatuh,

Melanjutkan dari Postingan saya sebelumnya mengenai "Integrasi Database Oracle dengan Odoo", pada kesempatan kali ini saya akan berbagi sedikit ilmu yang saya miliki masih dalam tema yang sama, yaitu bagaimana cara menarik data (pull) dari database Oracle ke Postgres melalui Odoo.

Pastkan Odoo sudah terhubung dengan database Oracle dengan menggunakan addons tambahan yang sudah saya uraikan di postingan sebelumnya.

Sedikit informasi, untuk integrasi terkait postingan ini pernah saya implementasikan di salah satu perusahaan Astra Group di Cakung, Jakarta Timur, dimana saya mengintegrasikan Odoo v10 dengan Aplikasi yang existing disana yaitu BAAN ERP (Aplikasi ERP Berbasis Desktop yang berbayar atau licensed).

Saya mengasumsikan bahwa pembaca sudah mengerti bahasa pemrograman python, serta teknik custom addons di odoo 10.

Jika belum, silahkan pelajari dulu bahasa pemrograman python di https://codesaya.com/python/ dan https://www.codecademy.com/learn/learn-python, serta technical documentation untuk custom odoo versi 10 dari part 1 sampai part 11 di http://tutorialopenerp.wordpress.com/.

Untuk studi kasus, saya menggunakan odoo 10 dan saya akan coba pull data dari table user yang ada di database oracle. 


Berikut ini langkah - langkahnya :


1. Buat scaffold addons baru di terminal, contoh saya beri nama ab_users_oracle_sync

# python [path_source_odoo]/odoo-bin scaffold -t default [nama_modul] [path_addons]

$ python ~/odoo/odoo-10.0/odoo-bin scaffold -t default ab_users_oracle_sync ~/odoo/addons/DEMO10/


2. Buka folder project kita menggunakan text editor, disini saya menggunakan sublime dan nama folder project saya misalkan DEMO10. Jika poin 1 berhasil dijalankan, maka akan muncul folder addons baru dengan nama ab_users_oracle_sync seperti gambar.


Odoo image and text block


3. Buat wizard untuk pull data dari odoo dengan membuat class baru dan method untuk pull data di python, bisa kita tambahkan di path file ab_users_oracle_sync/model/models.py

from odoo import models, fields, api, exceptions
from odoo.exceptions import ValidationError, UserError 

class WizardUpdateUsers(models.TransientModel):         _name = 'wizard.update.users' @api.multi def sync_to_oracle(self):     ex_db = self.env['base.external.dbsource']     obj_user = self.env['res.users']     
            baan = ex_db.search([('name','=','BAAN')]) # Cari connector ke database oracle, disini saya beri nama BAAN     if not baan: raise UserError('Please create Database Connector with named BAAN in Setting > Database Sources')     if len(baan) > 1: # Jika connector lebih dari satu, maka ambil satu saja baan = baan[0] 
          
            # Buat query SQL ke table user di oracle
            sql = """     SELECT * FROM baan.tuser001111 """     # Pull data user yang ada di Odoo (Postgres) supaya tidak ada duplikasi data dari oracle
            user_dict = {}     users = obj_user.search([])     for user in users:         user_dict[user.login] = user.id     cols = baan.execute(sql,False,True)['cols'] # Eksekusi query SQL dan menyimpan hasilnya ke variabel list yang berisi kolom (field) saja     rows = baan.execute(sql,False,True)['rows'] # Eksekusi query SQL dan menyimpan hasilnya ke variabel list yang berisi record / value saja
            for rec in rows:         # Jika record user dari oracle tidak ada di odoo, maka akan create record user baru ke odoo
                if rec[cols.index('T$USER')] not in user_dict:    
                    user = obj_user.create({     'name': rec[cols.index('T$NAME')],     'login': rec[cols.index('T$USER')],     'password': rec[cols.index('T$PASS')],             })     user.partner_id.write({     'email': rec[cols.index('T$MAIL')]     })     user_dict[user.login] = user.id
         # Jika record user ada di odoo, maka akan mengupdate saja
                else:     user = obj_user.browse(user_dict[rec[cols.index('T$USER')]])     user.write({ 'name': rec[cols.index('T$NAME')], 'login': rec[cols.index('T$USER')], 'password': rec[cols.index('T$PASS')],         })     user.partner_id.write({     'email': rec[cols.index('T$MAIL')]     }) 


4. Buat tampilan (view) wizard di file xml, bisa kita tambahkan di path file ab_users_oracle_sync/views/views.xml

<record model="ir.ui.view" id="wizard_update_users_view">
    <field name="name">wizard.update.users.form</field>
    <field name="model">wizard.update.users</field>
    <field name="arch" type="xml">
      <form string="Update Users From BAAN">
        <separator string="Users Update Result"/>
        <group>
            <label string="Click on Update below to start the process..."/>
        </group>
        <footer>
          <button name="sync_to_oracle" type="object" string="Update" class="oe_highlight"/>
          or
          <button special="cancel" string="Batal"/>
        </footer>
      </form>
    </field>
  </record>

  <act_window id="launch_update_wizard"
        name="Update Users From BAAN"
        res_model="wizard.update.users"
        view_mode="form"
        target="new"
        key2="client_action_multi"/>

  <menuitem id="wizard_menu_update_users" name="Update Users" parent="base.menu_users" action="launch_update_wizard"/>

5. Jalankan proses penarikan data, setting > users > Update Users. Klik update, jika tidak ada pesan error yang muncul dan wizard ter-close, maka proses penarikan data berhasil dilakukan.

Odoo image and text block

Terima kasih, semoga bermanfaat.

Kahfi

Wassalamu'alaikum Warohmatullah Wabarokatuh.