Commit 3cb16c61 by Owo Sugiana

DB schema BPHTB yang lebih fleksibel

1 parent 9a47ec7e
2.0 2022-07-17
2.0 2022-07-18
--------------
- Perbedaan utama dari versi 0.x adalah kini berangkat dari tabel aslinya dan
bukan dari tabel ISO8583 karena sudah memperhatikan channel MANUAL (input
......
......@@ -11,6 +11,7 @@ Pasang paket yang dibutuhkan::
$ ~/env/bin/pip install wheel
$ ~/env/bin/pip install ebcdic
$ ~/env/bin/pip install git+https://git.opensipkd.com/sugiana/opensipkd-iso8583-bjb.git
$ ~/env/bin/pip install git+https://git.opensipkd.com/sugiana/opensipkd-iso8583-multi.git
Lalu pasang paket ini::
......@@ -35,23 +36,28 @@ diperlukan user ``report``::
GRANT SELECT ON pad_payment TO report;
GRANT SELECT ON pad_reversal TO report;
Lalu buat file konfigurasi bernama ``pad.ini``::
Lalu buat file konfigurasi bernama ``pad-report.ini``::
[main]
models = opensipkd.pad.models.default
service = opensipkd.pad.services.default
db_url = postgresql://report:password@localhost:5432/simpad
report_db_url = postgresql://report:password@localhost:5432/payment_report
pid_file = /home/sugiana/tmp/pad-report.pid
log_file = /home/sugiana/log/pad-report.log
Jika ada database VA / QRIS maka tambahkan::
va_db_url = postgresql://report:password@localhost:5432/va_bjb
Buat tabel yang dibutuhkan di database ``payment_report``::
$ ~/env/bin/payment_report_init_db pad.ini
$ ~/env/bin/payment_report_init_db pad-report.ini
Kemudian buat file ``/etc/cron.d/payment-report`` berikut ini::
MAILTO=""
*/5 * * * * sugiana cd /home/sugiana/payment-report && ../env/bin/pad_report pad.ini
*/5 * * * * sugiana cd /home/sugiana && env/bin/pad_report pad-report.ini
Lalu pantau log-nya. Jika sudah ada penampakan lihat hasilnya di tabel ``pad_report``.
......@@ -70,8 +76,9 @@ Berikan hak akses yang diperlukan user ``report``::
GRANT SELECT ON bphtb.bphtb_sspd TO report;
GRANT SELECT ON bphtb.bphtb_perolehan TO report;
GRANT SELECT ON bphtb.bphtb_ppat TO report;
GRANT SELECT ON log_iso TO report;
Lalu buat file konfigurasi bernama ``bphtb.ini``::
Lalu buat file konfigurasi bernama ``bphtb-report.ini``::
[main]
models = opensipkd.bphtb.models.default
......@@ -80,30 +87,15 @@ Lalu buat file konfigurasi bernama ``bphtb.ini``::
pid_file = /home/sugiana/tmp/bphtb-report.pid
log_file = /home/sugiana/log/bphtb-report.log
Kemudian di file ``/etc/cron.d/payment-report`` tambahkan::
*/5 * * * * sugiana cd /home/sugiana/payment-report && ../env/bin/bphtb_report bphtb.ini
Lalu pantau log-nya. Jika sudah ada penampakan lihat hasilnya di tabel ``bphtb_report``.
BPHTB Versi 2
-------------
Jika ada database VA / QRIS maka tambahkan::
Yang dimaksud versi 2 di sini adalah tidak lagi mencatat ISO8583 di tabel
``bphtb.bphtb_payment`` dan ``bphtb.bphtb_reversal`` melainkan sepenuhnya di
tabel ``log_iso``. Jika tabel ini sudah ada maka script sebelumnya yaitu
``bin/bphtb_report`` cukup dijalankan sekali saja, tidak perlu ditaruh di cron.
va_db_url = postgresql://report:password@localhost:5432/va_bjb
Lalu beri hak akses ke tabel ``log_iso``::
GRANT SELECT ON log_iso TO report;
Kemudian di file ``/etc/cron.d/payment-report`` menjadi begini::
Kemudian di file ``/etc/cron.d/payment-report`` tambahkan::
*/5 * * * * sugiana cd /home/sugiana/payment-report && ../env/bin/bphtb2_report bphtb.ini
*/5 * * * * sugiana cd /home/sugiana && env/bin/bphtb_report bphtb-report.ini
Ya, tidak ada perubahan dengan file konfigurasi. Semoga berhasil.
Lalu pantau log-nya. Jika sudah ada penampakan lihat hasilnya di tabel ``bphtb_report``.
PBB
......@@ -119,8 +111,9 @@ Berikan hak akses yang diperlukan user ``report``::
GRANT SELECT ON pbb.inquiry TO report;
GRANT SELECT ON pbb.payment TO report;
GRANT SELECT ON pbb.reversal TO report;
GRANT SELECT ON log_iso TO report;
Lalu buat file konfigurasi bernama ``pbb.ini``::
Lalu buat file konfigurasi bernama ``pbb-report.ini``::
[main]
models = sismiop.models.default
......@@ -129,8 +122,12 @@ Lalu buat file konfigurasi bernama ``pbb.ini``::
pid_file = /home/sugiana/tmp/pbb-report.pid
log_file = /home/sugiana/log/pbb-report.log
Jika ada database VA / QRIS maka tambahkan::
va_db_url = postgresql://report:password@localhost:5432/va_bjb
Kemudian di file ``/etc/cron.d/payment-report`` tambahkan::
*/5 * * * * sugiana cd /home/sugiana/payment-report && ../env/bin/pbb_report pbb.ini
*/5 * * * * sugiana cd /home/sugiana && env/bin/pbb_report pbb-report.ini
Lalu pantau log-nya. Jika sudah ada penampakan lihat hasilnya di tabel ``pbb_report``.
[main]
models = opensipkd.pad.models.default
service = opensipkd.pad.services.default
db_url = postgresql://user:pass@localhost/db
#va_db_url = postgresql://user:pass@localhost/db
report_db_url = postgresql://user:pass@localhost/db
......
......@@ -6,10 +6,17 @@ from sqlalchemy import (
String,
Date,
ForeignKey,
UniqueConstraint,
func,
)
from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy.exc import ProgrammingError
from opensipkd.string import FixLength
from opensipkd.waktu import dmyhms
from opensipkd.bphtb.models.customer import CustomerMixin
from opensipkd.bphtb.models.perolehan import PerolehanMixin
from opensipkd.bphtb.models.invoice import InvoiceMixin
from opensipkd.bphtb.models.payment import PaymentMixin
from opensipkd.bphtb.models.default import (
Payment,
Invoice,
......@@ -36,6 +43,34 @@ from .common import (
)
class AlternativeCustomer(CustomerMixin, Base):
@declared_attr
def __table_args__(self):
return dict(schema='public')
class AlternativePerolehan(PerolehanMixin, Base):
@declared_attr
def __table_args__(self):
return dict(schema='public')
class AlternativeInvoice(InvoiceMixin, Base):
@declared_attr
def __table_args__(self):
return (
UniqueConstraint('tahun', 'kode', 'no_sspd'),
dict(schema='public'))
class AlternativePayment(PaymentMixin, Base):
@declared_attr
def __table_args__(self):
return (
UniqueConstraint('tanggal', 'jam', 'seq', 'transno'),
dict(schema='public'))
class IsoPayment(Base):
__tablename__ = 'bphtb_payment'
__table_args__ = dict(schema='bphtb')
......@@ -63,9 +98,28 @@ class App(BaseApp):
super().__init__(argv)
if not self.pid:
return
self.base_q_func = self.prod_session.query(func.count())
self.base_q_inv = self.prod_session.query(Invoice)
self.base_q_cust = self.prod_session.query(Customer)
self.base_q_perolehan = self.prod_session.query(Perolehan)
try:
self.base_q_inv.first()
self.Customer = Customer
self.Perolehan = Perolehan
self.Invoice = Invoice
self.Payment = Payment
self.base_q_cust = self.prod_session.query(self.Customer)
self.base_q_perolehan = self.prod_session.query(self.Perolehan)
self.base_q_pay = self.prod_session.query(self.Payment)
except ProgrammingError:
self.prod_session.rollback()
self.Customer = AlternativeCustomer
self.Perolehan = AlternativePerolehan
self.Invoice = AlternativeInvoice
self.Payment = AlternativePayment
self.base_q_inv = self.prod_session.query(AlternativeInvoice)
self.base_q_cust = self.prod_session.query(AlternativeCustomer)
self.base_q_perolehan = self.prod_session.query(
AlternativePerolehan)
self.base_q_pay = self.prod_session.query(AlternativePayment)
def get_last_time(self): # Override
s_tgl = self.last_pay.tanggal.strftime('%d-%m-%Y')
......@@ -74,19 +128,17 @@ class App(BaseApp):
def get_filter_query(self, q):
return q.filter(
Payment.tanggal >= self.tgl_awal.date(),
Payment.jam >= self.tgl_awal.time(),
Payment.tanggal < self.tgl_akhir + one_day)
self.Payment.tanggal >= self.tgl_awal.date(),
self.Payment.jam >= self.tgl_awal.time(),
self.Payment.tanggal < self.tgl_akhir + one_day)
def get_count(self) -> int: # Override
q = self.prod_session.query(func.count())
q = self.get_filter_query(q)
q = self.get_filter_query(self.base_q_func)
return q.scalar()
def get_payment_query(self): # Override
q = self.prod_session.query(Payment)
q = self.get_filter_query(q)
return q.order_by(Payment.tanggal, Payment.jam)
q = self.get_filter_query(self.base_q_pay)
return q.order_by(self.Payment.tanggal, self.Payment.jam)
def get_iso_v1(self, pay):
q = self.prod_session.query(IsoPayment).filter_by(id=pay.id)
......@@ -95,7 +147,8 @@ class App(BaseApp):
return
iso = get_iso(row.iso_request, Doc, self.option.debug)
info = get_channel_info_by_iso(iso)
return info['bit_018'], info['channel'], iso.get_stan(), iso.get_ntb()
return info.get('bit_018', '0000'), info['channel'], iso.get_stan(), \
iso.get_ntb()
def get_iso_v2(self):
q = self.prod_session.query(Log).filter_by(
......@@ -122,6 +175,9 @@ class App(BaseApp):
return q.first()
def create_data(self, pay): # Override
if not pay.sspd_id:
msg = 'Field bphtb_bank.sspd_id NULL'
raise InvalidSource(msg)
inv = self.get_invoice(pay)
if not inv:
msg = f'Field bphtb_bank.sspd_id {pay.sspd_id} tidak ada di '\
......
nama,nilai,keterangan
pad payment last date,1-1-2000 00:00:00,pad.pad_sspd.sspdtgl terakhir yang diproses
pad reversal last date,1-1-2000 00:00:00,pad_reversal.tgl terakhir yang diproses
pad json payment last id,0,pad_payment.id terakhir yang diproses
pad json reversal last date,1-1-2000 00:00:00,pad_reversal.tgl terakhir yang diproses
webr payment last date,1-1-2000 00:00:00,webr.ar_payment.created terakhir yang diproses
bphtb payment last date,01-01-2000 00:00:00,bphtb.bphtb_bank.tanggal terakhir yang diproses
pbb payment last date,1-1-2000,pembayaran_sppt.tgl_rekam_byr_sppt terakhir yang diproses
......@@ -26,6 +26,7 @@ from .common import (
BaseApp,
init_db as base_init_db,
one_day,
BANK_NAMES,
)
......@@ -88,6 +89,11 @@ class App(BaseApp):
row = q.first()
if not row:
return
if row.iso_request[0] == '{':
s = row.iso_request.replace('datetime.datetime', 'datetime')
d = eval(s)
channel = BANK_NAMES[str(row.bank_id)]
return '0000', channel, None, None, row.bank_id
Doc = BankHandlers[row.bank_id]
iso = get_iso(row.iso_request, Doc, self.option.debug)
info = get_channel_info_by_iso(iso)
......@@ -102,8 +108,11 @@ class App(BaseApp):
return
channel_id = row.bit_018.strip()
channel_nama = get_channel_name_by_row(row)
return channel_id, channel_nama, row.bit_011, \
row.bit_048.strip(), int(row.bit_032)
bank_id = row.bit_032
if bank_id:
bank_id = int(bank_id)
return channel_id, channel_nama, row.bit_011, row.bit_048.strip(), \
bank_id
def create_data(self, pay): # Override
Invoice = self.models.Invoice
......@@ -112,9 +121,10 @@ class App(BaseApp):
invoice_id = FixLength(self.service.INVOICE_ID)
invoice_id['Tahun'] = inv.tahun
invoice_id['SptNo'] = inv.sptno
prefix = getattr(self.service, 'PREFIX')
if prefix:
invoice_id['Prefix'] = prefix
try:
invoice_id['Prefix'] = getattr(self.service, 'PREFIX')
except AttributeError:
pass
self.invoice_id = invoice_id.get_raw()
source = self.get_iso_v2()
if source:
......@@ -132,7 +142,7 @@ class App(BaseApp):
id=pay.id, stan=stan, ntb=ntb, tgl=pay.sspdtgl.date(),
jam=pay.sspdtgl.time(), nomor_bayar=invoice_id.get_raw(),
jenis_pajak=usaha.usahanm.strip(), masa_pajak=pajak.masapajak,
npwpd=cust.npwpd, nama_wp=cust.customernm,
npwpd=cust.npwpd, nama_wp=cust.customernm.strip(),
pokok=pay.jml_bayar-pay.denda, denda=pay.denda,
jml_bayar=pay.jml_bayar, channel_id=channel_id,
channel_name=channel_name, bank_id=bank_id)
......
import sys
import datetime
from datetime import timedelta
import transaction
from opensipkd.waktu import (
dmyhms,
date_from_str,
)
from opensipkd.string import FixLength
from opensipkd.pad.models.default import (
IsoPayment,
IsoReversal,
)
from opensipkd.pad.services.default import INVOICE_ID
from iso8583_web.models.meta import Base as BaseConf
from opensipkd.iso8583.bjb.pad.doc import Doc as BjbDoc
from opensipkd.iso8583.multi.doc import Doc as MultiDoc
from ..models import (
Base,
Pad,
)
from .common import (
BaseApp,
init_db as base_init_db,
BANK_NAMES,
)
ERR_NOT_FOUND = 'Tgl {tgl_bayar} pad.pad_sspd.spt_id {invoice_id} tidak ada'
def get_filter(q):
return q.filter(IsoPayment.iso_request.like('{%'))
class App(BaseApp):
report_orm = Pad
def __init__(self, argv):
super().__init__(argv)
if not self.pid:
return
Usaha = self.models.Usaha
Pajak = self.models.Pajak
Customer = self.models.Customer
CustomerUsaha = self.models.CustomerUsaha
Invoice = self.models.Invoice
Payment = self.models.Payment
self.base_q_pay = self.prod_session.query(Payment)
self.base_q_inv = self.prod_session.query(
Invoice, Pajak, Customer, Usaha)
self.base_q_inv = self.base_q_inv.filter(
Invoice.pajak_id == Pajak.id,
Invoice.customer_usaha_id == CustomerUsaha.id,
CustomerUsaha.customer_id == Customer.id,
Usaha.id == Pajak.usaha_id,)
self.base_q_iso = self.prod_session.query(IsoPayment)
def get_pay(self, row):
tgl_bayar = row.tgl.date()
Payment = self.models.Payment
q_pay = self.base_q_pay.filter_by(spt_id=row.invoice_id).filter(
Payment.create_date >= tgl_bayar,
Payment.create_date < tgl_bayar + timedelta(1))
q_pay = q_pay.order_by(Payment.id.desc())
return q_pay.first()
def __get_query_iso(self, last_id):
q_iso = self.base_q_iso.filter(IsoPayment.id > last_id)
q_iso = get_filter(q_iso)
return q_iso.order_by(IsoPayment.id)
def __create_data(self, row, pay, iso, d, tgl_bayar):
Invoice = self.models.Invoice
q_inv = self.base_q_inv.filter(Invoice.id == pay.spt_id)
inv, pajak, cust, usaha = q_inv.first()
return dict(
stan=d['stan'], ntb=d['ntb'], tgl=tgl_bayar,
jam=row.tgl.time(), sspd_id=pay.id,
nomor_bayar=d['nomor_bayar'],
jenis_pajak=usaha.usahanm.strip(),
masa_pajak=pajak.masapajak, npwpd=cust.npwpd,
nama_wp=cust.customernm, pokok=pay.jml_bayar-pay.denda,
denda=pay.denda, jml_bayar=pay.jml_bayar,
channel_id=row.channel_id,
channel_name=d['channel'], bank_id=row.bank_id)
def __log_progress(self, s_tgl, d):
self.log.info(f'Tgl bayar {s_tgl}, {d}')
def get_keys(self, row):
Invoice = self.models.Invoice
q = self.prod_session.query(Invoice).filter_by(id=row.invoice_id)
invoice = q.first()
inv_id = FixLength(INVOICE_ID)
inv_id['Tahun'] = str(invoice.tahun)
inv_id['SptNo'] = str(invoice.sptno)
stan = row.transmission.strftime('%H%M%S')
return dict(
stan=stan,
nomor_bayar=inv_id.get_raw(),
ntb=row.ntb,
channel=BANK_NAMES[str(row.bank_id)])
def __run_payment(self):
last = self.get_last_id('pad json payment last id')
q_iso = self.__get_query_iso(last.as_int())
found = False
for row in q_iso.order_by(IsoPayment.id).limit(1000):
iso = eval(row.iso_request)
d = self.get_keys(row)
if self.get_report(d['stan'], d['ntb']):
continue
pay = self.get_pay(row)
tgl_bayar = row.tgl.date()
if not pay:
msg = ERR_NOT_FOUND.format(
tgl_bayar=tgl_bayar, invoice_id=row.invoice_id)
self.log.error(msg)
continue
s_tgl = dmyhms(row.tgl)
data = self.__create_data(row, pay, iso, d, tgl_bayar)
self.__log_progress(s_tgl, data)
rpt = Pad(**data)
last.nilai = str(row.id)
with transaction.manager:
self.rpt_session.add(rpt)
self.rpt_session.add(last)
found = True
return found
def __update_from_id(self):
q_iso = self.__get_query_iso(self.last_id)
found = False
for row in q_iso.order_by(IsoPayment.id).limit(1000):
iso = eval(row.iso_request)
d = self.get_keys(row)
print(d)
tgl_bayar = row.tgl.date()
pay = self.get_pay(row)
rpt = self.get_report(d['stan'], d['ntb'])
if not rpt:
if not pay:
msg = ERR_NOT_FOUND.format(
tgl_bayar=tgl_bayar, invoice_id=row.invoice_id)
self.log.error(msg)
continue
rpt = Pad()
s_tgl = dmyhms(row.tgl)
data = self.__create_data(row, pay, iso, d, tgl_bayar)
self.__log_progress(s_tgl, data)
rpt.from_dict(data)
with transaction.manager:
self.rpt_session.add(rpt)
found = True
self.last_id = row.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(IsoPayment).filter(
IsoPayment.tgl >= tgl).order_by(
IsoPayment.id)
q = get_filter(q)
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 get_iso_reversal_orm(self): # Override
return IsoReversal
def get_doc_for_reversal(self, row): # Override
q = self.prod_session.query(IsoPayment).filter_by(id=row.id)
iso_pay = q.first()
return BankHandlers[iso_pay.bank_id]
def run_reversal(self): # Override
last = self.get_last_id('pad json reversal last date')
q = self.prod_session.query(IsoReversal).filter(
IsoReversal.iso_request.like('{%'),
IsoReversal.tgl > last.as_datetime())
for row in q.order_by(IsoReversal.tgl):
print(f'DEBUG reversal {row.tgl}')
def main(argv=sys.argv[1:]):
app = App(argv)
if app.pid:
app.run()
def init_db(argv=sys.argv[1:]):
base_init_db(Base.metadata, BaseConf.metadata, argv)
......@@ -4,8 +4,14 @@ from datetime import (
date,
timedelta,
)
from sqlalchemy import (
Column,
Integer,
String,
UniqueConstraint,
func,
)
from ISO8583.ISO8583 import BitNotSet
from sqlalchemy import func
import transaction
from sismiop.services.base import get_id
from opensipkd.string import (
......@@ -29,6 +35,7 @@ from .common import (
get_iso,
get_channel_info_by_iso,
get_channel_name_by_row,
get_channel_name_by_dict,
BaseApp,
one_day,
VaInvoice,
......@@ -37,6 +44,40 @@ from .common import (
)
def to_date(dt):
if isinstance(dt, datetime):
return dt.date()
return dt
class JsonLog(Base):
__tablename__ = 'pbb_payment'
id = Column(Integer, primary_key=True)
propinsi = Column(String(2), nullable=False)
kabupaten = Column(String(2), nullable=False)
kecamatan = Column(String(3), nullable=False)
kelurahan = Column(String(3), nullable=False)
blok = Column(String(3), nullable=False)
urut = Column(String(4), nullable=False)
jenis = Column(String(1), nullable=False)
tahun = Column(Integer, nullable=False)
ke = Column(Integer, nullable=False)
kd_kanwil_bank = Column(String(2), nullable=False)
kd_kppbb_bank = Column(String(2), nullable=False)
kd_bank_tunggal = Column(String(2), nullable=False)
kd_bank_persepsi = Column(String(2), nullable=False)
kd_tp = Column(String(2), nullable=False)
channel = Column(String(4))
ntb = Column(String(64))
ntp = Column(String(64))
bank = Column(Integer)
iso_request = Column(String(2048), nullable=False)
__table_args__ = (
UniqueConstraint('propinsi', 'kabupaten', 'kecamatan', 'kelurahan',
'blok', 'urut', 'jenis', 'tahun', 'ke'),
dict(schema='public'))
class App(BaseApp):
conf_name = 'pbb payment last date'
report_orm = Pbb
......@@ -49,7 +90,6 @@ class App(BaseApp):
d = Doc()
self.iso_inquiry_orm = d.iso_inquiry_model
self.iso_payment_orm = d.iso_payment_model
self.iso_reversal_orm = d.iso_reversal_model
self.base_q_iso = self.prod_session.query(
self.iso_payment_orm, self.iso_inquiry_orm).filter(
self.iso_payment_orm.inquiry_id == self.iso_inquiry_orm.id)
......@@ -65,9 +105,12 @@ class App(BaseApp):
self.h2h_session = self.prod_session
self.base_q_log = self.h2h_session.query(Log).filter_by(
mti='0210', bit_003=PAYMENT_CODE, bit_039='00')
def get_iso_reversal_orm(self): # Override
return self.iso_reversal_orm
if 'json_db_url' in self.conf:
factory = self.get_factory('json_db_url')
self.json_session = factory()
self.base_q_json = self.json_session.query(JsonLog)
else:
self.json_session = None
def get_sppt(self, psppt):
q = self.base_q_sppt.filter_by(
......@@ -125,7 +168,11 @@ class App(BaseApp):
user_id = iso.getBit(107)
except BitNotSet:
user_id = None
return iso.get_channel().strip(), info['channel'], iso.get_stan(), \
try:
channel_id = iso.get_channel().strip()
except BitNotSet:
channel_id = '0000'
return channel_id, info['channel'], iso.get_stan(), \
iso.get_ntb(), str(iso.get_bank_id()), user_id, row_inq.tgl
def get_iso_v2(self):
......@@ -139,12 +186,28 @@ class App(BaseApp):
return channel_id, channel_nama, row.bit_011, \
row.bit_048.strip(), row.bit_032, row.bit_107
def create_data(self, psppt): # Override
self.invoice_id = get_id(psppt)
sppt = self.get_sppt(psppt)
if not sppt:
msg = f'Invoice ID {self.invoice_id} tidak ada di tabel sppt'
raise InvalidSource(msg)
def get_json(self, psppt):
if not self.json_session:
return
q = self.base_q_json.filter_by(
propinsi=psppt.kd_propinsi,
kabupaten=psppt.kd_dati2,
kecamatan=psppt.kd_kecamatan,
kelurahan=psppt.kd_kelurahan,
blok=psppt.kd_blok,
urut=psppt.no_urut,
jenis=psppt.kd_jns_op,
tahun=psppt.thn_pajak_sppt,
ke=psppt.pembayaran_sppt_ke)
row = q.first()
if not row:
return
d = eval(row.iso_request)
kode = d['bit_032']
nama = get_channel_name_by_dict(d)
return kode, nama, d['bit_011'], row.ntb, kode
def get_source(self, psppt):
source = self.get_iso_v2()
tgl_inquiry = user_id = stan = ntb = bank_id = None
if source:
......@@ -155,27 +218,42 @@ class App(BaseApp):
channel_kode, channel_nama, stan, ntb, bank_id, user_id, \
tgl_inquiry = source
else:
channel_kode = '0000'
if psppt.nip_rekam_byr_sppt.strip() == self.nip_pospbb:
channel_nama = 'POSPBB'
source = self.get_json(psppt)
if source:
channel_kode, channel_nama, stan, ntb, bank_id = source
else:
tgl = psppt.tgl_rekam_byr_sppt.date()
channel_nama = self.get_va_channel(tgl) or 'MANUAL'
channel_kode = '0000'
if psppt.nip_rekam_byr_sppt.strip() == self.nip_pospbb:
channel_nama = 'POSPBB'
else:
tgl = psppt.tgl_rekam_byr_sppt.date()
channel_nama = self.get_va_channel(tgl) or 'MANUAL'
return channel_kode, channel_nama, stan, ntb, bank_id, user_id, \
tgl_inquiry
def create_data(self, psppt): # Override
self.invoice_id = get_id(psppt)
sppt = self.get_sppt(psppt)
if not sppt:
msg = f'Invoice ID {self.invoice_id} tidak ada di tabel sppt'
raise InvalidSource(msg)
channel_kode, channel_nama, stan, ntb, bank_id, user_id, \
tgl_inquiry = self.get_source(psppt)
discount = hasattr(psppt, 'discount') and psppt.discount or None
tgl = to_date(psppt.tgl_pembayaran_sppt)
return dict(
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,
stan=stan, ntb=ntb, jml_sppt_yg_dibayar=psppt.jml_sppt_yg_dibayar,
pembayaran_sppt_ke=psppt.pembayaran_sppt_ke, stan=stan, ntb=ntb,
jml_sppt_yg_dibayar=psppt.jml_sppt_yg_dibayar,
denda_sppt=psppt.denda_sppt, discount=discount,
tgl_pembayaran_sppt=psppt.tgl_pembayaran_sppt.date(),
tgl_pembayaran_sppt=tgl, tgl_inquiry=tgl_inquiry,
tgl_rekam_byr_sppt=psppt.tgl_rekam_byr_sppt,
nm_wp_sppt=sppt.nm_wp_sppt, channel_kode=channel_kode,
channel_nama=channel_nama, bank_id=bank_id, user_id=user_id,
pbb_yg_harus_dibayar_sppt=sppt.pbb_yg_harus_dibayar_sppt,
tgl_inquiry=tgl_inquiry)
pbb_yg_harus_dibayar_sppt=sppt.pbb_yg_harus_dibayar_sppt)
def get_report(self, psppt): # Override
q = self.rpt_session.query(Pbb).filter_by(
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!