Commit 44dd7657 by Owo Sugiana

Tambah PBB H2H Only

1 parent b65bcf77
3.2 2024-05-04
--------------
- Tambah PBB H2H Only
3.1.3 2023-08-21
----------------
- Tambah PBB VA & QRIS Only
......
......@@ -17,6 +17,7 @@ from sqlalchemy import (
BigInteger,
ForeignKey,
create_engine,
func,
)
from sqlalchemy.orm import sessionmaker
import transaction
......@@ -343,14 +344,14 @@ class BaseApp:
else:
msg = f'INSERT {d}'
rpt = self.report_orm(**source)
msg = f'{self.get_prefix_log()} {msg}'
log_method = log.info
except InvalidSource as e:
msg = str(e)
log_method = log.warning
rpt = None
e = self.get_estimate(no)
log_method(f'#{no}/{self.count} {msg}, estimate {e}')
prefix = self.get_prefix_log()
log_method(f'#{no}/{self.count} {prefix} {msg}, estimate {e}')
if rpt:
session = self.get_session_for_save()
with transaction.manager:
......@@ -369,8 +370,13 @@ class BaseApp:
self.rpt_session.flush()
self.rpt_session.expunge_all()
def get_count(self): # Override, please
pass
def get_filter_query(self, q): # Override, please
return q
def get_count(self):
q = self.prod_session.query(func.count())
q = self.get_filter_query(q)
return q.scalar()
def prepare_query_filter(self):
if 'tgl_awal' in self.conf:
......
import requests
from sqlalchemy import func
import transaction
from opensipkd.waktu import dmyhms
from opensipkd.string import FixLength
from sismiop.services.base import INVOICE_ID
......@@ -8,111 +5,88 @@ from opensipkd.iso8583.bjb.pbb.structure import (
PAYMENT_CODE,
INVOICE_PROFILE,
)
from opensipkd.iso8583.bjb.models import Log
from payment_report.scripts.tools import (
plain_values,
update,
)
from payment_report.scripts.common import (
InvalidSource,
from opensipkd.iso8583.bjb.pbb.models import Log
from ..common import (
BaseApp,
one_day,
get_channel_name_by_row,
row_limit,
get_channel_name,
InvalidSource,
)
from ..models import Pbb
class Handler:
def __init__(self, parent):
self.parent = parent
def filter_tgl(self, q):
q = q.filter(
Log.created >= self.parent.tgl_awal,
Log.created < self.parent.tgl_akhir + one_day,
Log.bits.op('->>')('3') == PAYMENT_CODE,
Log.bits.op('->>')('39') == '00')
return q.filter_by(mti='0210')
def get_payment_query(self):
q = self.parent.h2h_session.query(Log)
return self.filter_tgl(q).order_by(Log.id)
def get_count(self): # dipanggil parent
q = self.parent.h2h_session.query(func.count(Log.id))
q = self.filter_tgl(q)
return q.scalar()
class App(BaseApp):
conf_name = 'pbb payment last date'
report_orm = Pbb
va_product_code = '02'
def get_last_time(self): # dipanggil parent
return dmyhms(self.parent.last_pay.created)
def get_report(self, pay):
session = self.parent.get_session_for_save()
q = session.query(self.parent.report_orm).filter_by(id=pay.id)
def get_before(self, r):
q = self.rpt_session.query(Pbb).filter_by(
kd_propinsi=r['kd_propinsi'], kd_dati2=r['kd_dati2'],
kd_kecamatan=r['kd_kecamatan'], kd_kelurahan=r['kd_kelurahan'],
kd_blok=r['kd_blok'], no_urut=r['no_urut'],
kd_jns_op=r['kd_jns_op'], thn_pajak_sppt=r['thn_pajak_sppt'])
q = q.filter(Pbb.id < r['id'])
q = q.order_by(Pbb.id.desc())
return q.first()
def create_data(self, pay):
channel_nama = get_channel_name_by_row(pay.bits)
channel_kode = pay.bits['18'] or '0000'
profile = pay.bits_data['62']
def create_data(self, log_iso): # Override
self.invoice_id = log_iso.bit_061
if log_iso.mti == '0210' and log_iso.bit_039 != '00':
raise InvalidSource('payment gagal')
inv_id = FixLength(INVOICE_ID)
inv_id.set_raw(pay.bits['61'])
return dict(
id=pay.id, kd_propinsi=inv_id['Propinsi'],
inv_id.set_raw(self.invoice_id)
channel_nama = get_channel_name(
log_iso.bit_018, log_iso.bit_032, log_iso.bit_041, log_iso.bit_042,
log_iso.bit_043)
channel_kode = log_iso.bit_018 or '0000'
print(log_iso.id)
r = dict(
id=log_iso.id, kd_propinsi=inv_id['Propinsi'],
kd_dati2=inv_id['Kabupaten'], kd_kecamatan=inv_id['Kecamatan'],
kd_kelurahan=inv_id['Kelurahan'], kd_blok=inv_id['Blok'],
no_urut=inv_id['Urut'], kd_jns_op=inv_id['Jenis'],
thn_pajak_sppt=inv_id['Tahun'], pembayaran_sppt_ke=1,
stan=pay.bits['11'], ntb=pay.bits['48'],
jml_sppt_yg_dibayar=float(pay.bits['4']),
denda_sppt=float(profile['Denda']),
discount=float(profile['Discount']),
tgl_pembayaran_sppt=pay.created.date(),
tgl_rekam_byr_sppt=pay.created, nm_wp_sppt=profile['Nama'],
stan=log_iso.bit_011, ntb=log_iso.bit_048,
jml_sppt_yg_dibayar=float(log_iso.bit_004),
channel_kode=channel_kode, channel_nama=channel_nama,
bank_id=pay.bits['32'], user_id=pay.bits['107'],
pbb_yg_harus_dibayar_sppt=float(profile['Tagihan']))
bank_id=log_iso.bit_032, user_id=log_iso.bit_107)
if log_iso.mti == '0210':
profile = log_iso.bit_062_data
r.update(dict(
tgl_pembayaran_sppt=log_iso.created.date(),
tgl_rekam_byr_sppt=log_iso.created,
denda_sppt=float(profile['Denda']),
discount=float(profile['Discount']),
nm_wp_sppt=profile['Nama'],
pbb_yg_harus_dibayar_sppt=float(profile['Tagihan'])))
before = self.get_before(r)
if before:
if log_iso.mti == '0210':
r['pembayaran_sppt_ke'] = before.pembayaran_sppt_ke + 1
else: # mti = 0400 = reversal
r['id'] = before.id
r['tgl_batal'] = log_iso.created
elif log_iso.mti == '0400':
raise InvalidSource(
f'ID {log_iso.id} tidak ada yang perlu dibatalkan')
return r
def get_report(self, log_iso): # Override
q = self.rpt_session.query(Pbb).filter_by(id=log_iso.id)
return q.first()
def get_last_time(self): # Override
return dmyhms(self.last_pay.created)
def get_filter_query(self, q): # Override
return q.filter(
Log.created >= self.tgl_awal,
Log.created < self.tgl_akhir + one_day,
Log.bit_003 == PAYMENT_CODE,
Log.mti.in_(['0210', '0400']))
def update_from_date(self):
q = self.get_payment_query()
no = self.parent.offset
found = False
for pay in q.offset(self.parent.offset).limit(row_limit):
found = True
self.parent.invoice_id = pay.bits['61'].strip()
no += 1
try:
source = self.create_data(pay)
d = plain_values(source)
rpt = self.get_report(pay)
if rpt:
target = rpt.to_dict()
target_update, log_msg = update(source, target)
if target_update:
s = ', '.join(log_msg)
msg = f'UPDATE {d} change {s}'
rpt.from_dict(target_update)
else:
msg = f'ALREADY SAME {d}'
rpt = None
if self.parent.count == 1 and self.parent.last:
print(msg)
print('Log yang sama, abaikan.')
return
else:
msg = f'INSERT {d}'
rpt = self.parent.report_orm(**source)
msg = f'{self.parent.get_prefix_log()} {msg}'
log_method = self.parent.log.info
except InvalidSource as e:
msg = str(e)
log_method = self.parent.log.warning
rpt = None
e = self.parent.get_estimate(no)
log_method(f'#{no}/{self.parent.count} {msg}, estimate {e}')
if rpt:
session = self.parent.get_session_for_save()
with transaction.manager:
session.add(rpt)
self.parent.last_pay = pay
self.parent.offset += row_limit
return found
def get_payment_query(self): # Override
q = self.prod_session.query(Log)
q = self.get_filter_query(q)
return q.order_by(Log.created)
[main]
module = payment_report.pbb.only_h2h
db_url = postgresql://h2h:FIXME@localhost:5432/h2h
report_db_url = postgresql://pcpd:FIXME@localhost:5432/pcpd
pid_file = /home/pcpd/tmp/pbb-report.pid
[formatter_generic]
format = %(asctime)s %(levelname)s %(name)s %(message)s
[formatter_simple]
format = %(asctime)s %(levelname)s %(message)s
[handler_console]
class = StreamHandler
stream = sys.stdout
formatter = generic
[handler_file]
class = FileHandler
filename = /home/pcpd/logs/pbb-report.log
formatter = simple
[logger_root]
handlers = console, file
level = INFO
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!