inquiry.py 9.65 KB
import sys
from datetime import datetime
from configparser import ConfigParser
from argparse import ArgumentParser
import transaction
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from zope.sqlalchemy import register
import sismiop.services.base
from sismiop.services.base import thousand


registry = dict()


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):
    label = 'Field ' + fieldname
    try:
        value = getattr(t, fieldname)
    except AttributeError:
        return
    if isinstance(value, float):
        show_rp(label, value)
    else:
        show_val(label, value)


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


def get_option(argv):
    help_tgl = 'butuh --payment'
    help_status_bayar = 'Field status_pembayaran_sppt = 1 jika lunas'
    pars = ArgumentParser()
    pars.add_argument('conf')
    pars.add_argument('--invoice-id')
    pars.add_argument('--payment', action='store_true')
    pars.add_argument('--tgl-bayar', help=help_tgl)
    pars.add_argument('--reversal', action='store_true')
    pars.add_argument(
        '--update-status-bayar', action='store_true', help=help_status_bayar)
    pars.add_argument('--sql-debug', action='store_true')
    return pars.parse_args(argv)


def show_inquiry(inq):
    show_val('Tahun Pajak', inq.get_tahun())
    show_val('Kelurahan Objek Pajak', inq.get_kelurahan_op())
    show_val('Kecamatan Objek Pajak', inq.get_kecamatan_op())
    show_val('Provinsi Objek Pajak', inq.get_propinsi_op())
    show_val('Alamat Objek Pajak', inq.get_alamat_op())
    show_val('Luas Tanah', inq.get_luas_tanah())
    show_val('Luas Bangunan', inq.get_luas_bangunan())
    show_val('Nama Wajib Pajak', inq.get_nama_wp())
    show_val('Jatuh Tempo', inq.get_jatuh_tempo())
    show_val('Bulan Tunggakan', inq.bln_tunggakan)
    show_rp('Tagihan Pokok', inq.tagihan)
    show_rp('Denda', inq.denda)
    show_attr(inq, 'discount_pokok', 'Discount Pokok')
    show_attr(inq, 'discount_denda', 'Discount Denda')
    show_rp('Total Discount', inq.discount)
    show_rp('Total Bayar Sebelumnya', inq.total_bayar)
    show_rp('Total Tagihan', inq.total)
    show_field(inq.invoice, 'status_pembayaran_sppt')
    show_field(inq.invoice, 'pbb_yg_harus_dibayar_sppt')
    show_field(inq.invoice, 'pbb_terhutang_sppt')
    show_field(inq.invoice, 'faktor_pengurang_sppt')
    for pay in inq.query_payments():
        if registry['module_name'] == 'sukabumi_kota':
            show_fields(
                pay, ['PEMBAYARAN_SPPT_KE', 'KD_KANWIL', 'KD_KANTOR',
                      'KD_KANWIL_BANK', 'KD_KPPBB_BANK', 'KD_BANK_TUNGGAL',
                      'KD_BANK_PERSEPSI', 'KD_TP', 'TGL_REKAM_BYR_SPPT',
                      'TGL_PEMBAYARAN_SPPT', 'JML_SPPT_YG_DIBAYAR',
                      'JML_PBB_YG_DIBAYAR', 'DENDA_SPPT'])
        else:
            show_fields(
                pay, ['pembayaran_sppt_ke', 'kd_kanwil', 'kd_kantor',
                      'kd_kanwil_bank', 'kd_kppbb_bank', 'kd_bank_tunggal',
                      'kd_bank_persepsi', 'kd_tp', 'tgl_rekam_byr_sppt',
                      'tgl_pembayaran_sppt', 'jml_sppt_yg_dibayar',
                      'jml_pbb_yg_dibayar', 'denda_sblm_diskon', 'denda_sppt',
                      'discount_pokok', 'discount_denda', 'discount'])


def show_fields(row, fieldnames):
    for fieldname in fieldnames:
        show_field(row, fieldname)


def show_attr(obj, attr, label):
    try:
        n = getattr(obj, attr)
    except AttributeError:
        return
    show_rp(label, n)


def show_payment(inq, pay):
    if registry['module_name'] == 'sukabumi_kota':
        print(
            'Berhasil dibayar pada urutan ke-{}'.format(
                pay.PEMBAYARAN_SPPT_KE))
        print('Tabel PEMBAYARAN_SPPT')
        show_fields(
            pay, ['kd_kanwil', 'kd_kantor', 'kd_bank', 'kd_kanwil_bank',
                  'kd_kppbb_bank', 'kd_bank_tunggal', 'kd_bank_persepsi',
                  'kd_tp', 'jml_sppt_yg_dibayar', 'jml_pbb_yg_dibayar',
                  'denda_sppt'])
    else:
        print(
            'Berhasil dibayar pada urutan ke-{}'.format(
                pay.pembayaran_sppt_ke))
        print('Tabel pembayaran_sppt')
        show_fields(
            pay, ['kd_kanwil', 'kd_kantor', 'kd_bank', 'kd_kanwil_bank',
                  'kd_kppbb_bank', 'kd_bank_tunggal', 'kd_bank_persepsi',
                  'kd_tp', 'jml_sppt_yg_dibayar', 'jml_pbb_yg_dibayar',
                  'denda_sppt', 'denda_sblm_diskon', 'discount_pokok',
                  'discount_denda', 'discount'])
    try:
        row, fields = inq.get_other_payment_table(pay)
    except AttributeError:
        return
    if not row:
        return
    print('Tabel {}'.format(row.__tablename__))
    show_fields(row, fields)


def show_reversal(inq, pay):
    if registry['module_name'] == 'sukabumi_kota':
        print(
            'Pembayaran ke-{} berhasil dibatalkan'.format(
                pay.PEMBAYARAN_SPPT_KE))
        print('Tabel PEMBAYARAN_SPPT')
        show_fields(
            pay, ['JML_SPPT_YG_DIBAYAR', 'JML_PBB_YG_DIBAYAR', 'DENDA_SPPT'])
    else:
        print(
            'Pembayaran ke-{} berhasil dibatalkan'.format(
                pay.pembayaran_sppt_ke))
        print('Tabel pembayaran_sppt')
        show_fields(
            pay, ['jml_sppt_yg_dibayar', 'jml_pbb_yg_dibayar', 'denda_sppt',
                  'denda_sblm_diskon', 'discount_pokok', 'discount_denda',
                  'discount'])
    try:
        row, fields = inq.get_other_payment_table(pay)
    except AttributeError:
        return
    if not row:
        return
    print('Tabel {}'.format(row.__tablename__))
    show_fields(row, fields)


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


def main(argv=sys.argv):
    option = get_option(argv[1:])
    invoice_id = option.invoice_id
    if option.tgl_bayar:
        tgl_bayar = date_from_str(option.tgl_bayar)
    else:
        tgl_bayar = None
    conf_file = option.conf
    conf = ConfigParser()
    conf.read(conf_file)
    cf = dict(conf.items('main'))
    registry['module_name'] = module_name = cf['module']
    module = __import__('sismiop.services.' + module_name)
    sub_module = getattr(module.services, module_name)
    Inquiry = sub_module.Inquiry
    Reversal = sub_module.Reversal
    db_url = cf['db_url']
    engine = create_engine(db_url)
    engine.echo = option.sql_debug
    session_factory = sessionmaker(bind=engine)
    sismiop.services.base.DBSession = DBSession = session_factory()
    register(sismiop.services.base.DBSession)
    persen_denda = float(cf['persen_denda'])
    with transaction.manager:
        inq = Inquiry(
                invoice_id, persen_denda, tgl_bayar=tgl_bayar, debug=True)
        if not inq.invoice:
            print('Invoice ID {} tidak ada.'.format(invoice_id))
            if inq.debug_invoice and tgl_bayar:
                if tgl_bayar.year < int(inq.debug_invoice.thn_pajak_sppt):
                    print('Ada tapi tahun pajak lebih besar dari tahun '
                          'tanggal bayar')
                else:
                    print('Ada tapi field status_pembayaran_sppt = '
                          f'{inq.debug_invoice.status_pembayaran_sppt}')
            return
        show_inquiry(inq)
        if option.payment:
            if inq.is_paid():
                print('Tidak ada tagihan, tidak ada yang perlu dibayar.')
                return
            if not inq.is_available():
                print('Tagihan tidak diperkenankan dibayar melalui jalur ini.')
                return
            if cf['module'] == 'sukabumi_kota':
                tp = dict(
                        KD_KANWIL_BANK=cf['kd_kanwil_bank'],
                        KD_KPPBB_BANK=cf['kd_kppbb_bank'],
                        KD_BANK_TUNGGAL=cf['kd_bank_tunggal'],
                        KD_BANK_PERSEPSI=cf['kd_bank_persepsi'],
                        KD_TP=cf['kd_tp'])
            else:
                tp = dict(kd_tp=cf['kd_tp'])
                if cf.get('kd_kantor'):
                    tp.update(dict(
                            kd_kanwil=cf['kd_kanwil'],
                            kd_kantor=cf['kd_kantor']))
                if cf.get('kd_kanwil_bank'):
                    tp.update(dict(
                        kd_kanwil_bank=cf['kd_kanwil_bank'],
                        kd_kppbb_bank=cf['kd_kppbb_bank']))
                if cf.get('kd_bank_tunggal'):
                    tp.update(dict(
                        kd_bank_tunggal=cf['kd_bank_tunggal'],
                        kd_bank_persepsi=cf['kd_bank_persepsi']))
            pay = inq.do_payment(tp, cf['nip_pencatat'])
            show_payment(inq, pay)
        if option.reversal:
            rev = Reversal(invoice_id)
            pay = rev.payment
            if not pay:
                print(ERR_PAYMENT_NOT_FOUND)
                return
            rev.do_reversal()
            show_reversal(inq, pay)
        if option.update_status_bayar:
            if inq.total == 0:
                if inq.invoice.status_pembayaran_sppt == '0':
                    inq.invoice.status_pembayaran_sppt = '1'
                    DBSession.add(inq.invoice)
                    print('Sudah diperbarui, silakan inquiry lagi.')
                if inq.invoice.status_pembayaran_sppt == '1':
                    print(
                        'Field status_pembayaran_sppt sudah 1, '
                        'tidak perlu diperbarui lagi')
                else:
                    print('Field status_pembayaran_sppt harus 0')
            else:
                print('Total Tagihan harus 0')