Commit 31cb5a30 by Owo Sugiana

Tambah BPHTB Kabupaten Serang

1 parent 20c3d1d4
2.9 2022-12-28
--------------
- Tambah BPHTB Kabupaten Serang
2.8 2022-12-26
--------------
- Konfigurasi service bisa memuat class Handler untuk sumber data yang sangat
......
......@@ -15,6 +15,8 @@ from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy.exc import (
ProgrammingError,
OperationalError,
DatabaseError,
NoReferencedTableError,
)
from opensipkd.string import FixLength
from opensipkd.waktu import dmyhms
......@@ -28,10 +30,12 @@ from opensipkd.bphtb.models.default import (
Perolehan,
Customer,
)
from opensipkd.bphtb.structure import NOP
from opensipkd.bphtb.services.default.structure import INVOICE_ID
from iso8583_web.models.meta import Base as BaseConf
from opensipkd.iso8583.bjb.bphtb import Doc
from opensipkd.iso8583.bjb.bphtb.structure import PAYMENT_CODE
from opensipkd.iso8583.bjb.models import Log as JsonLog
from opensipkd.iso8583.bjb.bphtb.models import Log
from ..models import (
Base,
......@@ -40,6 +44,7 @@ from ..models import (
from .common import (
get_iso,
get_channel_name_by_row,
get_channel_name,
get_channel_info_by_iso,
BaseApp,
init_db as base_init_db,
......@@ -112,6 +117,11 @@ class SukabumiKotaLog(Base):
bit_062 = Column(Text)
def cartenz_invoice_id(pay):
return pay.thn_bphtb + pay.bln_bphtb + pay.tgl_bphtb + \
pay.no_urut_bphtb
class App(BaseApp):
conf_name = 'bphtb payment last date'
report_orm = Bphtb
......@@ -125,23 +135,32 @@ class App(BaseApp):
self.is_sukabumi_kota = False
try:
self.set_default_models()
except (ProgrammingError, OperationalError):
except (ProgrammingError, OperationalError, DatabaseError):
self.prod_session.rollback()
try:
self.set_alternative_models()
except (ProgrammingError, OperationalError):
except (
ProgrammingError, OperationalError,
NoReferencedTableError):
try:
self.set_sukabumi_kota_models()
except DatabaseError:
self.set_cartenz_models()
self.set_h2h_db()
def get_log_model(self):
if self.is_sukabumi_kota:
return SukabumiKotaLog
return Log
return self.is_json_log and JsonLog or Log
def get_base_q_log(self):
Log = self.get_log_model()
return self.h2h_session.query(Log).filter_by(
mti='0210', bit_003=PAYMENT_CODE, bit_039='00')
q = self.h2h_session.query(Log).filter_by(mti='0210')
if self.is_json_log:
return q.filter(
Log.bits.op('->>')('3') == PAYMENT_CODE,
Log.bits.op('->>')('39') == '00')
return q.filter_by(bit_003=PAYMENT_CODE, bit_039='00')
def set_h2h_db(self):
if 'h2h_db_url' in self.conf:
......@@ -149,6 +168,11 @@ class App(BaseApp):
self.h2h_session = factory()
else:
self.h2h_session = self.prod_session
try:
self.h2h_session.query(JsonLog.bits).first()
self.is_json_log = True
except ProgrammingError:
self.is_json_log = False
self.base_q_log = self.get_base_q_log()
try:
self.base_q_log.first()
......@@ -182,15 +206,41 @@ class App(BaseApp):
def set_sukabumi_kota_models(self):
from opensipkd.bphtb.models.sukabumi_kota import Invoice, Payment
self.base_q_inv = self.prod_session.query(Invoice)
self.base_q_inv.first()
self.is_sukabumi_kota = True
self.Invoice = Invoice
self.Payment = Payment
self.base_q_inv = self.prod_session.query(self.Invoice)
self.base_q_pay = self.prod_session.query(self.Payment)
self.base_q_inv_kb = self.prod_session.query(Skbkb)
self.base_q_inv_kbt = self.prod_session.query(Skbkbt)
self.base_q_pay = self.prod_session.query(Payment)
def set_cartenz_models(self):
from opensipkd.bphtb.models.serang_kab import Payment
import opensipkd.bphtb.services.base
from opensipkd.bphtb.services.serang_kab import Inquiry
opensipkd.bphtb.services.base.DBSession = self.prod_session
self.is_cartenz = True
self.Payment = Payment
self.Inquiry = Inquiry
self.base_q_pay = self.prod_session.query(Payment)
def get_report_cartenz(self, pay):
session = self.get_session_for_save()
invoice_id = cartenz_invoice_id(pay)
q = session.query(self.report_orm).filter_by(invoice_id=invoice_id)
return q.first()
def get_report(self, pay): # Override
if self.is_cartenz:
return self.get_report_cartenz(pay)
return super().get_report(pay)
def get_last_time(self): # Override
if self.is_sukabumi_kota:
return self.last_pay.tgl_rekam.strftime('%d-%m-%Y %H:%M:%S')
if self.is_cartenz:
return self.last_pay.tgl_rekam_byr.strftime('%d-%m-%Y %H:%M:%S')
s_tgl = self.last_pay.tanggal.strftime('%d-%m-%Y')
s_jam = self.last_pay.jam.strftime('%H:%M:%S')
return f'{s_tgl} {s_jam}'
......@@ -210,9 +260,16 @@ class App(BaseApp):
self.Payment.tgl_pembayaran >= self.tgl_awal,
self.Payment.tgl_pembayaran < self.tgl_akhir + one_day)
def get_filter_query_cartenz(self, q):
return q.filter(
self.Payment.tgl_rekam_byr >= self.tgl_awal,
self.Payment.tgl_rekam_byr < self.tgl_akhir + one_day)
def get_count(self) -> int: # Override
if self.is_sukabumi_kota:
q = self.get_filter_query_sukabumi_kota(self.base_q_func)
elif self.is_cartenz:
q = self.get_filter_query_cartenz(self.base_q_func)
else:
q = self.get_filter_query(self.base_q_func)
return q.scalar()
......@@ -221,6 +278,12 @@ class App(BaseApp):
if self.is_sukabumi_kota:
q = self.get_filter_query_sukabumi_kota(self.base_q_pay)
return q.order_by(self.Payment.tgl_pembayaran, self.Payment.id)
if self.is_cartenz:
q = self.get_filter_query_cartenz(self.base_q_pay)
return q.order_by(
self.Payment.tgl_rekam_byr, self.Payment.thn_bphtb,
self.Payment.bln_bphtb, self.Payment.tgl_bphtb,
self.Payment.no_urut_bphtb)
q = self.get_filter_query(self.base_q_pay)
return q.order_by(self.Payment.tanggal, self.Payment.jam)
......@@ -241,14 +304,50 @@ class App(BaseApp):
if not self.base_q_log:
return
Log = self.get_log_model()
q = self.base_q_log.filter(func.trim(Log.bit_062) == self.invoice_id)
if self.is_json_log:
q = self.base_q_log.filter(
func.trim(Log.bits.op('->>')('62')) == self.invoice_id)
else:
q = self.base_q_log.filter(
func.trim(Log.bit_062) == self.invoice_id)
q = q.order_by(Log.id.desc())
row = q.first()
if not row:
return
if self.is_json_log:
channel_id = row.bits['18'].strip()
stan = row.bits['11']
ntb = row.bits['58'].strip()
channel_name = get_channel_name(
row.bits['18'], row.bits['32'], row.bits['41'], row.bits['42'],
row.bits['43'])
else:
channel_id = row.bit_018.strip()
channel_nama = get_channel_name_by_row(row)
return channel_id, channel_nama, row.bit_011, row.bit_058.strip()
stan = row.bit_011
ntb = row.bit_058.strip()
channel_name = get_channel_name_by_row(row)
return channel_id, channel_name, stan, ntb
def get_invoice_cartenz(self, pay):
if pay.no_transaksi_byr in ('KB', 'KBT'):
if pay.no_transaksi_byr == 'KB':
q = self.base_q_inv_kb
else:
q = self.base_q_inv_kbt
q = q.filter_by(
thn_bphtb_terbit=pay.thn_bphtb,
bln_bphtb_terbit=pay.bln_bphtb,
tgl_bphtb_terbit=pay.tgl_bphtb,
no_urut_bphtb_terbit=pay.no_urut_bphtb)
row = q.first()
else:
row = pay
q = self.base_q_inv.filter_by(
thn_bphtb=row.thn_bphtb,
bln_bphtb=row.bln_bphtb,
tgl_bphtb=row.tgl_bphtb,
no_urut_bphtb=row.no_urut_bphtb)
return q.first()
def get_invoice(self, pay):
if self.is_sukabumi_kota:
......@@ -288,9 +387,45 @@ class App(BaseApp):
jenis_perolehan=str(inv.jns_perolehan_hak), ppat=inv.nama_notaris,
channel_id=channel_id, channel_nama=channel_nama)
def create_data_cartenz(self, pay):
self.invoice_id = cartenz_invoice_id(pay)
inq = self.Inquiry(self.invoice_id, None, for_test=True)
if not inq.invoice:
msg = f'Invoice ID {self.invoice_id} tidak ditemukan'
raise InvalidSource(msg)
source = self.get_iso_v2()
if source:
channel_id, channel_nama, stan, ntb = source
else:
stan = ntb = None
channel_id = '0000'
channel_nama = 'MANUAL'
inv = inq.invoice
nop_struct = FixLength(NOP)
nop_struct.from_dict({
'Propinsi': inv.kd_propinsi,
'Kabupaten': inv.kd_dati2,
'Kecamatan': inv.kd_kecamatan_op,
'Kelurahan': inv.kd_kelurahan_op,
'Blok': inv.kd_blok_op,
'Urut': inv.no_urut_op,
'Jenis': inv.kd_jns_op})
nop = nop_struct.get_raw()
return dict(
stan=stan, ntb=ntb, tgl=pay.tgl_rekam_byr.date(),
jam=pay.tgl_rekam_byr.time(), invoice_id=self.invoice_id,
nop=nop, wp_nama=inq.get_nama(), wp_alamat=inq.get_alamat_wp(),
op_alamat=inq.get_alamat_op(), npop=inq.get_npop(),
bumi_luas=inq.get_luas_tanah(), bng_luas=inq.get_luas_bangunan(),
nilai_bphtb=pay.bphtb_sdh_dibayar,
jenis_perolehan=inv.kd_jns_hak, ppat=inq.get_nama_notaris(),
channel_id=channel_id, channel_nama=channel_nama)
def create_data(self, pay): # Override
if self.is_sukabumi_kota:
return self.create_data_sukabumi_kota(pay)
if self.is_cartenz:
return self.create_data_cartenz(pay)
if not pay.sspd_id:
msg = 'Field bphtb_bank.sspd_id NULL'
raise InvalidSource(msg)
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!