inquiry.py 4.23 KB
import sys
from datetime import datetime
from argparse import ArgumentParser
import transaction
from opensipkd.string.money import thousand
from .common import init


ERR_PAYMENT_NOT_FOUND = 'Pembayaran tidak ditemukan, '\
    'tidak ada yang perlu dibatalkan.'


def show_val(label, value):
    if value is None:
        value = ''
    print('{}: {}'.format(label, value))


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


def show_field(t, fieldname):
    if isinstance(t, dict):
        return
    label = f'Field {t.__tablename__}.{fieldname}'
    try:
        value = getattr(t, fieldname)
    except AttributeError:
        return
    if isinstance(value, float):
        show_rp(label, value)
    else:
        show_val(label, 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')
    pars.add_argument('--tgl-bayar')
    return pars.parse_args(argv)


def show(inq):
    if isinstance(inq.invoice_id, str):
        invoice_id = inq.invoice_id
    else:
        invoice_id = inq.invoice_id.get_raw()
    show_val('Invoice ID', invoice_id)
    show_val('Tahun Pajak', inq.get_tahun())
    show_val('Masa 1', inq.get_masa_1())
    show_val('Masa 2', inq.get_masa_2())
    if inq.get_kohir_model():
        show_val('Tanggal Kohir', inq.get_tgl_kohir())
    show_val('Kode Rekening', inq.get_kode_rekening())
    show_val('Nama Rekening', inq.get_nama_rekening())
    show_val('Jenis Usaha', inq.get_nama_jenis_usaha())
    show_val('Tipe', inq.get_type_name())
    show_val('Self', inq.is_self())
    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_val('Jatuh Tempo', inq.get_jatuh_tempo())
    show_val('Jumlah Bulan Denda', inq.bln_tunggakan)
    show_rp('Tagihan', inq.tagihan)
    show_field(inq.invoice, 'pajak_terhutang')
    show_field(inq.invoice, 'bunga')
    try:
        show_rp('Denda Jatuh Tempo', inq.denda_waktu)
    except AttributeError:
        pass
    show_rp('Discount Denda', inq.discount_denda)
    if inq.notes:
        show_val('Note', inq.notes)
    show_rp('Total Denda', inq.denda)
    show_rp('Total Bayar', inq.total_bayar)
    show_rp('Total Tagihan', inq.total)
    show_field(inq.invoice, 'status_pembayaran')
    if inq.total_bayar:
        pay = inq.get_payment()
        show_field(pay, 'sspdtgl')
        show_field(pay, 'id')
        show_field(pay, 'discount_denda')


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 error(s):
    print(s)
    sys.exit()


def date_from_str(s):
    d, m, y = s.split('-')
    return datetime(int(y), int(m), int(d))


def main(argv=sys.argv):
    option = get_option(argv[1:])
    conf, services = init(option)
    invoice_id = option.invoice_id
    if option.tgl_bayar:
        tgl_bayar = date_from_str(option.tgl_bayar)
    else:
        tgl_bayar = None
    inq = services.Inquiry(invoice_id, conf, tgl_bayar)
    if not inq.invoice:
        error('Invoice ID {} tidak ada.'.format(invoice_id))
    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)
            show_field(pay, 'is_valid')
            print('Berhasil dibayar')
    if option.reversal:
        rev = services.Reversal(invoice_id)
        pay = rev.payment
        if not pay:
            error(ERR_PAYMENT_NOT_FOUND)
        with transaction.manager:
            rev.do_reversal()
            show_pkey_values(pay)
            show_field(pay, 'is_valid')
            print('Berhasil dibatalkan')