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
---------------
- Tambah PBB Ciamis
......
......@@ -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
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):
class Conf(BaseConf):
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):
......@@ -290,13 +293,13 @@ class BaseApp:
def __init__(self, argv):
self.option = self.get_option(argv)
cp = ConfigParser()
cp.read(self.option.conf)
self.conf = cp['main']
self.conf_all = ConfigParser()
self.conf_all.read(self.option.conf)
self.conf = self.conf_all['main']
self.pid = make_pid_file(self.conf['pid_file'])
if not self.pid:
return
self.handler = None
self.prod_session = self.handler = self.odbc_conn = None
self.log = create_log(self.conf['log_file'])
if 'models' in self.conf:
self.models = get_module_object(self.conf['models'])
......@@ -308,8 +311,13 @@ class BaseApp:
pass
module_conf = dict(self.conf)
if 'db_url' in self.conf:
factory = self.get_factory('db_url')
self.prod_session = factory()
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')
self.prod_session = factory()
if 'h2h_db_url' in self.conf:
factory = self.get_factory('h2h_db_url')
self.h2h_session = factory()
......
nama,nilai,keterangan
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
pbb log table last date,1-1-2000 00:00:00,Field tanggal terakhir yang diproses
import sys
import re
from argparse import ArgumentParser
from time import time
from ISO8583.ISOErrors import BitNotSet
from sqlalchemy import func
from sqlalchemy.ext.declarative import declarative_base
from zope.sqlalchemy import register
from opensipkd.waktu import create_datetime
from opensipkd.string import FixLength
......@@ -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():
pars = ArgumentParser()
pars.add_argument('conf')
......
......@@ -106,7 +106,7 @@ class App(BaseApp):
if not self.pid:
return
self.set_other_db()
if not self.h2h_session:
if self.prod_session:
d = Doc()
self.iso_inquiry_orm = d.iso_inquiry_model
try:
......@@ -132,7 +132,7 @@ class App(BaseApp):
factory = self.get_factory('h2h_db_url')
self.h2h_session = factory()
self.base_q_log = self.get_base_q_log()
else:
elif self.prod_session:
try:
self.prod_session.query(Log).first()
self.h2h_session = self.prod_session
......
......@@ -52,7 +52,8 @@ def time_str(v):
def datetime_str(v):
s_date = date_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):
......
[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!