Commit 59cc2ecb by Owo Sugiana

Tambah pengenalan tabel gw_payment di BPHTB

1 parent 1c0d1eaa
3.1.8 2025-05-19 3.1.8 2025-05-20
---------------- ----------------
- Tambah pengenalan tabel gw_payment di PBB - Tambah pengenalan tabel gw_payment di PBB dan BPHTB
3.1.7 2025-02-27 3.1.7 2025-02-27
---------------- ----------------
......
...@@ -9,7 +9,8 @@ from sqlalchemy import ( ...@@ -9,7 +9,8 @@ from sqlalchemy import (
DateTime, DateTime,
String, String,
Text, Text,
Date, ForeignKey, Date,
ForeignKey,
UniqueConstraint, UniqueConstraint,
func, func,
or_, or_,
...@@ -48,6 +49,7 @@ from opensipkd.iso8583.bjb.bphtb.models import Log ...@@ -48,6 +49,7 @@ from opensipkd.iso8583.bjb.bphtb.models import Log
from ..models import ( from ..models import (
Base, Base,
Bphtb, Bphtb,
ApiLog,
) )
from ..common import ( from ..common import (
get_iso, get_iso,
...@@ -58,6 +60,7 @@ from ..common import ( ...@@ -58,6 +60,7 @@ from ..common import (
one_day, one_day,
InvalidSource, InvalidSource,
BANK_NAMES, BANK_NAMES,
BIT_18_NAMES,
) )
...@@ -165,6 +168,41 @@ def cartenz_invoice_id(pay): ...@@ -165,6 +168,41 @@ def cartenz_invoice_id(pay):
pay.no_urut_bphtb pay.no_urut_bphtb
def err_sspd_id(sspd_id):
msg = f'Field bphtb_bank.sspd_id {sspd_id} tidak ada di '\
'field bphtb_sspd.id'
raise InvalidSource(msg)
def err_kecamatan(kode):
msg = f'Field bphtb_sspd.kd_kecamatan {kode} '\
'tidak ada di field ref_kecamatan.kd_kecamatan'
raise InvalidSource(msg)
def err_kelurahan(kode):
msg = f'Field bphtb_sspd.kd_kelurahan {kode} '\
'tidak ada di field ref_kelurahan.kd_kelurahan'
raise InvalidSource(msg)
def err_config():
raise Exception('Tidak ada h2h_db_url maupun api_db_url di konfigurasi.')
def err_date(tgl_akhir, tgl_bayar):
print(f'DEBUG self.tgl_akhir {tgl_akhir}')
raise Exception(f'{tgl_bayar} adalah masa depan. Perbaiki script.')
def get_invoice_id(inv):
invoice_id = FixLength(INVOICE_ID)
invoice_id['Tahun'] = inv.tahun
invoice_id['Kode'] = inv.kode
invoice_id['SSPD No'] = inv.no_sspd
return invoice_id.get_raw()
class App(BaseApp): class App(BaseApp):
conf_name = 'bphtb payment last date' conf_name = 'bphtb payment last date'
report_orm = Bphtb report_orm = Bphtb
...@@ -189,7 +227,18 @@ class App(BaseApp): ...@@ -189,7 +227,18 @@ class App(BaseApp):
except DatabaseError: except DatabaseError:
self.prod_session.rollback() self.prod_session.rollback()
self.set_cartenz_models() self.set_cartenz_models()
self.set_h2h_db() if 'h2h_db_url' in self.conf:
factory = self.get_factory('h2h_db_url')
self.h2h_session = factory()
self.set_h2h_db()
else:
self.h2h_session = None
if 'api_db_url' in self.conf:
factory = self.get_factory('api_db_url')
self.api_session = factory()
self.base_q_api = self.api_session.query(ApiLog)
else:
self.api_session = None
def get_log_model(self): def get_log_model(self):
if self.is_sukabumi_kota: if self.is_sukabumi_kota:
...@@ -218,11 +267,6 @@ class App(BaseApp): ...@@ -218,11 +267,6 @@ class App(BaseApp):
return q.filter_by(bit_003=PAYMENT_CODE, bit_039='00') return q.filter_by(bit_003=PAYMENT_CODE, bit_039='00')
def set_h2h_db(self): def set_h2h_db(self):
if 'h2h_db_url' in self.conf:
factory = self.get_factory('h2h_db_url')
self.h2h_session = factory()
else:
self.h2h_session = self.prod_session
try: try:
self.h2h_session.query(JsonLog.bits).first() self.h2h_session.query(JsonLog.bits).first()
self.is_json_log = True self.is_json_log = True
...@@ -374,8 +418,6 @@ class App(BaseApp): ...@@ -374,8 +418,6 @@ class App(BaseApp):
return channel_id, info['channel'], iso.get_stan(), ntb return channel_id, info['channel'], iso.get_stan(), ntb
def get_iso_v2(self): def get_iso_v2(self):
if not self.base_q_log:
return
Log = self.get_log_model() Log = self.get_log_model()
if self.is_json_log: if self.is_json_log:
q = self.base_q_log.filter( q = self.base_q_log.filter(
...@@ -401,6 +443,15 @@ class App(BaseApp): ...@@ -401,6 +443,15 @@ class App(BaseApp):
channel_name = get_channel_name_by_row(row) channel_name = get_channel_name_by_row(row)
return channel_id, channel_name, stan, ntb return channel_id, channel_name, stan, ntb
def get_api(self, psppt):
q = self.base_q_api.filter_by(bit_059='1', bit_061=self.invoice_id)
q = q.order_by(ApiLog.id.desc())
row = q.first()
if not row:
return
channel_nama = BIT_18_NAMES[row.bit_018]
return row.bit_018, channel_nama, row.bit_011, row.bit_037, row.bit_032
def get_invoice_cartenz(self, pay): def get_invoice_cartenz(self, pay):
if pay.no_transaksi_byr in ('KB', 'KBT'): if pay.no_transaksi_byr in ('KB', 'KBT'):
if pay.no_transaksi_byr == 'KB': if pay.no_transaksi_byr == 'KB':
...@@ -513,47 +564,40 @@ class App(BaseApp): ...@@ -513,47 +564,40 @@ class App(BaseApp):
if self.is_cartenz: if self.is_cartenz:
return self.create_data_cartenz(pay) return self.create_data_cartenz(pay)
if not pay.sspd_id: if not pay.sspd_id:
msg = 'Field bphtb_bank.sspd_id NULL' raise InvalidSource('Field bphtb_bank.sspd_id NULL')
raise InvalidSource(msg)
inv = self.get_invoice(pay) inv = self.get_invoice(pay)
if not inv: if not inv:
msg = f'Field bphtb_bank.sspd_id {pay.sspd_id} tidak ada di '\ err_sspd_id(pay.sspd_id)
'field bphtb_sspd.id'
raise InvalidSource(msg)
cust = self.get_customer(inv) cust = self.get_customer(inv)
perolehan = self.get_perolehan(inv) perolehan = self.get_perolehan(inv)
kecamatan = self.get_kecamatan_nama(inv) kecamatan = self.get_kecamatan_nama(inv)
if not kecamatan: if not kecamatan:
msg = f'Field bphtb_sspd.kd_kecamatan {inv.kd_kecamatan} '\ err_kecamatan(inv.kd_kecamatan)
'tidak ada di field ref_kecamatan.kd_kecamatan'
raise InvalidSource(msg)
kelurahan = self.get_kelurahan_nama(inv) kelurahan = self.get_kelurahan_nama(inv)
if not kelurahan: if not kelurahan:
msg = f'Field bphtb_sspd.kd_kelurahan {inv.kd_kelurahan} '\ err_kelurahan(inv.kd_kelurahan)
'tidak ada di field ref_kelurahan.kd_kelurahan' self.invoice_id = get_invoice_id(inv)
raise InvalidSource(msg) bank_id = stan = ntb = None
channel_id = '0000'
invoice_id = FixLength(INVOICE_ID) channel_nama = 'MANUAL'
invoice_id['Tahun'] = inv.tahun if self.h2h_session:
invoice_id['Kode'] = inv.kode source = self.get_iso_v2()
invoice_id['SSPD No'] = inv.no_sspd
self.invoice_id = invoice_id.get_raw()
source = self.get_iso_v2()
if source:
channel_id, channel_nama, stan, ntb = source
else:
source = self.get_iso_v1(pay)
if source: if source:
channel_id, channel_nama, stan, ntb = source channel_id, channel_nama, stan, ntb = source
else: else:
stan = ntb = None source = self.get_iso_v1(pay)
channel_id = '0000' if source:
channel_nama = self.get_va_channel(pay.tanggal) or 'MANUAL' channel_id, channel_nama, stan, ntb = source
else:
channel_nama = self.get_va_channel(pay.tanggal) or 'MANUAL'
elif self.api_session:
source = self.get_api(pay)
if source:
channel_id, channel_nama, stan, ntb, bank_id = source
else:
err_config()
if pay.tanggal > date.today(): if pay.tanggal > date.today():
print(f'DEBUG self.tgl_akhir {self.tgl_akhir}') err_date(self.tgl_akhir, pay.tanggal)
raise Exception(
f'{pay.tanggal} adalah masa depan. Perbaiki script.')
return dict( return dict(
id=pay.id, stan=stan, ntb=ntb, tgl=pay.tanggal, jam=pay.jam, id=pay.id, stan=stan, ntb=ntb, tgl=pay.tanggal, jam=pay.jam,
invoice_id=self.invoice_id, nop=pay.nop, wp_nama=pay.wp_nama, invoice_id=self.invoice_id, nop=pay.nop, wp_nama=pay.wp_nama,
...@@ -562,4 +606,4 @@ class App(BaseApp): ...@@ -562,4 +606,4 @@ class App(BaseApp):
nilai_bphtb=pay.bayar, jenis_perolehan=perolehan.nama, nilai_bphtb=pay.bayar, jenis_perolehan=perolehan.nama,
ppat=cust.nama.strip(), channel_id=channel_id, ppat=cust.nama.strip(), channel_id=channel_id,
channel_nama=channel_nama, kecamatan_op=kecamatan.nm_kecamatan, channel_nama=channel_nama, kecamatan_op=kecamatan.nm_kecamatan,
kelurahan_op=kelurahan.nm_kelurahan) kelurahan_op=kelurahan.nm_kelurahan, bank_id=bank_id)
...@@ -4,6 +4,7 @@ from sqlalchemy import ( ...@@ -4,6 +4,7 @@ from sqlalchemy import (
BigInteger, BigInteger,
Float, Float,
String, String,
Text,
Date, Date,
Time, Time,
DateTime, DateTime,
...@@ -147,6 +148,7 @@ class Bphtb(Base, Common): ...@@ -147,6 +148,7 @@ class Bphtb(Base, Common):
kecamatan_op = Column(String(64)) kecamatan_op = Column(String(64))
# pbb.ref_kelurahan.nm_kelurahan # pbb.ref_kelurahan.nm_kelurahan
kelurahan_op = Column(String(64)) kelurahan_op = Column(String(64))
bank_id = Column(Integer)
class Pbb(Base, Common): class Pbb(Base, Common):
...@@ -266,3 +268,17 @@ class Pkb(Base, Common): ...@@ -266,3 +268,17 @@ class Pkb(Base, Common):
nama_kabupaten = Column(String(64), nullable=False) nama_kabupaten = Column(String(64), nullable=False)
__table_args__ = ( __table_args__ = (
UniqueConstraint(waktu, no_polisi),) UniqueConstraint(waktu, no_polisi),)
class ApiLog(Base):
__tablename__ = 'gw_payment'
id = Column(Integer, primary_key=True)
tgl = Column(DateTime(timezone=True), nullable=True)
bit_004 = Column(Text, nullable=False) # Nilai transaksi
bit_011 = Column(Text, nullable=False) # STAN
bit_018 = Column(Text, nullable=False) # Channel
bit_032 = Column(Text, nullable=False) # Bank
bit_037 = Column(Text, nullable=False) # NTB
bit_047 = Column(Text, nullable=False) # NTP
bit_059 = Column(Text, nullable=False) # 1 BPHTB, 2 PJDL, 3 WEBR, 4 PBB
bit_061 = Column(Text, nullable=False) # Invoice ID
...@@ -7,7 +7,6 @@ from sqlalchemy import ( ...@@ -7,7 +7,6 @@ from sqlalchemy import (
Integer, Integer,
String, String,
DateTime, DateTime,
Text,
UniqueConstraint, UniqueConstraint,
func, func,
) )
...@@ -25,6 +24,7 @@ from opensipkd.iso8583.bjb.models import Log as UniversalLog ...@@ -25,6 +24,7 @@ from opensipkd.iso8583.bjb.models import Log as UniversalLog
from ..models import ( from ..models import (
Pbb, Pbb,
Base, Base,
ApiLog,
) )
from ..common import ( from ..common import (
get_iso, get_iso,
...@@ -92,19 +92,6 @@ class JsonLog(Base): ...@@ -92,19 +92,6 @@ class JsonLog(Base):
dict(schema='public')) dict(schema='public'))
class ApiLog(Base):
__tablename__ = 'gw_payment'
id = Column(Integer, primary_key=True)
tgl = Column(DateTime(timezone=True), nullable=True)
bit_004 = Column(Text, nullable=False) # Nilai transaksi
bit_011 = Column(Text, nullable=False) # STAN
bit_018 = Column(Text, nullable=False) # Channel
bit_032 = Column(Text, nullable=False) # Bank
bit_037 = Column(Text, nullable=False) # NTB
bit_047 = Column(Text, nullable=False) # NTP
bit_061 = Column(Text, nullable=False) # Invoice ID
class App(BaseApp): class App(BaseApp):
conf_name = 'pbb payment last date' conf_name = 'pbb payment last date'
report_orm = Pbb report_orm = Pbb
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!