inquiry.py 3.22 KB
import sys
from datetime import datetime
from configparser import ConfigParser
from argparse import ArgumentParser
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
import transaction
from zope.sqlalchemy import register
from opensipkd.string.money import thousand


def show_val(label, value):
    print('{}: {}'.format(label, value or ''))


def show_rp(label, value):
    show_val(label, 'Rp {}'.format(thousand(value)))


def get_option(argv):
    pars = ArgumentParser()
    pars.add_argument('conf')
    pars.add_argument('--invoice-id')
    pars.add_argument('--payment', action='store_true')
    pars.add_argument('--reversal', action='store_true')
    return pars.parse_args(argv)


def show(inq):
    show_val('Invoice ID', inq.invoice_id.get_raw())
    show_val('Tahun Pajak', inq.get_tahun())
    show_val('NPWPD', inq.get_npwp())
    show_val('Nama Wajib Pajak', inq.get_nama())
    show_val('Alamat Wajib Pajak', inq.get_alamat_wp())
    show_val('Kode Pos Wajib Pajak', inq.get_kode_pos_wp())
    show_val('Alamat Objek Pajak', inq.get_alamat_op())
    show_val('Kelurahan Objek Pajak', inq.get_kelurahan_op())
    show_val('Kecamatan Objek Pajak', inq.get_kecamatan_op())
    show_rp('Tagihan', inq.tagihan)
    show_rp('Denda', inq.denda)
    show_rp('Total Bayar', inq.total_bayar)
    show_rp('Total Tagihan', inq.total)
    show_val('Is Available', inq.is_available())
 

def show_pkey_values(row):
    print('Primary key tabel {}:'.format(row.__table__.name))
    for c in row.__table__.columns:
        if c.primary_key:
            val = getattr(row, c.name)
            show_val('  '+c.name, val)


def read_list_conf(conf, name):
    return conf.has_option('main', name) and \
            conf.get('main', name).split() or []


def error(s):
    print(s)
    sys.exit()


def main(argv=sys.argv):
    option = get_option(argv[1:])
    conf_file = option.conf 
    invoice_id = option.invoice_id
    conf = ConfigParser()
    conf.read(conf_file)
    db_url = conf.get('main', 'db_url')
    rekening_notes = read_list_conf(conf, 'rekening_notes')
    engine = create_engine(db_url)
    module = __import__('opensipkd.pad.services')
    session_factory = sessionmaker(bind=engine)
    module.pad.services.DBSession = session_factory()
    register(module.pad.services.DBSession)
    inq = module.pad.services.Inquiry(
            invoice_id, rekening_notes, conf.getfloat('main', 'persen_denda'))
    if not inq.invoice:
        print('Invoice ID {} tidak ada.'.format(invoice_id))
        return
    show(inq)
    if option.payment:
        if not inq.total:
            error('Tidak ada tagihan, tidak ada yang perlu dibayar.')
        ntb = datetime.now().strftime('%y%m%d%H%M%S')
        with transaction.manager:
            pay = inq.do_payment(ntb)
            show_pkey_values(pay)
            print('Berhasil dibayar')
    if option.reversal:
        rev = module.pad.services.Reversal(invoice_id)
        if rev.is_available():
            error('Memang belum dibayar')
        pay = rev.payment
        if not pay:
            error('Pembayaran tidak ditemukan, tidak ada yang perlu dibatalkan.')
        with transaction.manager:
            rev.do_reversal()
            show_pkey_values(pay)
            print('Berhasil dibatalkan')