Commit 3bf57089 by Owo Sugiana

PBB mengenal channel POSPBB

1 parent 63779a0d
......@@ -11,6 +11,7 @@ from sismiop.services.base import get_id
from opensipkd.string import (
FixLength,
DateTimeVar,
to_str,
)
from opensipkd.waktu import (
dmyhms,
......@@ -27,13 +28,60 @@ from .common import (
)
ERR_SPPT_NOT_FOUND = 'SPPT ID {invoice_id} tidak ada di tabel sppt'
class SpptNotFound(Exception):
pass
one_second = timedelta(1/24/60/60)
one_day = timedelta(1)
row_limit = 1000
log_psppt_fields = (
'tgl_rekam_byr_sppt', 'jml_sppt_yg_dibayar', 'nip_rekam_byr_sppt',
'kd_kanwil', 'kd_kantor', 'kd_tp')
log_iso_bits = [
(4, int),
(11, str),
(48, str)]
def get_log_row(row, fieldnames):
r = dict()
for fieldname in fieldnames:
val = getattr(row, fieldname)
if isinstance(val, datetime):
val = to_str(val)
elif isinstance(val, str):
val = val.strip()
r[fieldname] = val
return r
def log_psppt_msg(psppt):
invoice_id = get_id(psppt)
log_psppt = get_log_row(psppt, log_psppt_fields)
return f'ID {invoice_id} ke {psppt.pembayaran_sppt_ke}, '\
f'psppt {log_psppt}'
def get_log_iso(iso, bits):
r = dict()
for bit, f in bits:
val = iso.getBit(bit)
if f == str:
val = val.strip()
else:
val = f(val)
r[bit] = val
return r
def log_iso_msg(iso):
r = get_log_iso(iso, log_iso_bits)
return f'iso8583 {r}'
def get_profile(iso):
p = FixLength(INVOICE_PROFILE)
......@@ -84,6 +132,7 @@ class App(BaseApp):
self.Psppt = self.models.PembayaranSppt
self.Sppt = self.models.Sppt
self.base_q_sppt = self.prod_session.query(self.Sppt)
self.nip_pospbb = self.conf['nip_pospbb']
def get_iso_reversal_orm(self): # Override
return self.iso_reversal_orm
......@@ -103,10 +152,9 @@ class App(BaseApp):
def create_data(self, psppt, row_pay, iso):
sppt = self.get_sppt(psppt)
if not sppt:
invoice_id = get_id(psppt)
msg = ERR_SPPT_NOT_FOUND.format(invoice_id=invoice_id)
self.log.error(msg)
return
msg = log_psppt_msg(psppt)
self.log.error(f'{msg} tidak ada di tabel sppt')
raise SpptNotFound
nama_wp = get_nama_wp(iso, sppt)
bank_id = iso and iso.get_bank_id() or None
user_id = iso and get_user_id(iso) or None
......@@ -124,8 +172,7 @@ class App(BaseApp):
bank_id=bank_id, user_id=user_id,
pbb_yg_harus_dibayar_sppt=sppt.pbb_yg_harus_dibayar_sppt)
def get_iso_row(self, psppt):
iso_pay = self.iso_payment_orm
def get_iso_query(self, psppt):
iso_inq = self.iso_inquiry_orm
q = self.base_q_iso.filter_by(
propinsi=psppt.kd_propinsi,
......@@ -137,7 +184,14 @@ class App(BaseApp):
jenis=psppt.kd_jns_op,
tahun=psppt.thn_pajak_sppt,
ke=psppt.pembayaran_sppt_ke)
q = q.order_by(iso_inq.id.desc())
return q.order_by(iso_inq.id.desc())
def get_iso_row(self, psppt):
iso_inq = self.iso_inquiry_orm
awal = psppt.tgl_rekam_byr_sppt.date()
akhir = awal + one_day
q = self.get_iso_query(psppt)
q = q.filter(iso_inq.tgl >= awal, iso_inq.tgl < akhir)
return q.first()
def get_channel(self, psppt):
......@@ -146,9 +200,16 @@ class App(BaseApp):
row_pay, row_inq = row_pay
iso = get_iso(row_pay.iso_request, Doc, self.option.debug)
info = get_channel_info_by_iso(iso)
if psppt.tgl_rekam_byr_sppt.date() != row_inq.tgl.date():
raise TglTidakSama
return info['channel'], row_pay, row_inq, iso
elif psppt.nip_rekam_byr_sppt.strip() == self.nip_pospbb:
return 'POSPBB', None, None, None
q = self.get_iso_query(psppt)
row = q.first()
if row:
pay, inq = row
msg = log_psppt_msg(psppt)
msg = f'{msg}, iso8583 ada tapi tanggalnya beda yaitu {inq.tgl}'
self.log.warning(msg)
return 'MANUAL', None, None, None
def get_report(self, psppt):
......@@ -169,19 +230,19 @@ class App(BaseApp):
with transaction.manager:
self.rpt_session.add(self.last)
def __main_log_msg(self, no, psppt, d):
invoice_id = get_id(psppt)
tgl = psppt.tgl_rekam_byr_sppt.strftime('%d-%m-%Y %H:%M:%S')
return f'#{no}/{self.count} '\
f'ID {invoice_id} ke {psppt.pembayaran_sppt_ke}, '\
f'Tgl bayar {tgl}, Channel {d["channel_nama"]}'
def log_msg(self, no, psppt, iso, channel_nama):
msg = log_psppt_msg(psppt)
msg = f'#{no}/{self.count} {msg}'
if iso:
s = log_iso_msg(iso)
msg = f'{msg}, {s}'
return f'{msg}, Channel {channel_nama}'
def update_from_date(self):
q = self.prod_session.query(self.Psppt).filter(
self.Psppt.tgl_rekam_byr_sppt > self.tgl_awal,
self.Psppt.tgl_rekam_byr_sppt < self.tgl_akhir)
q = q.order_by(self.Psppt.tgl_rekam_byr_sppt)
self.last_psppt = None
no = self.offset
found = False
for psppt in q.offset(self.offset).limit(row_limit):
......@@ -189,27 +250,25 @@ class App(BaseApp):
no += 1
channel_nama, row_pay, row_inq, iso = self.get_channel(psppt)
d = dict(channel_nama=channel_nama)
if iso:
if psppt.tgl_rekam_byr_sppt.date() != row_inq.tgl.date():
raise TglTidakSama
if row_inq:
d['tgl_inquiry'] = row_inq.tgl
msg = self.__main_log_msg(no, psppt, d)
if iso:
msg = f'{msg}, STAN {iso.get_stan()}, NTB {iso.get_ntb()}'
msg = self.log_msg(no, psppt, iso, channel_nama)
if not psppt.jml_sppt_yg_dibayar:
self.log.warning(
f'{msg}, field jml_sppt_yg_dibayar 0, abaikan')
continue
self.log.info(msg)
data = self.create_data(psppt, row_pay, iso)
d.update(data)
rpt = self.get_report(psppt)
if rpt:
method = 'UPDATE'
rpt.from_dict(d)
else:
method = 'INSERT'
pkeys = data_pkeys(psppt)
d.update(pkeys)
rpt = Pbb(**d)
self.log.info(f'{msg}, {method}')
with transaction.manager:
self.rpt_session.add(rpt)
self.last_psppt = psppt
......@@ -223,6 +282,7 @@ class App(BaseApp):
return q.scalar()
def run_payment(self): # Override
self.last_psppt = None
self.last = None
self.offset = 0
if self.option.update_from_id:
......@@ -240,13 +300,13 @@ class App(BaseApp):
else:
self.last = self.get_last_id('pbb payment last date')
self.tgl_awal = self.last.as_datetime()
self.tgl_akhir = date.today() + one_day()
self.tgl_akhir = date.today() + one_day
self.count = self.get_count()
while True:
found = self.update_from_date()
if not found:
break
if self.last:
if self.last_psppt:
self.update_last()
def get_doc_for_reversal(self, row):
......
......@@ -4,3 +4,4 @@ db_url = postgresql://user:pass@localhost/db
report_db_url = postgresql://user:pass@localhost/db
pid_file = /home/sugiana/tmp/pbb-report.pid
log_file = /home/sugiana/log/pbb-report.log
nip_pospbb = 888888888
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!