inquiry.py
4.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import sys
from datetime import (
datetime,
date,
)
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
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):
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):
kini = date.today()
kini = kini.strftime('%d-%m-%Y')
help_tgl_bayar = f'default {kini}'
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', help=help_tgl_bayar, default=kini)
return pars.parse_args(argv)
def show(inq):
show_val('Nama Penyetor', inq.get_nama())
show_val('Alamat 1', inq.get_alamat_1())
show_val('Alamat 2', inq.get_alamat_2())
show_val('Kode Rekening', inq.get_kode_rekening())
show_val('Nama Rekening', inq.get_nama_rekening())
show_val('Kode SKPD', inq.get_kode_departemen())
show_val('Nama SKPD', inq.get_nama_departemen())
show_val('Jatuh Tempo', inq.get_jatuh_tempo())
show_val('Jumlah Bulan Denda', inq.bln_tunggakan)
show_rp('Tagihan Pokok', inq.tagihan)
show_field(inq.invoice, 'bunga')
show_rp('Denda', inq.denda)
show_rp('Total Bayar', inq.total_bayar)
show_rp('Total Tagihan', inq.total)
show_field(inq.invoice, 'status')
show_field(inq.invoice, 'status_bayar')
if inq.total_bayar:
pay = inq.get_payment()
show_field(pay, 'tgl_bayar')
show_field(pay, 'id')
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 date_from_str(s):
d, m, y = s.split('-')
return date(int(y), int(m), int(d))
def get_conf(conf_file):
conf = ConfigParser()
conf.read(conf_file)
return conf
def main(argv=sys.argv[1:]):
option = get_option(argv)
invoice_id = option.invoice_id
tgl_bayar = date_from_str(option.tgl_bayar)
conf = get_conf(option.conf)
cf = dict(conf.items('main'))
cf['persen_denda'] = float(cf['persen_denda'])
cf['rekening_tanpa_denda'] = cf.get('rekening_tanpa_denda', '').split()
engine = create_engine(cf['db_url'])
module = __import__('opensipkd.webr.services.' + cf['module'])
services = getattr(module.webr.services, cf['module'])
session_factory = sessionmaker(bind=engine)
module.webr.services.base.DBSession = db_session = session_factory()
register(module.webr.services.base.DBSession)
inq = services.Inquiry(invoice_id, cf['persen_denda'], tgl_bayar, conf=cf)
if not inq.invoice:
error(f'Invoice ID {invoice_id} tidak ada.')
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, 'status')
show_field(pay, 'posted')
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')