Commit 7b6bd3c4 by Owo Sugiana

Tambah Fortuna

1 parent d8f6ca61
2.13 2023-03-18
---------------
- Tambah Fortuna
2.12 2023-03-16
---------------
- Tambah BPHTB Kabupaten Ciamis
......
import sys
import os
import re
from argparse import ArgumentParser
from configparser import ConfigParser
from glob import glob
from hashlib import sha256
from time import sleep
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.exc import (
IntegrityError,
OperationalError,
)
from ..log_models import LogFile
from .tools import BacaFile
from .common import make_pid_file
RE_ISO = r'([0-9]*)/([0-9]*)/([0-9]*) ([0-9]*):([0-9]*):([0-9]*)\.([0-9]*) '\
r'\[BJB\] Send : (.*)'
RE_ISO = re.compile(RE_ISO)
def read_log(log_file, db_url):
def save_log(line):
line = line.rstrip()
found = RE_ISO.search(line)
if not found:
return
print([line])
line_id = sha256(line.encode('utf-8')).hexdigest()
while True:
row = LogFile(line_id=line_id, line=line)
try:
db_session.add(row)
db_session.flush()
db_session.commit()
return
except IntegrityError:
db_session.rollback()
return
except OperationalError as e:
db_session.rollback()
print(e)
print('Tunggu, mungkin sedang maintenance ...')
sleep(10)
engine = create_engine(db_url)
factory = sessionmaker(bind=engine)
db_session = factory()
with BacaFile(log_file) as f:
while True:
line = f.readline()
if not line:
break
try:
save_log(line.decode('utf-8'))
except UnicodeDecodeError:
continue
def main(argv=sys.argv[1:]):
pars = ArgumentParser()
pars.add_argument('conf')
pars.add_argument('--log-file')
option = pars.parse_args(argv)
conf = ConfigParser()
conf.read(option.conf)
make_pid_file(conf.get('main', 'pid_file'))
db_url = conf.get('main', 'db_url')
if option.log_file:
files = [option.log_file]
else:
dir_name = conf.get('main', 'log_dir')
pola = os.path.join(dir_name, 'FSwitch.BJB.*.log')
files = glob(pola)
for log_file in files:
print(log_file)
bak_file = log_file[:-3] + 'bak'
read_log(log_file, db_url)
os.rename(log_file, bak_file)
import sys
from argparse import ArgumentParser
from time import time
from ISO8583.ISOErrors import (
BitNotSet,
InvalidIso8583,
)
from sqlalchemy import func
from zope.sqlalchemy import register
from opensipkd.waktu import create_datetime
from opensipkd.string import FixLength
from ..models import Common
from ..log_models import LogFile
from .common import (
BaseApp,
my_registry,
append_csv,
create_session,
InvalidSource,
)
from .log2db_fortuna import RE_ISO
def get_parser():
pars = ArgumentParser()
pars.add_argument('conf')
pars.add_argument('--update-from-id', type=int)
pars.add_argument('--debug-sql', action='store_true')
return pars
def get_option(argv):
pars = get_parser()
return pars.parse_args(argv)
class App(BaseApp):
def __init__(self, argv):
super().__init__(argv)
if not self.pid:
return
class Log(self.models.Log, Common):
pass
self.report_orm = Log
if self.conf['models'].find('bphtb') > -1:
self.conf_name = 'bphtb log file last id'
self.pajak = 'bphtb'
else:
self.conf_name = 'pbb log file last id'
self.pajak = 'pbb'
register(self.prod_session)
def get_option(self, argv): # Override
return get_option(argv)
def get_session_for_save(self): # Override
return self.prod_session
def get_filter_query(self, q):
return q.filter(LogFile.id > self.last_id)
def get_count(self): # Override
q = self.prod_session.query(func.count())
q = self.get_filter_query(q)
return q.scalar()
def get_payment_query(self): # Override
q = self.prod_session.query(LogFile)
q = self.get_filter_query(q)
return q.order_by(LogFile.id)
def get_prefix_log(self): # Override
return f'ID {self.log_id}'
def create_data(self, log_file): # Override
self.log_id = log_file.id
found = RE_ISO.search(log_file.line)
day, month, year, hour, minute, second, milisecond, raw = \
found.groups()
waktu = create_datetime(
int(year), int(month), int(day), int(hour), int(minute),
int(second), int(int(milisecond)/1000))
print([raw])
iso = self.service.Doc()
try:
iso.setIsoContent(raw.encode('utf-8'))
except InvalidIso8583 as e:
raise InvalidSource(f'ID {log_file.id} tidak dipahami: {str(e)}')
except ValueError as e:
raise InvalidSource(f'ID {log_file.id} tidak dipahami: {str(e)}')
try:
if iso.getBit(3) != self.service.PAYMENT_CODE:
raise InvalidSource(f'ID {log_file.id} bukan payment')
except BitNotSet:
raise InvalidSource(f'ID {log_file.id} bit 3 tidak ada')
waktu = iso.get_transaction_time()
d = dict(
id=log_file.id, mti=iso.getMTI(), created=waktu,
bits=iso.get_values())
if self.pajak == 'bphtb':
try:
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['bits_data'] = {62: profile.to_dict()}
return d
def get_last_time(self): # Override
return str(self.last_pay.id)
def run_payment(self): # Override
self.last_pay = None
self.offset = 0
if self.option.update_from_id is None:
self.last = self.get_last_id(self.conf_name)
self.last_id = self.last.as_int()
else:
self.last = None
self.last_id = self.option.update_from_id - 1
self.count = self.get_count()
self.start_time = time()
while True:
found = self.update_from_date()
if not found:
break
if self.last_pay and self.last:
self.update_last()
def main(argv=sys.argv[1:]):
app = App(argv)
app.run()
......@@ -15,12 +15,14 @@ def main(argv=sys.argv[1:]):
conf_file = argv[0]
conf = ConfigParser()
conf.read(conf_file)
db_url = conf.get('main', 'report_db_url')
cf = dict(conf.items('main'))
db_url = cf['report_db_url']
my_registry['db_session'] = db_session = create_session(db_url, True)
Conf.metadata.create_all(db_session.bind)
append_csv(Conf, 'conf_log2iso.csv', ['nama'])
db_session.commit()
models = get_module_object(conf.get('main', 'models'))
if 'models' in cf:
models = get_module_object(cf['models'])
db_url = conf.get('main', 'db_url')
engine = create_engine(db_url, echo=True)
Base.metadata.create_all(engine)
......@@ -43,8 +43,10 @@ setup(
'log2iso_init_db = payment_report.scripts.log2iso_init:main',
'log2iso = payment_report.scripts.log2iso:main',
'log2iso_ciamis = payment_report.scripts.log2iso_ciamis:main',
'log2iso_fortuna = payment_report.scripts.log2iso_fortuna:main',
'log2db = payment_report.scripts.log2db:main',
'log2db_ciamis = payment_report.scripts.log2db_ciamis:main',
'log2db_fortuna = payment_report.scripts.log2db_fortuna:main',
],
}
)
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!