Commit 448b4353 by Owo Sugiana

Tambah pospbb

1 parent d5030564
test*
*egg-info
*__pycache__
build
0.1.3 29-4-2021
---------------
- Tambah pospbb
- Tambah opsi --update-from-id dan --update-from-date
- Perbaikan channel
0.1.2 13-4-2021
---------------
- Penambahan models pada konfigurasi PBB yang berisi nama modul untuk ORM Sppt
......
......@@ -15,7 +15,14 @@ from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Pad(Base):
class Common:
def from_dict(self, values):
for column in self.__table__.columns:
if column.name in values:
setattr(self, column.name, values[column.name])
class Pad(Base, Common):
__tablename__ = 'pad_report'
id = Column(Integer, primary_key=True)
# Bit 11
......@@ -53,7 +60,7 @@ class Pad(Base):
)
class Bphtb(Base):
class Bphtb(Base, Common):
__tablename__ = 'bphtb_report'
id = Column(Integer, primary_key=True)
# Bit 11
......@@ -97,7 +104,7 @@ class Bphtb(Base):
)
class Pbb(Base):
class Pbb(Base, Common):
__tablename__ = 'pbb_report'
id = Column(Integer, primary_key=True)
# Bit 11
......@@ -128,6 +135,8 @@ class Pbb(Base):
jml_sppt_yg_dibayar = Column(BigInteger, nullable=False)
# Field pembayaran_sppt.denda_sppt
denda_sppt = Column(BigInteger, nullable=False)
# Field pembayaran_sppt.discount
discount = Column(BigInteger, nullable=False)
# Bit 7 / Transmission Date Inquiry
tgl_inquiry = Column(DateTime(timezone=True), nullable=False)
# Bit 7 / Transmission Date
......
......@@ -30,8 +30,9 @@ BIT_18_NAMES = {
'6014': 'INTERNETBANKING',
'6015': 'KIOSK',
'6016': 'AUTODEBET',
'6017': 'MOBILBANKING',
'7012': 'PTPOS'}
'6017': 'MOBILBANKING'}
BIT_43_NAMES = ('INDOMARET', 'ALFAMART', 'LINKAJA', 'GOPAY', 'EMONEY', 'PTPOS')
my_registry = dict()
......@@ -77,11 +78,15 @@ def get_iso(raw, iso_class, debug=False):
iso.setIsoContent(raw)
return iso
def get_channel_name(bit_018, bit_041, bit_042, bit_043):
bit_018 = bit_018.strip()
bit_041 = bit_041.strip()
bit_042 = bit_042.strip()
bit_043 = bit_043.strip()
for name in BIT_43_NAMES:
if bit_043.find(name) > -1:
return name
if bit_018 in BIT_18_NAMES:
return BIT_18_NAMES[bit_018]
if bit_018 != '6025':
......@@ -90,8 +95,6 @@ def get_channel_name(bit_018, bit_041, bit_042, bit_043):
return bit_042
if bit_042 == 'NG':
return bit_041
if bit_043 in ('INDOMARET', 'ALFAMART','LINKAJA','GOPAY'):
return bit_043
return 'LAINNYA'
......@@ -130,6 +133,8 @@ def create_log(log_file):
def get_parser():
pars = ArgumentParser()
pars.add_argument('conf')
pars.add_argument('--update-from-id', type=int)
pars.add_argument('--update-from-date')
pars.add_argument('--debug', action='store_true')
pars.add_argument('--debug-sql', action='store_true')
return pars
......
......@@ -9,3 +9,4 @@ pbb payment last id,0,inquiry.id terakhir yang diproses
pbb reversal last date,1-1-2000 00:00:00,reversal.tgl terakhir yang diproses
pbb2 payment last id,0,log_iso.id terakhir yang diproses
pbb2 reversal last id,0,log_iso.id terakhir yang diproses
pospbb last id,0,pembayaran_sppt.id terakhir yang diproses
......@@ -8,6 +8,7 @@ from opensipkd.string import (
from opensipkd.waktu import (
dmyhms,
create_datetime,
date_from_str,
)
from sismiop.services.base import get_db_session
from opensipkd.iso8583.bjb.scripts.common import get_module_object
......@@ -106,8 +107,8 @@ class App(BaseApp):
thn_pajak_sppt=psppt.thn_pajak_sppt)
return q.first()
def __get_query_iso(self, last):
q_iso = self.base_q_iso.filter(self.iso_inquiry_orm.id > last.as_int())
def __get_query_iso(self, last_id):
q_iso = self.base_q_iso.filter(self.iso_inquiry_orm.id > last_id)
return q_iso.order_by(self.iso_inquiry_orm.id)
def __log_not_found(self, s_tgl, d):
......@@ -122,7 +123,7 @@ class App(BaseApp):
def __run_payment(self):
last = self.get_last_id('pbb payment last id')
q_iso = self.__get_query_iso(last)
q_iso = self.__get_query_iso(last.as_int())
found = False
for row_pay, row_inq in q_iso.limit(1000):
iso = get_iso(row_pay.iso_request, Doc, self.option.debug)
......@@ -154,7 +155,7 @@ class App(BaseApp):
channel_kode=iso.get_channel().strip(),
channel_nama=d['channel'], user_id=user_id,
pbb_yg_harus_dibayar_sppt=sppt.pbb_yg_harus_dibayar_sppt,
tgl_inquiry=row_inq.tgl)
tgl_inquiry=row_inq.tgl, discount=psppt.discount)
last.nilai = str(row_inq.id)
with transaction.manager:
self.rpt_session.add(rpt)
......@@ -162,9 +163,64 @@ class App(BaseApp):
found = True
return found
def __update_from_id(self):
q_iso = self.__get_query_iso(self.last_id)
found = False
for row_pay, row_inq in q_iso.limit(1000):
iso = get_iso(row_pay.iso_request, Doc, self.option.debug)
d = get_keys(iso)
tgl_bayar = get_tgl_bayar(iso, row_inq.tgl.year)
s_tgl = dmyhms(tgl_bayar)
psppt = self.get_psppt(row_pay)
if not psppt:
self.__log_not_found(s_tgl, d)
continue
sppt = self.get_sppt(psppt)
nama_wp = get_nama_wp(iso, sppt)
user_id = get_user_id(iso)
self.__log_progress(s_tgl, d)
d = dict(
stan=d['stan'], ntb=d['ntb'],
kd_propinsi=psppt.kd_propinsi,
kd_dati2=psppt.kd_dati2, kd_kecamatan=psppt.kd_kecamatan,
kd_kelurahan=psppt.kd_kelurahan, kd_blok=psppt.kd_blok,
no_urut=psppt.no_urut, kd_jns_op=psppt.kd_jns_op,
thn_pajak_sppt=psppt.thn_pajak_sppt,
pembayaran_sppt_ke=psppt.pembayaran_sppt_ke,
jml_sppt_yg_dibayar=iso.get_amount(),
denda_sppt=psppt.denda_sppt,
tgl_pembayaran_sppt=tgl_bayar.date(),
tgl_rekam_byr_sppt=tgl_bayar, nm_wp_sppt=nama_wp,
channel_kode=iso.get_channel().strip(),
channel_nama=d['channel'], user_id=user_id,
pbb_yg_harus_dibayar_sppt=sppt.pbb_yg_harus_dibayar_sppt,
tgl_inquiry=row_inq.tgl, discount=psppt.discount)
rpt = self.get_report(iso)
if not rpt:
rpt = Pbb()
rpt.from_dict(d)
with transaction.manager:
self.rpt_session.add(rpt)
found = True
self.last_id = row_inq.id
return found
def run_payment(self): # Override
if self.option.update_from_id:
self.last_id = self.option.update_from_id
func = self.__update_from_id
elif self.option.update_from_date:
tgl = date_from_str(self.option.update_from_date)
q = self.prod_session.query(self.iso_inquiry_orm).filter(
self.iso_inquiry_orm.tgl >= tgl).order_by(
self.iso_inquiry_orm.id)
row = q.first()
self.last_id = row.id - 1
func = self.__update_from_id
else:
func = self.__run_payment
while True:
found = self.__run_payment()
found = func()
if not found:
break
......
import sys
from sqlalchemy import (
Column,
Integer,
)
import transaction
from opensipkd.waktu import (
dmyhms,
create_datetime,
date_from_str,
)
from sismiop.models.default import PembayaranSppt as BasePsppt
from sismiop.services.base import (
get_db_session,
get_id,
)
from opensipkd.iso8583.bjb.scripts.common import get_module_object
from ..models import Pbb
from .common import (
get_iso,
get_keys,
BaseApp,
)
NIP_PENCATAT = '888888888'
CHANNEL_KODE = '7000'
CHANNEL_NAMA = 'POSPBB'
ERR_NOT_FOUND = 'SPPT ID {invoice_id} tidak ada di sppt'
class PembayaranSppt(BasePsppt):
__table_args__ = dict(extend_existing=True)
id = Column(Integer, nullable=False)
user_id = Column(Integer)
def get_tgl_bayar(row):
t = row.tgl_rekam_byr_sppt
return create_datetime(t.year, t.month, t.day, t.hour, t.minute, t.second)
class App(BaseApp):
report_orm = Pbb
def __init__(self, argv):
super().__init__(argv)
if not self.pid:
return
self.models = get_module_object(self.conf['models'])
self.Sppt = self.models.Sppt
self.base_q_psppt = self.prod_session.query(PembayaranSppt).filter_by(
nip_rekam_byr_sppt=NIP_PENCATAT)
self.base_q_sppt = self.prod_session.query(self.Sppt)
def get_db_session(self): # Override
return get_db_session()
def get_sppt(self, psppt):
q = self.base_q_sppt.filter_by(
kd_propinsi=psppt.kd_propinsi,
kd_dati2=psppt.kd_dati2,
kd_kecamatan=psppt.kd_kecamatan,
kd_kelurahan=psppt.kd_kelurahan,
kd_blok=psppt.kd_blok,
no_urut=psppt.no_urut,
kd_jns_op=psppt.kd_jns_op,
thn_pajak_sppt=psppt.thn_pajak_sppt)
return q.first()
def __get_query_psppt(self, last_id):
q = self.base_q_psppt.filter(PembayaranSppt.id > last_id)
return q.order_by(PembayaranSppt.id)
def __log_not_found(self, sppt_id):
msg = ERR_NOT_FOUND.format(invoice_id=sppt_id)
self.log.error(msg)
def __log_progress(self, row, sppt_id):
s_tgl = dmyhms(row.tgl_rekam_byr_sppt)
self.log.info(
f'Tgl bayar {s_tgl}, Nomor bayar {sppt_id}, '
f'pembayaran ke {row.pembayaran_sppt_ke}, ID {row.id}, '
f'jml_sppt_yg_dibayar {row.jml_sppt_yg_dibayar}')
def __run_payment(self):
last = self.get_last_id('pospbb last id')
q_psppt = self.__get_query_psppt(last.as_int())
found = False
for psppt in q_psppt.limit(1000):
stan = psppt.tgl_pembayaran_sppt.strftime('%y%m%d')
ntb = f'POSPBB-{psppt.id}'
if self.get_report(stan, ntb):
continue
sppt_id = get_id(psppt)
sppt = self.get_sppt(psppt)
if not sppt:
self.__log_not_found(sppt_id)
continue
tgl_bayar = get_tgl_bayar(psppt)
user_id = str(psppt.user_id)
disc = psppt.discount or 0
self.__log_progress(psppt, sppt_id)
rpt = Pbb(
stan=stan, ntb=ntb, kd_propinsi=psppt.kd_propinsi,
kd_dati2=psppt.kd_dati2, kd_kecamatan=psppt.kd_kecamatan,
kd_kelurahan=psppt.kd_kelurahan, kd_blok=psppt.kd_blok,
no_urut=psppt.no_urut, kd_jns_op=psppt.kd_jns_op,
thn_pajak_sppt=psppt.thn_pajak_sppt,
pembayaran_sppt_ke=psppt.pembayaran_sppt_ke,
jml_sppt_yg_dibayar=psppt.jml_sppt_yg_dibayar,
denda_sppt=psppt.denda_sppt,
tgl_pembayaran_sppt=psppt.tgl_pembayaran_sppt,
tgl_rekam_byr_sppt=psppt.tgl_rekam_byr_sppt,
nm_wp_sppt=sppt.nm_wp_sppt, channel_kode=CHANNEL_KODE,
channel_nama=CHANNEL_NAMA, user_id=user_id,
pbb_yg_harus_dibayar_sppt=sppt.pbb_yg_harus_dibayar_sppt,
tgl_inquiry=tgl_bayar, discount=disc)
last.nilai = str(psppt.id)
with transaction.manager:
self.rpt_session.add(rpt)
self.rpt_session.add(last)
found = True
return found
def __update_from_id(self):
q_psppt = self.__get_query_psppt(self.last_id)
found = False
for psppt in q_psppt.limit(1000):
sppt_id = get_id(psppt)
sppt = self.get_sppt(psppt)
if not sppt:
self.__log_not_found(sppt_id)
continue
stan = psppt.tgl_pembayaran_sppt.strftime('%y%m%d')
ntb = f'POSPBB-{psppt.id}'
tgl_bayar = get_tgl_bayar(psppt)
user_id = str(psppt.user_id)
disc = psppt.discount or 0
rpt = self.get_report(stan, ntb)
if not rpt:
rpt = Pbb()
self.__log_progress(psppt, sppt_id)
d = dict(
stan=stan, ntb=ntb, kd_propinsi=psppt.kd_propinsi,
kd_dati2=psppt.kd_dati2, kd_kecamatan=psppt.kd_kecamatan,
kd_kelurahan=psppt.kd_kelurahan, kd_blok=psppt.kd_blok,
no_urut=psppt.no_urut, kd_jns_op=psppt.kd_jns_op,
thn_pajak_sppt=psppt.thn_pajak_sppt,
pembayaran_sppt_ke=psppt.pembayaran_sppt_ke,
jml_sppt_yg_dibayar=psppt.jml_sppt_yg_dibayar,
denda_sppt=psppt.denda_sppt,
tgl_pembayaran_sppt=psppt.tgl_pembayaran_sppt,
tgl_rekam_byr_sppt=psppt.tgl_rekam_byr_sppt,
nm_wp_sppt=sppt.nm_wp_sppt, channel_kode=CHANNEL_KODE,
channel_nama=CHANNEL_NAMA, user_id=user_id,
pbb_yg_harus_dibayar_sppt=sppt.pbb_yg_harus_dibayar_sppt,
tgl_inquiry=tgl_bayar, discount=disc)
rpt.from_dict(d)
with transaction.manager:
self.rpt_session.add(rpt)
found = True
self.last_id = psppt.id
return found
def run_payment(self): # Override
if self.option.update_from_id:
self.last_id = self.option.update_from_id
func = self.__update_from_id
elif self.option.update_from_date:
tgl = date_from_str(self.option.update_from_date)
q = self.prod_session.query(PembayaranSppt).filter(
PembayaranSppt.tgl_rekam_byr_sppt >= tgl).order_by(
PembayaranSppt.tgl_rekam_byr_sppt)
row = q.first()
self.last_id = row.id - 1
func = self.__update_from_id
else:
func = self.__run_payment
while True:
found = func()
if not found:
break
def main(argv=sys.argv[1:]):
app = App(argv)
app.run()
......@@ -36,6 +36,7 @@ setup(
'console_scripts': [
'payment_report_init_db = payment_report.scripts.common:init_db',
'pbb_report = payment_report.scripts.pbb:main',
'pospbb_report = payment_report.scripts.pospbb:main',
'bphtb_report = payment_report.scripts.bphtb:main',
'bphtb2_report = payment_report.scripts.bphtb2:main',
'pad_report = payment_report.scripts.pad:main',
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!