13 Juni 2012

Pesan Warning/Error ketika salah input field

Bismillahirrahmaanirrahiim

Karena saya orangnya sangat pelupa tapi tidak berminta untuk menghapal sintax code sama sekali, maka lebih baik saya posting saja apa2 yang sering saya gunakan di sini.

Ini code untuk mengeluarkan pesan error/warning ketika input sesuatu.
Biasanya saya pakai di method on_change suatu field.

Contoh:
Lihat layar wizard berikut:


Ketika input field date_stop (As Of) 03/01/2012 , akan otomatis mengisi field fiscalyear 2012 dan date_start 01/01/2012
Namun, ketika memasukkan tanggal di tahun 2013, akan muncul warning, karena belum dibuat fiscalyear tahun 2013


Terus bagaimana caranya,
tentunya pertama kali di field As Of, ditambahkan atribut on_change seperti berikut:
<field name="date_to" string="As of" on_change="onchange_asof(date_to)" required="1" colspan="4"/>
Lalu method untuk menjalankan aksi on_change nya seperti berikut:
    def onchange_asof(self, cr, uid, ids, date_to, context=None):
        value = {}
        fiscalyear_pool = self.pool.get('account.fiscalyear')
        if date_to:
            fiscalyear_id = fiscalyear_pool.search(cr, uid, [('date_start','<=',date_to),('date_stop','>=',date_to)])
            if fiscalyear_id:
                fiscalyear = fiscalyear_pool.browse(cr, uid, fiscalyear_id)[0]
                value = {'date_from': fiscalyear.date_start, 'fiscalyear_id': fiscalyear.id}
                return {'value': value}
            else:
                value = {'date_from':False, 'fiscalyear_id':False}
                return {'value': value, 'warning':{'title':'Warning','message':'No fiscal year for your choosen date! Choose another "As Of" date'}}     
Nah perhatikan saja perbedaan yg saya highlight kuning dengan biru

Oke begitu saja...

Semoga bermanfaat..

07 Juni 2012

IntegrityError: duplicate key value violates unique constraint "table_name_pkey"

Bismillahirrahmaanirrahiim

Pernah mengalami masalah seperti ini?
Gagal ketika mau buat data baru di suatu form ... dengan error:
contoh:

IntegrityError: duplicate key value violates unique constraint "ir_module_module_dependency_pkey"

padahal kemaren2 bisa??

terus kenapa ini?

Saya mengalami masalah ini beberapa minggu lalu... 

Ketika itu saya sedang tidak masuk kantor, dan team saya hubungi saya masalah ini...
Dia bilang, setelah diklik berkali2 baru bisa...

kenapakah?

Setelah mencari beberapa sumber, saya menemukan link berikut:

Selidik punya selidik, ternyata team saya sempat melakukan ketidaksengajaan,
yaitu restore database produksi dengan data backup database sebelumnya... Whoaaa 
kacau balau deh...

Akibatnya yaitu deh, banyak tabel yang nilai next sequence nya tidak sesuai... 
karena restore database yang sudah terisi pasti gagal, tapi ternyata ada beberapa data yang terestore... diantaranya nilai sequence dari tabel berubah sesuai dengan nilai sequence data backup..

AKhirnya kacau..
COntoh tabel ir_module_module_dependency. 
nilai max(id) nya 384. nilai ini diperoleh dengan jalankan query;

SELECT max(id) from ir_module_module_dependency;

tapi nilai next sequencenya yang didapatkan dari query berikut
select nextval('ir_module_module_dependency_id_seq');
masih 190, padahal seharusnya 385 kan?

terus solusinya bagaimana?
sesuai dengan link yang saya sampaikan sebelumnya, maka solusinya adalah update nilai next sequence dari tabel yang bermaslah tersebut;

caranya dengan jalankan query berikut:
SELECT setval('ir_module_module_dependency_id_seq', (SELECT MAX(id) FROM ir_module_module_dependency)+1);

habis itu coba, jalankan lagi query:

select nextval('ir_module_module_dependency_id_seq');

pasti nilainya sudah berubah jadi 385..

Selesai deh...
masalahnya banyak sekali tabel yang terpengaruh...
akhirnya yaa perbaiki setiap terjadi masalah saja...

ohya jangan lupa backup database nya dulu ya......

Semoga membantu


24 Mei 2012

Konsep Inventory Valuation pada Data Produk di OpenERP

Bismillahirrahmaanirrahiim

Hmm tadinya mau lanjutin blog sebelumnya yaitu cara membuat Report ke dalam Excel,
tapi saya sedang mematangkan modul Warehouse Management nih...

jadi saya sharing dulu aja sedikit pemahaman saya di modul ini , terutama pengertian Inventory Valuation di data produk. Semoga ada yang menanggapi (koreksi maksudnya gituh..)

Jadi, contohnya di tampilan produk berikut ini.
di tab accounting tersebut ada pilihan "Inventory Valuation", pilihannya hanya 2, yaitu:

  1. Periodical (manual)
  2. Real Time (automated), yang jika dipilih, maka field Stock Input Account  dan Stock Output Account  akan enable
Secara umum, ada 4 account yang harus diset untuk metode Real TIme (automated):
  1. Inventory Variation Account
    Account yang akan dicatat di journal ketika penerimaan barang pertama kali
    Contoh account: Persediaan barang dagang (dalam kelompok Asset)
    Diset pada Produk Category
  2. Stock Input Account
  3. Stock Output Account
  4. Expense Account
Sedangkan untuk metode periodical, hanya "Expense Account" saja yang diset
Nah, kalau dari yang saya pahami, barang itu bisa dibagi 2, yaitu barang sekali/habis pakai dan persediaan barang. Persediaan barang bisa dianggap sebagai  bagian dari Aktiva Lancar (Asset Lancar). 
Contoh barang habis pakai, misalnya bahan bakar
Sedangkan persediaan barang, contohnya ban, spare part dll 

Dari hasil gugling, saya ketahui bahwa ada "Metode Pencatatan Persediaan ke dalam laporan keuangan" (cek: http://id-id.facebook.com/note.php?note_id=10150280559947088) metode tersebut dibagi 2, yaitu:
  1. Metode Periodik
  2. Metode Perpetual 
Dalam sistem persediaan periodik, penjualan dicatat saat penjualan tersebut terjadi tetapi persediaannya tidak diperbaharui.  Pemeriksaan persediaan fisik harus dilakukan pada akhir tahun untuk menentukan harga pokok penjualan

Sedangkan Sistem persediaan perpetual memerlukan catatan akuntansi untuk menunjukkan jumlah persediaan yang ada di tangan di setiap waktu.  Sistem ini menggunakan akun yang terpisah dalam buku besar pembantu untuk masing-masing persediaan barang, dan akun tersebut diperbaharui setiap kali kuantitasnya bertambah atau diambil keluar.

Nah inilah yang diakomodasi OpenERP.

1. Periodical (Manual)

Inventory Valuation ini menggambarkan metode Periodik 
Kalo saya pikir ini paling cocok untuk barang habis pakai. 
Untuk persediaan barang juga bisa, tapi ya itu harus dilakukan secara manual nantinya setiap tahun pemeriksaan persediaan fisik untuk menentukan HPP.

Nah di OpenERP, setiap barang dengan metode periodik ini dibeli, maka akan dibuat jurnal ketika invoicing saja.

Gambaran pencatatan penjurnalan yang terjadi seperti ini:
1.1. Buat Purchase Order


1.2. Terima (Validate) Purchase Invoice
maka jurnal yang akan dibuat adalah:
Jurnal: Purchase Journal
Expense Account (D)
    Account Payable Supplier (C)

COntoh:
HPP - Bensin, dll    400.000
    Hutang Usaha              400.000

* Saya buat Expense Account langsung sebagai HPP  


1.3. Bayar Invoice
Jurnal: Bank 
Account Payable Supplier (D)
    Bank (C)

Contoh:
Hutang Usaha  400.000
    Bank                 400.000

2. Real Time (automated)

  • Menggambarkan metode Perpetual 
  • untuk barang yang akan dianggap sebagai Persediaan Barang Dagang
  • Akan di-generate journal setiap kali ada pergerakan barang (masuk atau keluar)
  • Penerimaan barang pertama kali dari supplier akan dicatat sebagai Persediaan Brang Dagang (Inventory Variation Account)
  • Keluar dan Masuknya barang akan mengurangi/menambah Persediaan Barang Dagang dengan conra account Stock Input Account/Stock Output Account
maka contoh:
Produk: Ban
Produk Category: Spare Part
akan disetup account berikut
  1. Inventory Variation Account (di produk category Spare Part)
    Account: 1300. Persediaan Barang Dagang
  2. Expense Account: 5000. Biaya Kendaraan *
  3. Stock Input Account: 5000. Biaya Kendaraan * 
  4. Stock Output Account: 5100. HPP - Ban, Plat dll
Kenapa Expense Account dan Stock INput Account memiliki COA yang sama?
akan terlihat di contoh berikut:

2.1. Buat Purchase Order
Beli ban 50 pcs dengan harga per ban: 1.000.000

2.2, Validasi Purchase Invoice
maka jurnal yang akan dibuat adalah:
Jurnal: Purchase Journal
Expense Account (D)
    Account Payable Supplier (C)

COntoh:
Biaya Kendaraan    50.000.000
    Hutang Usaha              50.000.000
2.3. Terima Barang 
maka jurnal yang akan dibuat adalah
Jurnal: Stock Journal
Inventory Variation Account (D)
      Stock Input Account (C)

Contoh:
Persediaan Barang Dagang  50.000.000
      Biaya Kendaraan                50.000.000

2.4 Bayar Invoice
Jurnal: Bank 
Account Payable Supplier (D)
    Bank (C)

Contoh:
Hutang Usaha  50.000.000
    Bank                 50.000.000
2.5. Deliver Barang ke Customer
jumlah: 3 item 
menu: Warehouse > Product Moves > Deliver Products
Jurnal: Stock Journal
Stock Output Account (D)
     Inventory Variation Account (C)

Contoh:
HPP - Ban, Plat dll                   3.000.000
    Persediaan Barang Dagang          3.000.000

Issue di Metode Ini:

  • Lihat jurnal yang dihasilkan di step 2.2 dan 2.3
    Karena itulah, saya menyamakan COA Stock Input Account dengan Expense Account
    agar bisa mem-balancekan (membuat 0) COA Biaya Kendaraan
    APakah prinsip seperti ini sudah benar?

    Saya sudah sempat menanyakan ke salah satu accountant mengenai proses penjurnalan seperti ini, dan belia katakan sudah tepat.

    Kalau begitu, menurut saya sebaiknya ketika menerima barang dari supplier harusnya, jurnal yang terjadi adalah langsung terhadap Expense Account:

    Inventory Variation Account (D)
          Expense Account (C)

    karena hasilnya aneh jika salah memasukkan Stock Input Account (memasukkan yang tidak sama dengan Expense Account)
Hmmm sementara itu aja dulu sharig dari saya.
Mohon koreksi ya jika ada yang salah

terima kasih

10 Mei 2012

Export Report OpenERP ke Excel

Bismillahirrahmaanirrahiim

Alhamdulillah bisa juga bikin report ke Excel (bukan CSV lhoo)...
laporannya nanti yaaa.......


04 April 2012

Pengganti checkbox tree di dalam form OpenERP

Bismillahirrahmaanirrahiim

Pernah memiliki pertanyaan seperti pertanyaan ini: http://www.openerp.com/forum/topic29356.html ?
Saya pernah dan sudah berbulan2 lalu belum menemukan jawabannya...


Jadi kalau tree di depan (saat pertama kali buka menu) akan selalu muncul checkbox di sebelah kiri seperti ini.




Sedangkan jika di dalam form ada tree, maka checkbox tersebut tidak muncul, paling yang ada icon Save atau Edit seperti berikut.




Sedangkan kebutuhan adanya checkbox pada tree di dalam form cukup sering yaitu untuk menjalankan action tertentu. Contohnya ingin membeli barang tertentu saja dari daftar produk di dalam form Purchase Requisition.


Nah, ini solusi sementara dari saya. Jadi ya saya buat saja tombol Check dan Uncheck di setiap baris di tree seperti berikut.




Sebelumnya ditambahkan dulu field state dengan tipe boolean, True jika di-check False bila uncheck.
Tombol Check visible jika state False dan Uncheck visible hanya jika state True

mirip-mirip aja kan dengan checkbox biasa tinggal klik klik doang =P

Jadi dalam view.xml nya bisa dibuat seperti ini.

<field name="po_ids" colspan="4" nolabel="1" >
  <tree string="Products to be aded on Purchase Order">
     <field name="state"/>
     <button name="check_po" type="object" string="Select Product to Purchase Order" attrs="{'invisible':[('
state','=',True)]}" icon="gtk-apply"/>
     <button name="uncheck_po" type="object" string="UnSelect Product to Purchase Order" attrs="{'invisible':[('
state','=',False)]}" icon="gtk-cancel"/>

Gitu deh... mudah2an membantu..
Tapi kalau ada yang punya solusi lebih mudah tolong dibagi ilmunya ya :)

Ohya kalau masih menggunakan OpenERP web client versi 6.0.2 harap diupgrade ke versi 6.0.3 yaa
karena mungkin ada bugs...
jadi kalau pake web versi 6.0.2 ketika click tombol di dalam tree maka akan reload keseluruhan form ...


Terima kasih :)

13 Maret 2012

Membuat laporan OpenERP dalam CSV/Excel (create excel/csv report on OpenERP)

Bismillahirrahmaanirrahiim

Alhamdulillah masih bulan Maret, hehe niatnya tiap bulan bisa menghasilkan 1 tulisan... Mudah2an selalu sempat dan ingin berbagi :)

Alhamdulillah juga menemukan cara untuk buat report OpenERP dalam bentuk Excel.. hmm masih csv sii, tapi kan tetap bisa dibuka di Excel :D

Sebelumnya say thanks for Wyden Silvan  yang sudah berbagi informasi cara membuat report dalam CSV.

Jadi, yang harus kita lakukan adalah buat class Report (report.py)

seperti berikut:

import base64
from osv import fields,osv
from tools.translate import _
import time

class Report(osv.osv_memory):
    """
    Wizard to create custom report
    """
    _name = "report"
    _description = "Create Report"
    _columns = {
                'start_date' : fields.date('Start Date', required=True),
                'end_date' : fields.date('End Date', required=True),
                'data': fields.binary('File', readonly=True),
                'name': fields.char('Filename', 16, readonly=True),
                'state': fields.selection( ( ('choose','choose'),   # choose date
                     ('get','get'),         # get the file
                   ) ),
                }
    
    def create_report(self,cr,uid,ids,context={}):
        this = self.browse(cr, uid, ids)[0]
        output = 'Start;Ende'
        output += '\n' + this.start_date + ';' + this.end_date
        print this.start_date
        out=base64.encodestring(output)
        return self.write(cr, uid, ids, {'state':'get',  'data':out,'name':'test.csv'}, context=context)
        
    _defaults = { 
                 'state': lambda *a: 'choose',
                 'start_date' : lambda *a: time.strftime('%Y-%m-%d'),
                 'end_date' : lambda *a: time.strftime('%Y-%m-%d'),
                }
   
Report()

Perhatikan yang saya highlight warna biru. Itu merupakan field yang harus tersedia.
Sedangkan yang saya highlight warna merah, merupakan proses inti dari export file ke CSV.

Kemudian untuk view xml nya (file report.xml)

<?xml version="1.0" encoding="UTF-8"?>

<openerp>
    <data>
    
        <!--  =========== VIEWS =========== -->    
    
        <record model="ir.ui.view" id="view_wizard">
            <field name="name">Custom Report</field>
            <field name="model">report</field>
            <field name="type">form</field>
            <field name="priority">16</field>
            <field name="arch" type="xml">
                <form col="3" string="Custom Report">
                    <group col="2" fill="0" height="2500" states="choose">
                        <separator string="Report" colspan="2"/>
                        <field name="start_date" width="200"/>
                        <field name="end_date" width="200"/>
                        <separator colspan="2"/>
                        <group colspan="2">
                            <button special="cancel" icon="gtk-cancel" string="Cancel"/>
                            <button type="object" name="create_report" icon="gtk-go-forward" string="Create"/>
                        </group>
                        <field invisible="1" name="state"/>
                    </group>
                    <group col="3" fill="0" states="get">
                        <separator colspan="3" string="Export done"/>
                        <field name="name" invisible="1" width="100"/>
                        <field name="data" nolabel="1" readonly="1" width="100" fieldname="name"/>
                    </group>
                </form>
            </field>
        </record>
        
        <!--  =========== ACTIONS =========== -->    
        
        <record model="ir.actions.act_window" id="action_report">
            <field name="name">Custom Report</field>
            <field name="res_model">report</field>
            <field name="view_type">form</field>
            <field name="view_mode">form</field>
            <field name="target">new</field>
        </record>
        
        <!--  =========== MENU ITEMS =========== -->
        <menuitem id="menu_report" name="Report"
                    action="action_report"
                    parent="account.menu_finance_reporting" 
                    sequence="40" />
        
        
    </data>
</openerp>

Yang saya highlight merah, adalah tombol proses yang akan mengeksekusi method create_report pada class Report. Proses tersebut hanya mengexport data yang akan dibuat file csv.
Jika proses berhasil, akan muncul tombol Save As untuk memilih lokasi file csv (default file name: test.csv lihat yang dihighligt kuning pada file report.py)


Nah hasil dari proses di atas, adalah menu Report yang berada di bawah menu ACCOUNTING > Reporting>Report
yang jika diklik akan muncul window berikut:




 Kemudian jika diklik tombol Create, akan muncul form berikut:






Klik tombol Save As untuk memunculkan file dialog.

Hasil file csv nya seperti ini deh:



Demikian...
Seterusnya bisa dimodif sesuka hati.
Kalau saya sendiri, saya tambahkan tombol Export to CSV bersisian dengan tombol yang menghasilkan report PDF seperti contoh ini:




Semoga membantu.......