Kalau perlu modul OpenERP yang harus membuat Invoice (supplier dan customer), mem-validasi invoice tersebut sehingga berstatus Open, lalu melakukan pembayaran terhadap Invoice tersebut, maka contoh dan langkah-langkah dibawah ini perlu dilakukan.

  1. Membuat Invoice dengan status Draft
  2. Menjalankan workflow invoice_open agar Invoice berubah status menjadi Open dan menghasilkan Journal yang sesuai
  3. Membuat Account Voucher untuk melunasi Invoice tersebut
  4. Menjalankan workflow untuk memposting jurnal pembayaran dari Voucher tersebut

Membuat Invoice Draft

Berikut ini contoh code python-nya, dengan contoh Customer Invoice (type=’out_invoice’):

invoice_id = self.pool.get(‘account.invoice’).create(cr,uid,{
    ‘date_invoice’ : date_invoice,
    ‘partner_id’ : partner_id,
    ‘account_id’ : account_id,
    ‘invoice_line’: lines,
    ‘type’: ‘out_invoice’,
    ‘journal_id’: journal_id,
    ‘company_id’: company_id
    })   

dimana:

  • date_invoice : tanggal invoice, string denagn format tanggal yyyy-mm-dd
  • partner_id: integer partner id
  • account_id : integer account id yaitu account receivable dari partner diatas
  • invoice_lines: list dari baris-baris detail invoice (lihat di bawah)
  • type: string ‘out_invoice’ atau ‘in_invoice’ (customer dan supplier invoice)
  • journal_id: integer journal id, yaitu sales journal atau purchase journal
  • company_id: integer company id dari user yang melakukan transaksi

Untuk mencari data account receivable dari suatu partner

Misalnya sudah diketahui partner_id, cari dulu object partner nya sehingga dapat diambil property_account_receivable nya:

partner = self.pool.get(‘res.partner’).browse(cr,uid,partner_id)
if not partner:
    print ‘partner not found.’
    return
account_id = partner.property_account_receivable.id

 

Untuk mencari company_id dari user yang login:

company_id = self.pool.get(‘res.users’).browse(cr, uid, uid, context=context).company_id.id

 

Untuk mencari journal id dengan type sales:

cari Journal dengan type=sale untuk suatu company_id, lalu ambil elemen pertama dari list hasil search()

journal_ids = self.pool.get(‘account.journal’).search(cr, uid,[(‘type’, ‘=’, ‘sale’), (‘company_id’, ‘=’, company_id)],limit=1)
if not journal_ids:
    raise osv.except_osv(_(‘Error!’),
        _(‘Please define sales journal for this company.’)  )
sale_journal_id = journal_ids[0]

 

Mencari product dari suatu product id:

Misal diketahui product_id, maka object product dapat dicari dengan perintah:

product         = self.pool.get(‘product.product’).browse(cr, uid, product_id, context=context)

setelah dapat object product, maka dapat diambil field-field pada product tersebut misalnya product.name, product.list_price, dll

 

Untuk membentuk invoice line list:

Siapkan list variable kosong, misalnya lines[].

Lalu isikan list lines tersebut dengan command OpenERP create one2many record, sbb:

inv_lines.append(
    (0,0,{
        ‘name’            :  product.name 
        ‘origin’        :  ‘interface records’,
        ‘sequence’        :  ”,
        ‘uos_id’        :  False,
        ‘product_id’    :  product_id,
        ‘account_id’    :  product.property_account_income.id,
        ‘price_unit’    :  product.list_price,
        ‘quantity’        :  qty,
        ‘price_subtotal’:  product.list_price * qty, 
        ‘discount’        :  0,
        ‘company_id’    :  company_id,
        ‘partner_id’    :  partner_id
    })
)

struktur tuples (0,0,{…}) diatas itu yang disebut dengan command untuk create one2many records.

ulangi proses append() untuk baris-baris berikutnya.

Setelah semua lines terisi dengan dengan diinginkan, maka variabel inv_lines dijadikan value dari field ‘invoice_line’ di invoice, sehingga baik header (invoice) dan detail (invoice_line) nya akan sekaligus disubmit ke server.

Memvalidasi Invoice

untuk membuat Invoice menjadi Open dan menghasilkan journal entries yang benar, perlu dijalankan workflow "invoice_open” terhadap object “account.invoice”.

Caranya sbb:

wf_service = netsvc.LocalService(‘workflow’)
wf_service.trg_validate(uid, ‘account.invoice’, id , ‘invoice_open’, cr)

dimana

  • id adalah invoice id yang hendak di validasi.
  • uid dan cr adalah variabel user id dan cursor bawaan OpenERP.

Membuat Journal Payment

untuk melunasi invoice, perlu dibuat journal payment, yaitu object “account.voucher” yang akan memanggil journal Account Receivable dari invoice yang akan dilunasi.

Menyiapkan voucher lines.

ada beberapa tahap yang mesti dilakukan:

  1. mencari invoice yang akan dilunasi berdasarkan id
  2. mencari baris journal  “account.move.line” yang memiliki id header “move_id” sama dengan “move_id” yang ada di invoice
  3. dari baris-baris account.move.line yang ditemukan, ambil baris pertama saja, yaitu yang berisi journal Account Receivable.

 

berikut coding python nya:

voucher_lines = []

#cari invoice
inv = self.pool.get(‘account.invoice’).browse(cr, uid, invoice_id)
#cari move_line yang move_id nya = invoice.move_id
move_line_id = self.pool.get(‘account.move.line’).search( cr, uid, [(‘move_id.id’,’=’, inv.move_id.id)] );
move_lines = self.pool.get(‘account.move.line’).browse(cr, uid, move_line_id)
move_line = move_lines[0] # yang AR saja

voucher_lines.append((0,0,{
    ‘move_line_id’:         move_line.id,
    ‘account_id’:            move_line.account_id.id,
    ‘amount_original’:        move_line.debit,
    ‘amount_unreconciled’:    move_line.debit,
    ‘reconcile’:            True,
    ‘amount’:                move_line.debit,
    ‘type’:                    ‘cr’,
    ‘name’:                    move_line.name,
    ‘company_id’:              company_id
}))

ulangin append() untuk invoice lainnya yang akan dibayarkan.

Men-create account.voucher:

setelah berhasil menyiapkan variabel list voucher_lines, berikutnya adalah membuat account.voucher.

voucher_id = self.pool.get(‘account.voucher’).create(cr,uid,{
    ‘partner_id’     : partner_id,
    ‘amount’         : amount,
    ‘account_id’    : journal.default_debit_account_id.id,
    ‘journal_id’    : journal.id,
    ‘reference’     : ‘payment #’,
    ‘name’             : ‘payment #’,
    ‘company_id’     : company_id,
    ‘type’            : ‘receipt’,
    ‘line_ids’        : voucher_lines
    })

dimana:

  • amount : jumlah total pelunasan
  • voucher_lines: array list baris-baris detail journal (diatas)

 

Memposting Journal Payment

untuk membuat Voucher menjadi Posted dan menghasilkan journal entries pelunasan yang benar, serta merubah status invoice yang akan dilunasi menjadi “Paid”, maka perlu dijalankan workflow "proforma_voucher” terhadap object “account.voucher”.

Caranya sbb:

wf_service = netsvc.LocalService(‘workflow’)
wf_service.trg_validate(uid, ‘account.voucher’, vid, ‘proforma_voucher’, cr)

 

dimana

  • vid: voucher id yang hendak diposting.

 

Untuk semua kebutuhan diatas, jangan lupa import modul python yang diperlukan:

from openerp.osv import osv, fields
from openerp import netsvc

Untuk informasi lebih lanjut tentang training Technical OpenERP Unofficial, silakan hubungi kami:

 

VITRAINING.COM
Grand Surapati Core Blok C-16
Jl PHH Mustofa  136 Bandung
Telephone : +62 (22) 8724 1394
Fax : +62 (22) 8724 1394
Mobile Phone Number : +62 813 2037 9277
Email: akhmad.daniel[at]gmail.com or info[at]vitraining.com

OpenERP Create, Validate Invoice, Post Payment dengan Python
Tagged on: