Commit 7a297605 by Solo Group

script test dan log db

1 parent 5fe6e6e8
[alembic]
script_location = ziggurat_foundations:migrations
sqlalchemy.url = {{db_url}}
[loggers]
keys = root,sqlalchemy,alembic
[handlers]
keys = console
[formatters]
keys = generic
[logger_root]
level = WARN
handlers = console
qualname =
[logger_sqlalchemy]
level = WARN
handlers =
qualname = sqlalchemy.engine
[logger_alembic]
level = INFO
handlers =
qualname = alembic
[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic
[formatter_generic]
format = %(levelname)-5.5s [%(name)s] %(message)s
datefmt = %H:%M:%S
# A generic, single database configuration.
[alembic]
# path to migration scripts
script_location = alembic
# template used to generate migration files
# file_template = %%(rev)s_%%(slug)s
# max length of characters to apply to the
# "slug" field
#truncate_slug_length = 40
# set to 'true' to run the environment during
# the 'revision' command, regardless of autogenerate
# revision_environment = false
# set to 'true' to allow .pyc and .pyo files without
# a source .py file to be detected as revisions in the
# versions/ directory
# sourceless = false
# version location specification; this defaults
# to alembic/versions. When using multiple version
# directories, initial revisions must be specified with --version-path
# version_locations = %(here)s/bar %(here)s/bat alembic/versions
# the output encoding used when revision files
# are written from script.py.mako
# output_encoding = utf-8
sqlalchemy.url = {{db_url}}
# Logging configuration
[loggers]
keys = root,sqlalchemy,alembic
[handlers]
keys = console
[formatters]
keys = generic
[logger_root]
level = WARN
handlers = console
qualname =
[logger_sqlalchemy]
level = WARN
handlers =
qualname = sqlalchemy.engine
[logger_alembic]
level = INFO
handlers =
qualname = alembic
[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic
[formatter_generic]
format = %(levelname)-5.5s [%(name)s] %(message)s
datefmt = %H:%M:%S
......@@ -36,4 +36,3 @@ def get_header(userid, password, time_stamp=None):
# signature = hmac.new(key=password, msg=value, digestmod=hashlib.sha256).digest()
return dict(userid=userid, signature=encoded_signature, key=time_stamp)
import json
# from opensipkd.iso8583.base.modules.network import models
import transaction
import re
import sys
import traceback
from opensipkd.string import FixLength
import requests
from opensipkd.iso8583.bjb.samsat.structure import (
......@@ -37,7 +39,7 @@ from opensipkd.string import FixLength
# todo: harusnya diimport daro opensipkd.tools.rpc
from ..api import get_header, get_jsonrpc
from ..models import SamsatPayment, SamsatReversal, Base, DBSession
if sys.version < '3':
from StringIO import StringIO
else:
......@@ -47,6 +49,17 @@ CODE_54 = ['05', '23']
CODE_55 = ['01', '02', '03', '04', '06', '09', '10', '11', '12', '15', '99',
'24', '22']
from datetime import date
class DateVar(FixLength):
def __init__(self):
FixLength.__init__(self, [
['year', 4, 'N'],
['month', 2, 'N'],
['day', 2, 'N'],
])
def get_value(self, year=None):
return date(self.get('year'), self.get('month'), self.get('day'))
def date2str(d):
return d and d.strftime('%Y%m%d') or None
......@@ -92,21 +105,22 @@ class Doc(Transaction):
return INVOICE_PROFILE
def is_allowed(self):
return True
# return True
# todo: to be updated
# if 'allowed id' not in self.conf.host:
# return True
#
# bank_id = int(self.from_iso.get_value(32))
# return bank_id in self.conf['allowed id']
bank_id = self.from_iso.getBit(32)
return bank_id in self.conf['banks']
###########
# Inquiry #
###########
def inquiry_request(self, data):
def inquiry_request(self, data={}):
for p in data:
self.setBit(int(p), data[p])
self.setMTI('0200')
self.set_transmission()
self.set_stan()
def inquiry_response_(self):
......@@ -136,7 +150,7 @@ class Doc(Transaction):
if len(invoice_id_raw) == 10:
invoice_id_raw = invoice_id_raw.ljust(16, ' ')
invoice_id_raw = invoice_id_raw.ljust(32, '0')
self.log_info(invoice_id_raw)
# self.log_info(invoice_id_raw)
r = self.invoice_id.set_raw(invoice_id_raw)
if not r:
return self.ack_invalid_number_2(invoice_id_raw)
......@@ -275,11 +289,12 @@ class Doc(Transaction):
###########
# Payment #
###########
def payment_request(self, data):
def payment_request(self, data=()):
for p in data:
self.setBit(int(p), data[p])
self.setMTI('0200')
self.set_stan()
self.set_transmission()
def payment_response(self):
self.payment_response_()
......@@ -351,44 +366,58 @@ class Doc(Transaction):
return
def save_payment(self, ntpd):
# todo: save payment
#
#channel_id = self.from_iso.get_channel_id()
#ntb = self.from_iso.get_ntb()
#total_bayar = self.from_iso.get_amount()
#pay = models.IsoPayment()
#pay.ntb = ntb
#pay.ntp = ntpd
#pay.invoice_no = self.invoice_id_raw[:16].strip()
#pay.nik = self.invoice_id_raw[16:32].strip()
## pay.tgl_bayar = self.from_iso.get_transaction_date()
#pay.amount = total_bayar
#pay.channel_id = channel_id
#pay.channel_nm = self.from_iso.getBit(43)
#pay.bank_ip = self.get_bank_ip()
#pay.biller_id = self.mod_conf['kd_biller']
## todo: mustbe transaction_date_time
#pay.tgl = self.from_iso.get_transaction_date()
#if 'id' in self.mod_conf:
channel_id = self.from_iso.get_channel_id()
ntb = self.from_iso.get_ntb()
total_bayar = self.from_iso.get_amount()
profile = self.from_iso.getBit(61)
self.invoice_profile.set_raw(profile)
data = dict()
for f in INVOICE_PROFILE:
field = f[0].replace(" ","_").lower()
if field in ["tgl_akhir_pajak_lama", "tgl_akhir_pajak_baru"]:
v = str(self.invoice_profile[f[0]])
tgl = DateVar()
tgl.set_raw(v)
v = tgl.get_value()
else:
v = self.invoice_profile[f[0]]
data[field] = v
pay = SamsatPayment()
pay.from_dict(data)
pay.ntb = ntb
pay.ntp = ntpd
pay.nomor_bayar = self.invoice_id_raw[:16].strip()
pay.nik = self.invoice_id_raw[16:32].strip()
# pay.tgl_bayar = self.from_iso.get_transaction_date()
pay.jumlah = total_bayar
pay.channel_id = channel_id
pay.channel_name = self.from_iso.getBit(43)
pay.bank_ip = self.get_bank_ip()
# pay.biller_id = self.mod_conf['kd_biller']
# todo: mustbe transaction_date_time
pay.tgl = self.from_iso.get_transaction_datetime()
# if 'id' in self.mod_conf:
# pay.bank_id = self.mod_conf.get('id')
#else:
# pay.bank_id = int(self.from_iso.get_value(32))
## pay.iso_request = self.from_iso.raw.upper()
## pay.transmission = self.from_iso.get_transmission_datetime()
## pay.stan = self.from_iso.get_value(11)
## pay.kd_wil = self.invoice_profile['Kode Wilayah']
## pay.settlement = self.from_iso.get_settlement_date()
## pay.bit_inv_profile = self.from_iso.get_invoice_id_raw()
#self.db_profile.commit(pay)
# else:
pay.bank_id = int(self.from_iso.getBit(32))
# pay.iso_request = self.from_iso.raw.upper()
pay.transmission = self.from_iso.get_transmission_datetime()
pay.stan = self.from_iso.get_value(11)
pay.kd_wil = self.invoice_profile['Kode Wilayah']
pay.settlement = self.from_iso.get_settlement_date()
pay.bit_inv_profile = self.from_iso.get_invoice_id_raw()
DBSession.add(pay)
DBSession.flush()
transaction.commit()
self.ack()
############
# Reversal #
############
def reversal_request(self, data):
def reversal_request(self, data=()):
for p in data:
self.setBit(int(p), data[p])
self.setMTI('0400')
......
......@@ -5,7 +5,6 @@ from datetime import time
class Job(NetworkJob):
# pass
def get_iso_class(self):
return Doc
......
......@@ -5,20 +5,11 @@ import locale
import importlib
from datetime import datetime
import imp
from opensipkd.forwarder.base.iso8583_forwarder import conf
from opensipkd.forwarder.base.modules.ws_tools import send_rpc
from iso8583_web.read_conf import read_conf, name_conf, ip_conf
from .doc import Doc
from .job import Job
def main(argv=sys.argv):
# global listen_ports
# global ip_conf
# global allowed_ips
# global hosts
# global logs
# global stop_dir
# global running
# global log
##############
# Blok Utama #
##############
global conf
......@@ -29,7 +20,7 @@ def main(argv=sys.argv):
host = 'bjb'
no_rangka = ""
no_ktp = ""
no_invoice = ""
no_invoice = conf_file = ""
amount = 0
pars = OptionParser()
pars.add_option('-p', '--no-pol')
......@@ -53,7 +44,10 @@ def main(argv=sys.argv):
no_invoice = option.invoice
amount = option.amount
read_conf(conf_file)
_host = conf.host
job = Job(conf=ip_conf[''])
rpc = _host[host]['samsat_banten']
kini = datetime.now()
tgl_transaksi = kini.strftime("%Y%m%d")
......
......@@ -2,11 +2,10 @@ from datetime import datetime
from pprint import pprint
from time import sleep
from optparse import OptionParser
from opensipkd.forwarder.bjb.samsat.structure import INQUIRY_CODE
from .DbTransaction import DbTransaction
from opensipkd.iso8583.bjb.samsat.structure import INQUIRY_CODE
from .doc import Doc
import os
import imp
from iso8583_web.scripts.forwarder import iso_to_dict
def inquiry_request(iso, invoice_id, bank_id=None):
bank_id = bank_id and bank_id or '110'
......@@ -19,46 +18,26 @@ def inquiry_request(iso, invoice_id, bank_id=None):
iso.setBit(18, '6010')
iso.setBit(22, '021')
iso.setBit(32, bank_id)
iso.setBit(33, '00110')
# iso.setBit(35, '')
iso.setBit(33, bank_id.rjust(5,'0')) #forwarder
iso.setBit(37, kini.strftime('%H%M%S'))
iso.setBit(41, '000')
iso.setBit(42, '000000000000000')
iso.setBit(43, 'Nama Bank')
iso.setBit(49, '390')
# iso.setBit(59, 'PAY')
# iso.setBit(60, '142')
iso.setBit(61, invoice_id)
# iso.setBit(63, '')
# iso.setBit(102, '')
# iso.setBit(107, '')
# test_not_found = False
# name = '.'.join(['bppt', 'test'])
# try:
# module = __import__(name)
# except ImportError, test_not_found:
# name = '.'.join(['bppt', conf.module_name])
# module = __import__(name)
# area_module = getattr(module, conf.module_name)
# DbTransaction = area_module.DbTransaction
#
# if test_not_found:
# inquiry_request = default_inquiry_request
# else:
# inquiry_request = area_module.test.inquiry_request
from iso8583_web.read_conf import (read_conf, get_str, name_conf)
class TestInquiry(object):
def __init__(self, argv):
self.option = get_option(argv)
if not self.option:
return
self.invoice_id = self.option.invoice_id.replace('-', '')
conf_file = self.option.conf_file
self.bank_id = self.option.bank_id
# conf_file = self.option.conf_file
self.host = self.option.host
conf = imp.load_source('conf', conf_file)
self.conf = conf.host[self.host]
# conf = imp.load_source('conf', conf_file)
self.conf = name_conf[self.host]
# dict(name=streamer_name, ip='127.0.0.1', bank_id=bank_id)
def run(self):
......@@ -66,17 +45,17 @@ class TestInquiry(object):
return
print('\nBank kirim inquiry request')
req_iso = DbTransaction(conf=self.conf)
req_iso.set_transaction_request()
inquiry_request(req_iso, self.invoice_id)
req_iso = Doc(conf=self.conf)
req_iso.inquiry_request()
inquiry_request(req_iso, self.invoice_id, self.bank_id)
raw = self.get_raw(req_iso)
print('\nPemda terima inquiry request')
from_iso = DbTransaction(conf=self.conf)
from_iso = Doc(conf=self.conf)
from_iso.setIsoContent(raw)
print('\nPemda kirim inquiry response')
resp_iso = DbTransaction(from_iso=from_iso, conf=self.conf)
resp_iso = Doc(from_iso=from_iso, conf=self.conf)
func = getattr(resp_iso, from_iso.get_func_name())
func()
self.get_raw(resp_iso)
......@@ -85,7 +64,7 @@ class TestInquiry(object):
def get_raw(self, iso):
msg = 'MTI {mti}'.format(mti=iso.getMTI())
print(msg)
pprint(iso.getBitsAndValues())
pprint(iso_to_dict(iso)) # getBitsAndValues())
raw = iso.getRawIso()
sleep(1)
print([raw])
......@@ -100,6 +79,7 @@ def get_option(argv):
pars.add_option('-o', '--host', default=host_name, help='default ' + host_name)
pars.add_option('-i', '--invoice-id')
pars.add_option('-c', '--conf-file', default=conf_file, help='default ' + conf_file)
pars.add_option('-b', '--bank-id', default='001', help='default BI 001')
option, remain = pars.parse_args(argv)
if not option.invoice_id:
print('--invoice-id harus diisi.')
......
from datetime import datetime
from opensipkd.forwarder.bjb.samsat.structure import (
from opensipkd.iso8583.bjb.samsat.structure import (
PAYMENT_CODE,
REQUEST_BITS,
TRANSACTION_BITS as REQUEST_BITS,
)
from .test_inquiry import (
DbTransaction,
Doc,
TestInquiry,
# test_not_found,
# area_module,
)
......@@ -30,16 +28,17 @@ class TestPayment(TestInquiry):
resp_iso = TestInquiry.run(self)
if not resp_iso.is_ok_response():
return resp_iso, None
print('\nBank kirim payment request')
req_iso = DbTransaction(conf=self.conf)
req_iso.set_transaction_request()
req_iso = Doc(conf=self.conf)
req_iso.payment_request()
payment_request(req_iso, resp_iso) # , self.conf['bank_id']
raw = self.get_raw(req_iso)
print('\nPemda terima payment request')
from_iso = DbTransaction(conf=self.conf)
from_iso = Doc(conf=self.conf)
from_iso.setIsoContent(raw)
print('\nPemda kirim payment response')
resp_iso = DbTransaction(from_iso=from_iso, conf=self.conf) # , conf=self.conf
resp_iso = Doc(from_iso=from_iso, conf=self.conf) # , conf=self.conf
func = getattr(resp_iso, from_iso.get_func_name())
func()
self.get_raw(resp_iso)
......
from datetime import datetime
from test_payment import (
DbTransaction,
from .test_payment import (
Doc,
TestPayment,
)
def reversal_request(iso, pay_req_iso):
iso.copy(from_iso=pay_req_iso)
iso.set_reversal_request()
iso.reversal_request()
class TestReversal(TestPayment):
......@@ -16,14 +16,14 @@ class TestReversal(TestPayment):
if not pay_resp_iso.is_ok_response():
return
print('Bank kirim reversal request')
req_iso = DbTransaction(conf=self.conf)
req_iso = Doc(conf=self.conf)
reversal_request(req_iso, pay_req_iso)
raw = self.get_raw(req_iso)
print('Pemda terima reversal request')
from_iso = DbTransaction(conf=self.conf)
from_iso = Doc(conf=self.conf)
from_iso.setIsoContent(raw)
print('Pemda kirim reversal response')
resp_iso = DbTransaction(from_iso=from_iso, conf=self.conf)
resp_iso = Doc(from_iso=from_iso, conf=self.conf)
func = getattr(resp_iso, from_iso.get_func_name())
func()
self.get_raw(resp_iso)
......
from iso8583_web.models import (
BaseModel, Base, DBSession
)
from sqlalchemy import (
Column,
String,
DateTime,
Integer,
ForeignKey,
Text
)
class SamsatPayment(Base, BaseModel):
__tablename__ = 'samsat_payment'
nomor_bayar = Column(String(16), nullable=False)
nomor_rangka = Column(String(25))
nomor_mesin = Column(String(25))
nomor_identitas = Column(String(18))
nama_pemilik = Column(String(25))
alamat_pemilik = Column(String(40))
nomor_polisi = Column(String(9))
warna_plat = Column(String(6))
milik_ke = Column(String(3))
nama_jenis_kb = Column(String(15))
nama_merk_kb = Column(String(15))
nama_model_kb = Column(String(30))
tahun_buatan = Column(String(4))
tgl_akhir_pajak_lama = Column(DateTime(timezone=False))
tgl_akhir_pajak_baru = Column(DateTime(timezone=False))
pokok_bbn = Column(Integer)
denda_bbn = Column(Integer)
pokok_pkb = Column(Integer)
denda_pkb = Column(Integer)
pokok_swd = Column(Integer)
denda_swd = Column(Integer)
pokok_adm_stnk = Column(Integer)
pokok_adm_tnkb = Column(Integer)
jumlah = Column(Integer)
keterangan = Column(Integer)
kode_wilayah = Column(Integer)
ntb = Column(String(32), nullable=False)
ntp = Column(String(32), nullable=False)
tgl = Column(DateTime(timezone=False))
channel_id = Column(Integer, nullable=False)
channel_name = Column(String(128))
bank_id = Column(Integer, nullable=False)
bank_ip = Column(String(64), nullable=False)
transmission = Column(DateTime(timezone=False))
stan = Column(String(32))
kd_wil = Column(String(32))
settlement = Column(DateTime(timezone=False))
bit_inv_profile = Column(Text)
class SamsatReversal(Base, BaseModel):
__tablename__ = 'samsat_reversal'
id = Column(Integer, ForeignKey(SamsatPayment.id), nullable=False,
primary_key=True)
ntp = Column(String(32), nullable=False)
tgl_reversal = Column(DateTime(timezone=False))
import os
import sys
import csv
import subprocess
import transaction
from getpass import getpass
from sqlalchemy import engine_from_config
from ziggurat_foundations.models.services.user import UserService
from pyramid.paster import (
get_appsettings,
setup_logging,
)
from pyramid.i18n import (
Localizer,
TranslationStringFactory,
Translations,
)
from iso8583_web.models import (
DBSession,
Base,
)
from ..models import (
SamsatPayment,
SamsatReversal,
)
from iso8583_web.scripts.initialize_db import (
usage, read_file, my_registry, restore_csv, append_csv)
def alembic_run(ini_file, url):
bin_path = os.path.split(sys.executable)[0]
alembic_bin = os.path.join(bin_path, 'alembic')
command = (alembic_bin, 'upgrade', 'head')
s = read_file(ini_file)
s = s.replace('{db_url}', url)
f = open('alembic.ini', 'w')
f.write(s)
f.close()
subprocess.call(command)
os.remove('alembic.ini')
def get_file(filename):
base_dir = os.path.split(__file__)[0]
fullpath = os.path.join(base_dir, 'data', filename)
return open(fullpath)
def main(argv=sys.argv):
if len(argv) != 2:
usage(argv)
config_uri = argv[1]
setup_logging(config_uri)
settings = get_appsettings(config_uri)
my_registry['settings'] = settings
engine = engine_from_config(settings, 'sqlalchemy.')
Base.metadata.bind = engine
Base.metadata.create_all()
#alembic_run('alembic.ini.tpl', settings['sqlalchemy.url'])
# with transaction.manager:
# append_csv(Group, 'groups.csv', ['group_name'])
# restore_csv(UserGroup, 'users_groups.csv')
# restore_csv(Bank, 'bank.csv')
# restore_csv(Method, 'iso_method.csv')
# restore_csv(Jenis, 'jenis.csv')
# restore_csv(Kategori, 'kategori.csv')
......@@ -126,7 +126,7 @@ INVOICE_PROFILE = [
ERR_INVALID_NUMBER = 'Invoice ID {invoice_id} tidak benar'
ERR_INVALID_BANK = 'Bank ID {id} tidak diperkenankan'
ERR_INVALID_BANK = 'Bank ID {bank_id} tidak diperkenankan'
ERR_SETTLEMENT_DATE = 'Settlement date {raw} tidak benar'
ERR_TRANSACTION_DATETIME = 'Transaction datetime {raw} tidak benar'
ERR_TRANSACTION_DATE = 'Transaction date {raw} tidak benar'
......
......@@ -259,4 +259,5 @@ class Transaction(BaseTransaction, Log):
self.setBit(62, msg)
BaseTransaction.ack_other(self, msg)
def set_transaction_code(self, code):
self.setBit(3, code)
......@@ -33,4 +33,9 @@ setup(
packages=packages,
install_requires=requires,
zip_safe=False,
)
entry_points={
'console_scripts': [
'initialize_bjb_samsat_db = opensipkd.iso8583.bjb.samsat.scripts.initialize_db:main',
]
}
)
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!