Bismillah...
Assalamu'alaikum Warohmatullah Wabarokatuh,
Pada kesempatan kali ini saya akan membahas tentang postingan lanjutan dari postingan sebelumnya mengenai integrasi Odoo - Oracle, yaitu bagaimana cara melempar data (push) dari database postgres ke Oracle melalui Odoo.
Saya asumsikan pembaca sudah mengerti tentang teknik custom Odoo dan sudah membaca postingan saya sebelumnya mengenai "Integrasi Database Oracle dengan Odoo" dan "Pull Data Dari Database Oracle ke Odoo".
Konsep push data dari odoo ke oracle yang saya contohkan ini menggunakan konsep single push data, maksudnya setiap record user yang dibuat manual di Odoo akan di-push ke Oracle dengan melakukan klik sebuah button di odoo. Pembaca bisa mengembangkannya agar bisa melakukan push data secara massal dengan menggunakan metode looping di dalam python.
Untuk studi kasus kali ini, saya menggunakan versi odoo yang sama (odoo 10) dan table yang sama (Table User) dengan postingan sebelumnya. Jadi kita lanjutkan saja di modul sebelumnya yang kita buat untuk pull data dari oracle.
Berikut ini langkah - langkahnya :
1. Buka kembali folder project yang kita buat menggunakan text editor, kita tambahkan script python untuk push data user dari odoo dan menambahkan field state untuk mengetahui apakah sudah ter-posted atau belum ke database Oracle di path file ab_users_oracle_sync/models/models.py.
from odoo import models, fields, api
from odoo.exceptions import ValidationError, UserError
from datetime import datetime, timedelta
class Users(models.Model):
_inherit = 'res.users'
oracle_state = fields.Selection([('draft','Unposted'),('posted','Posted')], 'State', default='draft')
@api.multi
def transfer_to_oracle(self):
ex_db = self.env['base.external.dbsource']
baan = ex_db.search([('name','=','BAAN')])
sql = """
SELECT T$USER FROM baan.tuser001111 where T$USER = '%s'
""" % self.login
cols = baan.execute(sql,False,True)['cols']
rows = baan.execute(sql,False,True)['rows']
if rows:
raise UserError('User %s dengan login %s sudah ada di Oracle' % (self.name, self.login))
header = """
T$USER, T$NAME, T$PASS
"""
values = """'%s', '%s', '%s'
""" % (
self.login,
self.name,
self.password
)
sql = """
INSERT INTO baan.tuser001111 (%s) VALUES (%s)
""" % (header, values)
try:
baan.execute_cx_Oracle(sql,False,False)
self.write({'state':'posted'})
except Exception, e :
raise UserError(e)
2. Inherit tampilan form User di Odoo untuk menambahkan button "Post" dan field state, kita tambahkan script xml di path file ab_users_oracle_sync/views/views.xml.
<odoo>
<data>
<record model="ir.ui.view" id="view_users_form_inherit">
<field name="name">res.users.inherit</field>
<field name="model">res.users</field>
<field name="inherit_id" ref="base.view_users_form" />
<field name="arch" type="xml">
<xpath expr="//header" position="inside">
<button name="transfer_to_oracle" type="object" string="Post" attrs="{'invisible': [('oracle_state','!=','draft')]}" class="oe_highlight" icon="fa-upload"/><br/>
<field name="oracle_state" widget="statusbar" nolabel="1" statusbar_visible="draft,posted"/>
</xpath>
</field>
</record>
</data>
</odoo>
3. Buat Record user baru di odoo dan klik button "Post". Jika tidak ada pesan error atau warning yang muncul dan status user berubah menjadi "Posted", maka proses push data user ke database oracle berhasil dilakukan.
Terima kasih, semoga bermanfaat.
Kahfi
Wassalamu'alaikum Warohmatullah Wabarokatuh.