OpenERP: Text Mode Printing

Foto os

Report pada OpenERP biasanya dalam bentuk PDF. Ini artinya dokumen dicetak printer dengan graphic mode. Namun graphic mode printing memiliki beberapa kelemahan pada printer dotmatrix.

Kelemahannya antara lain:

  1. Waktu cetak jauh lebih lama ketimbang text mode printing.
  2. Pita lebih cepat "habis" karena lebih banyak yang ditoreh.
  3. Jarum cetak lebih cepat aus.

Untuk mengatasi hal ini kita akan buat Laporan Penjualan dapat dicetak dengan text mode printing.

Sebelum masuk ke sesi OpenERP, lakukanlah beberapa persiapan berikut ini:

  1. Kita akan gunakan paket Mako Templates yang akan memproses report template-nya. Pasanglah terlebih dahulu:
    $ sudo su
    # apt-get install python-mako
  2. Hak akses parallel port printer pada /dev/lp0 perlu disesuaikan agar dapat digunakan oleh user openerp. Karena sesuai petunjuk instalasi OpenERP, openerp-server dijalankan oleh user tersebut. Caranya dengan mendaftarkan user openerp ke dalam grup lp.
    # ls -l /dev/lp0
    crw-rw---- 1 root lp 6, 0 2010-01-04 08:43 /dev/lp0
    # adduser openerp lp

    Lalu siapkan kertas di printer untuk mencobanya.
    # su - openerp
    $ cat /etc/hosts > /dev/lp0
  3. Namun jika Anda belum memiliki printernya, Anda bisa simpan nanti dalam sebuah file sebagai gantinya.

Selanjutnya ke sesi OpenERP. Mulailah dengan membuat template dengan hasil akhirnya seperti ini:

Sales Order
 
Nomor    : F0000061
Tanggal  : 2010-01-06
Pelanggan: R. GANJAR SUWARGANI
 
-------------------------------------------------------------------------
No. Nama                           Jumlah        Harga  Disc     Subtotal
-------------------------------------------------------------------------
  1 [ME581047] SWITCH                   1   207.000,00   0.0   207.000,00
  2 [MF660035] PACKING                  1     4.100,00   0.0     4.100,00
  3 [MF660068] GASKET, CYLINDE          1     5.300,00   0.0     5.300,00
  4 [MH037794] PLUG                     1    27.500,00   0.0    27.500,00
  5 [MS820044] BULB 12V-21W             1     5.400,00   0.0     5.400,00
  6 [MS820079] BULB STOP LAMP           1    57.500,00   0.0    57.500,00
  7 [TK000013] SEAL TIPE                1     2.000,00   0.0     2.000,00
-------------------------------------------------------------------------
                                                       TOTAL   308.800,00

Buatlah /usr/lib/openerp-server/addons/sale/wizard/order.txt sebagai headernya:

Sales Order
 
Nomor    : ${id}
Tanggal  : ${tgl}
Pelanggan: ${pelanggan}
 
${'-'*73}
No. ${'Nama'.ljust(30)} Jumlah ${'Harga'.rjust(12)} ${'Disc'.rjust(5)} ${'Subtotal'.rjust(12)}
${'-'*73}
${rows}${'-'*73}
${' '*55}TOTAL ${total.rjust(12)}

Lanjutkan dengan /usr/lib/openerp-server/addons/sale/wizard/order_line.txt untuk daftar barang yang dijual:

${no.rjust(3)} ${prod.ljust(30)[:30]} ${jml.rjust(6)} ${hrg.rjust(12)} ${disc.rjust(5)} ${subt.rjust(12)}

Kemudian ini script utamanya, file /usr/lib/openerp-server/addons/sale/wizard/wizard_cetak.py:

import wizard
import pooler
 
from mako.template import Template
from mako.lookup import TemplateLookup
import time
import os
import locale
 
 
locale.setlocale(locale.LC_ALL, 'id_ID.UTF-8')
tpl_lookup = TemplateLookup(directories=['/usr/lib/openerp-server/addons/sale/wizard'])
 
def money(n):
    return locale.format('%.2f', n, True)
 
 
cetak_form = '''<?xml version="1.0"?>
<form string="Cetak ke printer dotmatrix">
    <field name="teks" />
</form>'''
 
cetak_fields = {
        'teks' : {'type' : 'text', 'default': 'Pencetakan sedang berlangsung.', 'readonly': True },
}
 
 
class sale_cetak(wizard.interface):
 
    def cetak(self, cr, uid, data, context):
        obj = pooler.get_pool(cr.dbname).get('sale.order')
        order = obj.browse(cr, uid, data['id'])
        print order.name, order.date_order, order.partner_id.name, order.amount_total
        no = 0
        rows = []
        tpl_line = tpl_lookup.get_template('order_line.txt')
        for line in order.order_line:
            no += 1
            s = tpl_line.render(no=str(no),
                                prod=line.name,
                                jml=str(int(line.product_uom_qty)),
                                hrg=money(line.price_unit),
                                disc=str(line.discount),
                                subt=money(line.price_subtotal),
                               )
            rows.append(s)
        tpl = tpl_lookup.get_template('order.txt')
        s = tpl.render(id=order.name,
                       tgl=order.date_order,
                       pelanggan=order.partner_id.name,
                       rows=''.join(rows),
                       total=money(order.amount_total).rjust(12),
                       )
        filename = '/dev/lp0'
        # filename = '/tmp/%s.txt' % uid
        f = open(filename,'w')
        f.write(s)
        f.close()
        return {}
 
    states = {
        'init': {
            'actions': [cetak],
            'result': {'type':'form',
                       'arch':cetak_form,
                       'fields': cetak_fields,
                       'state':[]
                      }
            },
        }
 
 
sale_cetak('sale.cetak')

Lalu daftarkan di file /usr/lib/openerp-server/addons/sale/wizard/__init__.py dengan menambahkan baris:

import wizard_cetak

Kemudian buatlah menunya di file /usr/lib/openerp-server/addons/sale/cetak_wizard.xml:

<?xml version="1.0" ?>
<openerp>
    <data>
    <wizard
             id="report_wizard_cetak"
             string="Cetak"
             model="sale.order"
             name="sale.cetak"
             keyword="client_print_multi"/>
    </data>
</openerp>

Terakhir daftarkan di /usr/lib/openerp-server/addons/sale/__terp__.py di bagian update_xml:

...
    'update_xml': [
        'security/sale_security.xml',
        'security/ir.model.access.csv',
        'sale_workflow.xml',
        'sale_sequence.xml',
        'sale_data.xml',
        'sale_wizard.xml',
        'sale_view.xml',
        'sale_report.xml',
        'stock_view.xml',
        'process/sale_process.xml',
        'cetak_wizard.xml',
    ],
...

Untuk menghindari pesan error yang tak perlu saat update modul nanti, sebaiknya kosongkan bagian demo_xml:

...
    'demo_xml': [],
...

Kadang Anda perlu juga mengosongkan demo_xml ini di addons/product/__terp__.py karena update modul sale biasanya mengupdate modul product juga.

Selanjutnya lakukan update modul:

# su - openerp
$ openerp-server --database=openerp --update=sale --stop-after-init

Lalu restart daemonnya:

# /etc/init.d/openerp-server restart

Sekarang giliran browser Firefox. Setelah login, masuklah ke menu Sales Management, Sales Order. Klik salah satu tanggal transaksi agar tampil rinciannya. Di sebelah kanan pada bagian REPORTS ada menu Cetak. Jangan klik dulu. Siapkan kertas di printer, lalu klik Cetak.

Selamat mencoba.

Referensi:

Lihat juga:

Update 7 Maret 2010
Menu cetak ke dotmatrix ini sudah disertakan di paket Debian openerp-server 5.0.7 yang dikemas RAB. Anda bisa ikuti petunjuk instalasinya.

LampiranUkuran
sale-order.png108.45 KB
order.txt239 bita
order_line.txt106 bita
wizard_cetak.py.txt2.22 KB
cetak_wizard.xml198 bita

Komentar

Foto adhy cahyadi

gan mau nanya kalo ( "

gan mau nanya kalo ( " filename = '/dev/lp0' " ke printer local) gimana gan kalo mau ganti ke printer jaringan & jaringan clien win XP

Foto os

Pertanyaan bagus. Intinya

Pertanyaan bagus. Intinya kita bisa gunakan lpr, cups, dan samba. Mudahnya begini dalam command line:

$ lpr -P nama_printer nama_file

nama_printer merupakan nama printer yang terdaftar di cups. Untuk menambahkan printer pada cups (baik local maupun jaringan), silahkan melihat berbagai dokumentasi yang tersedia (kebanyakan bisa tercapai melalui GUI). Setelah printer yang dimaksud telah ditemukan namailah dengan lx800_pc_a misalnya.

Kemudian pada source ganti baris berikut ini

filename = '/dev/lp0'
f = open(filename,'w')
f.write(s)
f.close()

menjadi

# User ID dan nama printernya di cups
printers = {
  1: 'lx800_pc_a',
  2: 'lx300_pc_b',
}
filename = '/tmp/%s.txt' % uid # Gunakan uid agar tidak bentrok dengan user lain
f = open(filename, 'w')
f.write(s)
f.close()
nama_printer = uid in printers and printers[uid] or 'lx800'
os.system('lpr -P %s %s' % (nama_printer, filename))
os.remove(filename)

Korelasi user ID dan nama printer menjadi kurang tepat saat prosedur kerja mengizinkan user cahyadi bisa menggunakan pc mana saja yang ada di jaringan. Dalam hal ini yang paling pas adalah menggunakan IP sebagai pengganti user ID. Sayangnya saya belum tahu bagaimana mendapatkan IP client.

Foto adhy cahyadi

makasih gan setelah saya coba

makasih gan setelah saya coba alhamdulilah berhasil gan :D

Foto Asrul Bastian Yunas

Terima Kasih gan untuk

Terima Kasih gan untuk postingannya sangat membantu.
Tapi ada sedikit yg ingin saya tanyakan ke agan, untuk mengatur ukuran font dan jenis font itu gimana ya gan?

Mohon bantuannya ya gan.

Salam,
Asrul Bastian Yunas