Commit b197bc90 by Owo Sugiana

nip_pospbb optional

1 parent 9a543323
2.0 2022-07-30 2.0 2022-08-02
-------------- --------------
- Perbedaan utama dari versi 0.x adalah kini berangkat dari tabel aslinya dan - Perbedaan utama dari versi 0.x adalah kini berangkat dari tabel aslinya dan
bukan dari tabel ISO8583 karena sudah memperhatikan channel MANUAL (input bukan dari tabel ISO8583 karena sudah memperhatikan channel MANUAL (input
...@@ -6,3 +6,4 @@ ...@@ -6,3 +6,4 @@
- Memahami channel VA dan QRIS - Memahami channel VA dan QRIS
- Menyimpan log file dari Cartenz ke tabel log_file - Menyimpan log file dari Cartenz ke tabel log_file
- Menerjemahkan log_file menjadi log_iso - Menerjemahkan log_file menjadi log_iso
- nip_pospbb optional
...@@ -3,5 +3,5 @@ models = opensipkd.iso8583.bjb.pbb.models ...@@ -3,5 +3,5 @@ models = opensipkd.iso8583.bjb.pbb.models
service = opensipkd.iso8583.bjb.pbb.doc service = opensipkd.iso8583.bjb.pbb.doc
db_url = postgresql://cartenz:pass@localhost/h2h_pbb db_url = postgresql://cartenz:pass@localhost/h2h_pbb
report_db_url = postgresql://pcpd:pass@localhost/pcpd report_db_url = postgresql://pcpd:pass@localhost/pcpd
pid_file = /home/sugiana/tmp/pbb-log.pid pid_file = /home/sugiana/tmp/pbb-iso.pid
log_file = /home/sugiana/log/pbb-log.log log_file = /home/sugiana/log/pbb-iso.log
...@@ -177,7 +177,7 @@ class Pbb(Base, Common): ...@@ -177,7 +177,7 @@ class Pbb(Base, Common):
# Bit 7 / Transmission DateTime # Bit 7 / Transmission DateTime
tgl_rekam_byr_sppt = Column(DateTime(timezone=True), nullable=False) tgl_rekam_byr_sppt = Column(DateTime(timezone=True), nullable=False)
# Bit 62 / Invoice Profile # Bit 62 / Invoice Profile
nm_wp_sppt = Column(String(30), nullable=False) nm_wp_sppt = Column(String(50), nullable=False)
# Bit 18 # Bit 18
channel_kode = Column(String(4), nullable=False) channel_kode = Column(String(4), nullable=False)
# Bit 41 / 42 / 43 # Bit 41 / 42 / 43
...@@ -189,7 +189,7 @@ class Pbb(Base, Common): ...@@ -189,7 +189,7 @@ class Pbb(Base, Common):
tgl_batal = Column(DateTime(timezone=True)) tgl_batal = Column(DateTime(timezone=True))
__table_args__ = dict( __table_args__ = dict(
UniqueConstraint( UniqueConstraint(
'kd_propinsi', 'kd_dati2', 'kd_kecamatan', 'kd_kelurahan', kd_propinsi, kd_dati2, kd_kecamatan, kd_kelurahan,
'kd_blok', 'no_urut', 'kd_jns_op', 'thn_pajak_sppt'), kd_blok, no_urut, kd_jns_op, thn_pajak_sppt,
pembayaran_sppt_ke),
) )
...@@ -51,8 +51,10 @@ class App(BaseApp): ...@@ -51,8 +51,10 @@ class App(BaseApp):
self.report_orm = Log self.report_orm = Log
if self.conf['models'].find('bphtb') > -1: if self.conf['models'].find('bphtb') > -1:
self.conf_name = 'bphtb log file last id' self.conf_name = 'bphtb log file last id'
self.pajak = 'bphtb'
else: else:
self.conf_name = 'pbb log file last id' self.conf_name = 'pbb log file last id'
self.pajak = 'pbb'
register(self.prod_session) register(self.prod_session)
def get_option(self, argv): # Override def get_option(self, argv): # Override
...@@ -88,13 +90,16 @@ class App(BaseApp): ...@@ -88,13 +90,16 @@ class App(BaseApp):
int(year), int(month), int(day), int(hour), int(year), int(month), int(day), int(hour),
int(minute), int(sec), int(msec)*1000) int(minute), int(sec), int(msec)*1000)
iso = self.service.Doc() iso = self.service.Doc()
iso.setIsoContent(raw[4:].encode('utf-8')) try:
iso.setIsoContent(raw[4:].encode('utf-8'))
except ValueError as e:
raise InvalidSource('ID {log_file.id} tidak dipahami: {str(e)}')
try: try:
if iso.getBit(3) != self.service.PAYMENT_CODE: if iso.getBit(3) != self.service.PAYMENT_CODE:
raise InvalidSource(f'ID {log_file.id} bukan payment') raise InvalidSource(f'ID {log_file.id} bukan payment')
except BitNotSet: except BitNotSet:
raise InvalidSource(f'ID {log_file.id} bit 3 tidak ada') raise InvalidSource(f'ID {log_file.id} bit 3 tidak ada')
d = dict(mti=iso.getMTI(), created=waktu) d = dict(id=log_file.id, mti=iso.getMTI(), created=waktu)
for bit in iso.get_bit_definition(): for bit in iso.get_bit_definition():
try: try:
value = iso.getBit(bit) value = iso.getBit(bit)
...@@ -102,9 +107,20 @@ class App(BaseApp): ...@@ -102,9 +107,20 @@ class App(BaseApp):
continue continue
field = 'bit_{}'.format(str(bit).zfill(3)) field = 'bit_{}'.format(str(bit).zfill(3))
d[field] = value d[field] = value
profile = FixLength(self.service.INVOICE_PROFILE) if self.pajak == 'bphtb':
profile.set_raw(iso.getBit(62)) try:
d['bit_062_data'] = profile.to_dict() profile = FixLength(self.service.INVOICE_PROFILE)
profile.set_raw(iso.getBit(47))
d['bit_047_data'] = profile.to_dict()
profile = FixLength(self.service.INVOICE_PROFILE2)
profile.set_raw(iso.getBit(48))
d['bit_048_data'] = profile.to_dict()
except BitNotSet:
pass
else:
profile = FixLength(self.service.INVOICE_PROFILE)
profile.set_raw(iso.getBit(62))
d['bit_062_data'] = profile.to_dict()
return d return d
def get_last_time(self): # Override def get_last_time(self): # Override
......
...@@ -21,10 +21,6 @@ def main(argv=sys.argv[1:]): ...@@ -21,10 +21,6 @@ def main(argv=sys.argv[1:]):
append_csv(Conf, 'conf_log2iso.csv', ['nama']) append_csv(Conf, 'conf_log2iso.csv', ['nama'])
db_session.commit() db_session.commit()
models = get_module_object(conf.get('main', 'models')) models = get_module_object(conf.get('main', 'models'))
class Log(Base, models.LogMixin):
pass
db_url = conf.get('main', 'db_url') db_url = conf.get('main', 'db_url')
engine = create_engine(db_url, echo=True) engine = create_engine(db_url, echo=True)
Base.metadata.create_all(engine) Base.metadata.create_all(engine)
...@@ -118,16 +118,16 @@ class App(BaseApp): ...@@ -118,16 +118,16 @@ class App(BaseApp):
self.Psppt = self.models.PembayaranSppt self.Psppt = self.models.PembayaranSppt
self.Sppt = self.models.Sppt self.Sppt = self.models.Sppt
self.base_q_sppt = self.prod_session.query(self.Sppt) self.base_q_sppt = self.prod_session.query(self.Sppt)
self.nip_pospbb = self.conf['nip_pospbb'] self.nip_pospbb = self.conf.get('nip_pospbb')
if 'h2h_db_url' in self.conf: if 'h2h_db_url' in self.conf:
factory = self.get_factory('h2h_db_url') factory = self.get_factory('h2h_db_url')
self.h2h_session = factory() self.h2h_session = factory()
self.base_q_log = self.get_base_q_log()
else: else:
try: try:
self.prod_session.query(Log).first() self.prod_session.query(Log).first()
self.h2h_session = self.prod_session self.h2h_session = self.prod_session
self.base_q_log = self.h2h_session.query(Log).filter_by( self.base_q_log = self.get_base_q_log()
mti='0210', bit_003=PAYMENT_CODE, bit_039='00')
except DatabaseError: except DatabaseError:
self.h2h_session = None self.h2h_session = None
if 'json_db_url' in self.conf: if 'json_db_url' in self.conf:
...@@ -137,6 +137,10 @@ class App(BaseApp): ...@@ -137,6 +137,10 @@ class App(BaseApp):
else: else:
self.json_session = None self.json_session = None
def get_base_q_log(self):
return self.h2h_session.query(Log).filter_by(
mti='0210', bit_003=PAYMENT_CODE, bit_039='00')
def get_sppt(self, psppt): def get_sppt(self, psppt):
q = self.base_q_sppt.filter_by( q = self.base_q_sppt.filter_by(
kd_propinsi=psppt.kd_propinsi, kd_propinsi=psppt.kd_propinsi,
...@@ -250,7 +254,9 @@ class App(BaseApp): ...@@ -250,7 +254,9 @@ class App(BaseApp):
channel_kode, channel_nama, stan, ntb, bank_id = source channel_kode, channel_nama, stan, ntb, bank_id = source
else: else:
channel_kode = '0000' channel_kode = '0000'
if psppt.nip_rekam_byr_sppt.strip() == self.nip_pospbb: if self.nip_pospbb and \
psppt.nip_rekam_byr_sppt.strip() == \
self.nip_pospbb:
channel_nama = 'POSPBB' channel_nama = 'POSPBB'
else: else:
tgl = psppt.tgl_rekam_byr_sppt.date() tgl = psppt.tgl_rekam_byr_sppt.date()
...@@ -266,6 +272,14 @@ class App(BaseApp): ...@@ -266,6 +272,14 @@ class App(BaseApp):
raise InvalidSource(msg) raise InvalidSource(msg)
channel_kode, channel_nama, stan, ntb, bank_id, user_id, \ channel_kode, channel_nama, stan, ntb, bank_id, user_id, \
tgl_inquiry = self.get_source(psppt) tgl_inquiry = self.get_source(psppt)
try:
bayar = psppt.jml_sppt_yg_dibayar
denda = psppt.denda_sppt
pokok = sppt.pbb_yg_harus_dibayar_sppt
except AttributeError:
bayar = psppt.jml_pbb_yg_dibayar
denda = psppt.jml_denda_sppt
pokok = sppt.pbb_yg_hrs_dibayar_sppt
discount = hasattr(psppt, 'discount') and psppt.discount or None discount = hasattr(psppt, 'discount') and psppt.discount or None
tgl = to_date(psppt.tgl_pembayaran_sppt) tgl = to_date(psppt.tgl_pembayaran_sppt)
if ntb: if ntb:
...@@ -276,13 +290,13 @@ class App(BaseApp): ...@@ -276,13 +290,13 @@ class App(BaseApp):
kd_blok=psppt.kd_blok, no_urut=psppt.no_urut, kd_blok=psppt.kd_blok, no_urut=psppt.no_urut,
kd_jns_op=psppt.kd_jns_op, thn_pajak_sppt=psppt.thn_pajak_sppt, 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, pembayaran_sppt_ke=psppt.pembayaran_sppt_ke, stan=stan, ntb=ntb,
jml_sppt_yg_dibayar=psppt.jml_sppt_yg_dibayar, jml_sppt_yg_dibayar=bayar, denda_sppt=denda or 0,
denda_sppt=psppt.denda_sppt or 0, discount=discount or 0, discount=discount or 0, tgl_pembayaran_sppt=tgl,
tgl_pembayaran_sppt=tgl, tgl_inquiry=tgl_inquiry, tgl_inquiry=tgl_inquiry,
tgl_rekam_byr_sppt=psppt.tgl_rekam_byr_sppt, tgl_rekam_byr_sppt=psppt.tgl_rekam_byr_sppt,
nm_wp_sppt=sppt.nm_wp_sppt.strip(), channel_kode=channel_kode, nm_wp_sppt=sppt.nm_wp_sppt.strip(), channel_kode=channel_kode,
channel_nama=channel_nama, bank_id=bank_id, user_id=user_id, channel_nama=channel_nama, bank_id=bank_id, user_id=user_id,
pbb_yg_harus_dibayar_sppt=sppt.pbb_yg_harus_dibayar_sppt) pbb_yg_harus_dibayar_sppt=pokok)
def get_report(self, psppt): # Override def get_report(self, psppt): # Override
q = self.rpt_session.query(Pbb).filter_by( 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!