Commit 8c663c07 by Owo Sugiana

Tambah PBB Kabupaten Tangerang

1 parent 1221c6fd
2.11 2023-03-13
---------------
- Tambah PBB Kabupaten Tangerang
2.10 2023-03-07 2.10 2023-03-07
--------------- ---------------
- Tambah PBB Ciamis - Tambah PBB Ciamis
......
...@@ -133,3 +133,18 @@ Kemudian di file ``/etc/cron.d/payment-report`` tambahkan:: ...@@ -133,3 +133,18 @@ Kemudian di file ``/etc/cron.d/payment-report`` tambahkan::
*/5 * * * * sugiana cd /home/sugiana && env/bin/pbb_report pbb-report.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``. Lalu pantau log-nya. Jika sudah ada penampakan lihat hasilnya di tabel ``pbb_report``.
Database Sybase
---------------
Bila sumber data berasal dari Sybase maka kita bisa gunakan driver FreeTDS::
$ sudo apt-get install freetds-dev freetds-bin unixodbc-dev tdsodbc
$ sudo dpkg-reconfigure tdsodbc
Nanti ada pertanyaan apakah FreeTDS akan dipasang sebagai driver ODBC. Jawab
Ya. Kemudian pasang modul Python-nya::
$ ~/env/bin/pip install -r sybase-requirements.txt
Selanjutnya lihat ``pbb-odbc.ini``.
from datetime import timedelta
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
from opensipkd.iso8583.bjb.pbb.structure import (
PAYMENT_CODE,
INVOICE_PROFILE,
)
from payment_report.scripts.tools import (
plain_values,
update,
)
from payment_report.scripts.common import (
get_channel_name,
row_limit,
)
def to_str(t):
s = dmyhms(t)
return f'{s}.{t.microsecond}'
class Handler:
def __init__(self, parent):
self.parent = parent
self.parent.conf_name = 'pbb log table last date'
def get_count(self): # dipanggil parent
cursor = self.parent.odbc_conn.cursor()
tgl_akhir = self.parent.tgl_akhir + timedelta(1)
cursor.execute(
"SELECT * FROM THOSTISO WHERE H3 = ? AND "
"HDATE BETWEEN ? AND ? ORDER BY HDATE",
(PAYMENT_CODE, self.parent.tgl_awal, tgl_akhir))
self.rows = []
fieldnames = []
for row in cursor.fetchall():
if not fieldnames:
fieldnames = [info[0] for info in row.cursor_description]
d = dict([(x, row[fieldnames.index(x)]) for x in fieldnames])
self.rows.append(d)
return len(self.rows)
def get_report(self, pay):
session = self.parent.get_session_for_save()
q = session.query(self.parent.report_orm).filter_by(
tgl_rekam_byr_sppt=pay['HDATE'])
return q.first()
def query_payment(self, d):
session = self.parent.get_session_for_save()
return session.query(self.parent.report_orm).filter_by(
kd_propinsi=d['kd_propinsi'], kd_dati2=d['kd_dati2'],
kd_kecamatan=d['kd_kecamatan'], kd_kelurahan=d['kd_kelurahan'],
kd_blok=d['kd_blok'], no_urut=d['no_urut'],
kd_jns_op=d['kd_jns_op'], thn_pajak_sppt=d['thn_pajak_sppt'],
pembayaran_sppt_ke=d['pembayaran_sppt_ke'])
def create_data_(self, pay):
channel_nama = get_channel_name(
pay['H18'], pay['H32'], pay['H41'], pay.get('H42', ''),
pay.get('H43', ''))
channel_kode = pay['H18'] or '0000'
profile = FixLength(INVOICE_PROFILE)
profile.set_raw(pay['H62'])
inv_id = FixLength(INVOICE_ID)
inv_id.set_raw(pay['H61'])
return dict(
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['H11'], ntb=pay['H48'],
jml_sppt_yg_dibayar=float(pay['H4']),
denda_sppt=float(profile['Denda'] or 0),
discount=float(profile['Discount'] or 0),
tgl_pembayaran_sppt=pay['HDATE'].date(),
tgl_rekam_byr_sppt=pay['HDATE'], nm_wp_sppt=profile['Nama'],
channel_kode=channel_kode, channel_nama=channel_nama,
bank_id=pay['H32'], user_id=pay['H107'],
pbb_yg_harus_dibayar_sppt=float(profile['Tagihan']))
def create_data(self, pay):
if pay['MTI'] == '0400':
source = dict(jml_sppt_yg_dibayar=0, denda_sppt=0, discount=0)
else:
source = self.create_data_(pay)
log_data = plain_values(source)
return source, log_data
def save(self, pay, rpt, q_old_payment):
session = self.parent.get_session_for_save()
with transaction.manager:
q_old_payment and q_old_payment.delete()
rpt and session.add(rpt)
if self.parent.last:
self.parent.last.nilai = to_str(pay['HDATE'])
session.add(self.parent.last)
def update_from_date(self): # Overwrite
no = 0
for pay in self.rows:
no += 1
if not (
(pay['MTI'] == '0210' and pay['H39'] == '00') or
pay['MTI'] == '0400'):
print(f'#{no} {pay["HDATE"]} bukan payment')
continue
source, log_data = self.create_data(pay)
rpt = self.get_report(pay)
q_old_payment = None
if rpt:
target = rpt.to_dict()
target_update, log_msg = update(source, target)
if target_update:
s = ', '.join(log_msg)
msg = f'UPDATE {log_data} change {s}'
rpt.from_dict(target_update)
else:
msg = f'ALREADY SAME {log_data}'
rpt = None
if self.parent.count == 1 and self.parent.last:
print(msg)
print('Log yang sama, abaikan.')
return
elif pay['MTI'] == '0210':
q = self.query_payment(source)
old_pay = q.first()
if old_pay and old_pay.tgl_rekam_byr_sppt < pay['HDATE']:
q_old_payment = q
msg = f'INSERT {log_data}'
rpt = self.parent.report_orm(**source)
invoice_id = pay['H61'].strip()
msg = f'Invoice ID {invoice_id} {msg}'
log_method = self.parent.log.info
e = self.parent.get_estimate(no)
log_method(f'#{no}/{self.parent.count} {msg}, estimate {e}')
self.save(pay, rpt, q_old_payment)
...@@ -234,7 +234,10 @@ def get_option(argv): ...@@ -234,7 +234,10 @@ def get_option(argv):
class Conf(BaseConf): class Conf(BaseConf):
def as_datetime(self): def as_datetime(self):
return datetime.strptime(self.nilai, '%d-%m-%Y %H:%M:%S') pola = '%d-%m-%Y %H:%M:%S'
if self.nilai.find('.') > -1:
pola += '.%f'
return datetime.strptime(self.nilai, pola)
def is_live(pid): def is_live(pid):
...@@ -290,13 +293,13 @@ class BaseApp: ...@@ -290,13 +293,13 @@ class BaseApp:
def __init__(self, argv): def __init__(self, argv):
self.option = self.get_option(argv) self.option = self.get_option(argv)
cp = ConfigParser() self.conf_all = ConfigParser()
cp.read(self.option.conf) self.conf_all.read(self.option.conf)
self.conf = cp['main'] self.conf = self.conf_all['main']
self.pid = make_pid_file(self.conf['pid_file']) self.pid = make_pid_file(self.conf['pid_file'])
if not self.pid: if not self.pid:
return return
self.handler = None self.prod_session = self.handler = self.odbc_conn = None
self.log = create_log(self.conf['log_file']) self.log = create_log(self.conf['log_file'])
if 'models' in self.conf: if 'models' in self.conf:
self.models = get_module_object(self.conf['models']) self.models = get_module_object(self.conf['models'])
...@@ -308,6 +311,11 @@ class BaseApp: ...@@ -308,6 +311,11 @@ class BaseApp:
pass pass
module_conf = dict(self.conf) module_conf = dict(self.conf)
if 'db_url' in self.conf: if 'db_url' in self.conf:
if self.conf['db_url'] == 'odbc':
import pyodbc
odbc_profile = dict(self.conf_all.items('odbc'))
self.odbc_conn = pyodbc.connect(**odbc_profile)
else:
factory = self.get_factory('db_url') factory = self.get_factory('db_url')
self.prod_session = factory() self.prod_session = factory()
if 'h2h_db_url' in self.conf: if 'h2h_db_url' in self.conf:
......
nama,nilai,keterangan nama,nilai,keterangan
pbb log file last id,0,Field log_file.id terakhir yang diproses pbb log file last id,0,Field log_file.id terakhir yang diproses
bphtb log file last id,0,Field log_file.id terakhir yang diproses bphtb log file last id,0,Field log_file.id terakhir yang diproses
pbb log table last date,1-1-2000 00:00:00,Field tanggal terakhir yang diproses
import sys import sys
import re
from argparse import ArgumentParser from argparse import ArgumentParser
from time import time from time import time
from ISO8583.ISOErrors import BitNotSet from ISO8583.ISOErrors import BitNotSet
from sqlalchemy import func from sqlalchemy import func
from sqlalchemy.ext.declarative import declarative_base
from zope.sqlalchemy import register from zope.sqlalchemy import register
from opensipkd.waktu import create_datetime from opensipkd.waktu import create_datetime
from opensipkd.string import FixLength from opensipkd.string import FixLength
...@@ -19,13 +17,6 @@ from .common import ( ...@@ -19,13 +17,6 @@ from .common import (
) )
PATTERN = r'^([\d]*)-([\d]*)-([\d]*) ([\d]*):([\d]*):([\d]*)\.([\d]*) '\
r'(.*) \[SENT RAW BUFFER\] : (.*)'
REGEX = re.compile(PATTERN)
Base = declarative_base()
def get_parser(): def get_parser():
pars = ArgumentParser() pars = ArgumentParser()
pars.add_argument('conf') pars.add_argument('conf')
......
...@@ -106,7 +106,7 @@ class App(BaseApp): ...@@ -106,7 +106,7 @@ class App(BaseApp):
if not self.pid: if not self.pid:
return return
self.set_other_db() self.set_other_db()
if not self.h2h_session: if self.prod_session:
d = Doc() d = Doc()
self.iso_inquiry_orm = d.iso_inquiry_model self.iso_inquiry_orm = d.iso_inquiry_model
try: try:
...@@ -132,7 +132,7 @@ class App(BaseApp): ...@@ -132,7 +132,7 @@ class App(BaseApp):
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() self.base_q_log = self.get_base_q_log()
else: elif self.prod_session:
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
......
...@@ -52,7 +52,8 @@ def time_str(v): ...@@ -52,7 +52,8 @@ def time_str(v):
def datetime_str(v): def datetime_str(v):
s_date = date_str(v) s_date = date_str(v)
s_time = time_str(v) s_time = time_str(v)
return f'{s_date} {s_time}' s_msec = v.microsecond and f'.{v.microsecond}' or ''
return f'{s_date} {s_time}{s_msec}'
def plain_value(v): def plain_value(v):
......
[main]
service = payment_report.pbb.tangkab
db_url = odbc
report_db_url = postgresql://user:pass@localhost/payment_report
pid_file = /home/sugiana/tmp/pbb-report.pid
log_file = /home/sugiana/tmp/pbb-report.log
[odbc]
driver = FreeTDS
server = 192.168.168.31
database = payswitch
port = 5000
uid = FIXME
pwd = FIXME
sqlalchemy-sybase < 2
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!