Commit be1b2f74 by Solo Group

test 5 @ 500

1 parent 4245acc2
...@@ -46,6 +46,7 @@ Konfigurasi aplikasi terdapat pada section module:: ...@@ -46,6 +46,7 @@ Konfigurasi aplikasi terdapat pada section module::
samsat_banten_kd_produk = 5 samsat_banten_kd_produk = 5
samsat_banten_persen_denda = 0 samsat_banten_persen_denda = 0
samsat_banten_max_bln_denda = 0 samsat_banten_max_bln_denda = 0
samsat_banten_timeout = 0
Running: Running:
...@@ -54,23 +55,46 @@ Untuk menjalankan aplikasi :: ...@@ -54,23 +55,46 @@ Untuk menjalankan aplikasi ::
iso8583 {ini_file} iso8583 {ini_file}
Catatan Script:
======= =======
Masih terdapat hal-hal yang harus di perbaiki pada:
1. Perbaikan pada ``site-package/opensipkd/__init__.py`` dan
``site-package/opensipkd/iso8583/__init__.py`` diisi dengan::
_path_ = _import('pkgutil').extend_path(path, __name_) * Initialize database ::
env/bin/initialize_bjb_samsat_db [config file]
2. Perbaikan pada ``site-package/opensipkd/tcp/connection.py``:: * Test api ::
def on_socket_error(self, err): env/bin/test-info-samsat-banten -c config_file -m module <option>
# aagusti digunakan untuk menghindari pemutusan sepihak dari server
# apabila timout saat menanti raw
if self.conf['listen'] and not self.conf['echo']:
self.set_connected_time()
return
self.close() Option::
--------
-m, --module [get_tagihan, get_kd_bayar, inquiry, response, reversal]
-i, --invoice_no Nomor Invoice
-k, --ktp NIK/Nomor KTP
-p, --no_pol Nomor Polisi
-a, --amount Jumlah Tagihan
* Contoh :
* Mendapatkan nomor bayar::
env/bin/test-info-samsat-banten -c etc/iso8583.ini -m get_kd_bayar \
-k 1234567890123456
-p A1234AA
* Inquiry::
env/bin/test-info-samsat-banten -c etc/iso8583.ini -m inquiry \
-i 1234567890123456
* Payment::
env/bin/test-info-samsat-banten -c etc/iso8583.ini -m payment \
-i 1234567890123456
-a 12345
* Reversal::
env/bin/test-info-samsat-banten -c etc/iso8583.ini -m reversal \
-i 1234567890123456
-a 12345
Catatan
=======
Masih terdapat hal-hal yang harus di perbaiki pada:
1. Perbaikan pada ``site-package/opensipkd/__init__.py`` dan
``site-package/opensipkd/iso8583/__init__.py`` diisi dengan::
_path_ = _import('pkgutil').extend_path(path, __name_)
2. Perbaikan pada ``site-package/opensipkd/tcp/connection.py``::
def on_socket_error(self, err):
# aagusti digunakan untuk menghindari pemutusan sepihak dari server
# apabila timout saat menanti raw
if self.conf['listen'] and not self.conf['echo']:
self.set_connected_time()
return
self.close()
2. Perbaikan pada ``site-package/opensipkd/tcp/connection.py``::
def on_socket_error(self, err):
# aagusti digunakan untuk menghindari pemutusan sepihak dari server
# apabila timout saat menanti raw
if self.conf['listen'] and not self.conf['echo']:
self.set_connected_time()
return
self.close()
4. Perbaikan pada ``opensipkd/iso8583/doc.py``::
def get_value(self, bit):
v = self.getBit(bit)
type_ = self.getBitType(bit)
return v
# if type_.find('LL') < 0:
# return v
# size_length = len(type_)
# return v[size_length:]
\ No newline at end of file \ No newline at end of file
import logging
import os
import signal
import sys
from pprint import pprint
from threading import Thread
from time import (sleep,)
from iso8583_web.read_conf import (ip_conf)
from iso8583_web.read_conf import (read_conf, name_conf)
from iso8583_web.scripts.forwarder import get_db
from opensipkd.string import (exception_message, dict_to_str,)
from opensipkd.tcp.client import Client as BaseClient
from opensipkd.tcp.connection import (
ConnectionManager as BaseConnectionManager,
join_ip_port,
)
from pyramid.paster import setup_logging
from datetime import datetime
from opensipkd.iso8583.bjb.samsat.banten.doc import Doc
from optparse import OptionParser
try:
from configparser import (
ConfigParser,
NoOptionError,
)
except ImportError:
from ConfigParser import (
ConfigParser,
NoOptionError,
)
INQUIRY_CODE = '301099'
from iso8583_web.scripts.forwarder import (
CommonConnection, iso_to_dict, create_thread, Log, parser_threads,
log_info, to_str)
from iso8583_web.scripts.forwarder import (
# check_connection, check_job,
# check_parser,
logs, running, conn_mgr,
ConnectionManager, out)
def get_option(argv):
# bank = conf.host['streamer'] #'bjb'
pars = OptionParser()
count = 10
pars.add_option('-i', '--invoice-id')
pars.add_option('-c', '--count', default=count, help="Default %s" % count)
option, remain = pars.parse_args(argv)
if not option.invoice_id:
print('--invoice-id harus diisi.')
return
return option
# todo: harus nya diimport saja dari scripts inquiry
def inquiry_request(iso, invoice_id, bank_id=None):
bank_id = bank_id and bank_id or '110'
kini = datetime.now()
iso.setBit(2, kini.strftime('%Y%m%d%H%M%S'))
iso.set_transaction_code(INQUIRY_CODE)
iso.setBit(12, kini.strftime('%H%M%S'))
iso.setBit(13, kini.strftime('%m%d'))
iso.setBit(15, kini.strftime('%m%d'))
iso.setBit(18, '6010')
iso.setBit(22, '021')
iso.setBit(32, bank_id)
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(61, invoice_id)
class TestInquiry(object):
def __init__(self, argv, client):
self.option = get_option(argv)
if not self.option:
return
self.invoice_id = self.option.invoice_id.replace('-', '')
# print(name_conf['banten'])
self.conf = name_conf[client]
self.bank_id = 'bank_id' in self.conf and self.conf['bank_id'] or '110'
self.count = self.option.count
def run(self):
if not self.option:
return
print('\nBank kirim inquiry request')
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)
return raw
def get_raw(self, iso):
msg = 'MTI {mti}'.format(mti=iso.getMTI())
# print(msg)
# pprint(iso_to_dict(iso)) # getBitsAndValues())
raw = iso.getRawIso()
# sleep(1)
# print([raw])
return raw
# class CommonConnection(Log):
# def log_receive_raw(self, raw):
# raw = to_str(raw)
# self.log_info('Receive {}'.format([raw]))
#
# def log_send(self, raw):
# if isinstance(raw, bytes):
# raw = raw.decode('utf-8')
# raw = to_str(raw)
# self.log_info('Send {}'.format([raw]))
#
# def log_close(self, reason):
# msg = 'close connection because {}'.format(reason)
# self.log_info(msg)
#
# def log_timeout(self):
# self.log_error("DBUG > COmmond")
# self.log_close('timeout')
#
# def log_raw_to_iso(self, raw):
# self.log_info('Raw to ISO8583 {}'.format([raw]))
#
# def log_iso_to_raw(self, raw):
# raw = to_str(raw)
# # self.log_info('ISO8583 to raw {}'.format([raw]))
#
# def process(self, raw):
# raw = raw+chr(13)
# for i in range(1,20):
# parser = Parser(self, raw)
# thread = create_thread(parser.run)
# parser_threads.append((parser, thread))
# thread.start()
###################
# ISO 8583 Client #
###################
class Client(BaseClient, CommonConnection):
def connect(self):
ip, port = self.address
self.log_info('connect to port {}'.format(port))
BaseClient.connect(self)
def on_receive_raw(self, raw):
self.log_receive_raw(raw)
BaseClient.on_receive_raw(self, raw)
# Override BaseClient.process()
def process(self, raw):
CommonConnection.process(self, raw)
def close_because_timeout(self):
self.log_error("DEBUG -> CLIENT")
self.log_timeout()
BaseClient.close_because_timeout(self)
def on_refused(self, err):
ip, port = self.address
self.log_error('port {} {}'.format(port, err))
BaseClient.on_refused(self, err)
def on_socket_error(self, err):
self.log_error(err)
BaseClient.on_socket_error(self, err)
def raw_for_send(self, raw):
self.log_iso_to_raw(raw)
raw = BaseClient.raw_for_send(self, raw)
self.log_send(raw)
return raw
def run(self):
try:
BaseClient.run(self)
except:
self.log_unknown()
def on_loop(self):
raw = self.receive_raw()
if not raw:
if self.is_timeout():
if not self.conf['listen']:
self.set_connected_time()
return
self.close_because_timeout()
return
# raw = self.streamer.get(raw)
# if not raw:
# return
# raw = self.process(raw)
# if raw:
# self.send(raw)
while True:
raw = self.streamer.get(raw)
# i += 1
# self.log_info(">> RAW {}, {}".format(i, raw))
# self.log_info(">> SISA {}, {}".format(i, self.streamer.raw))
if not raw:
break
raw = self.process(raw)
if raw:
self.send(raw)
raw = ''
def start_client(conf):
client = Client(conf)
thread = create_thread(client.run)
ip_port = join_ip_port(conf['ip'], conf['port'])
clients[ip_port] = (client, thread)
thread.start()
conn_mgr.add(client)
clients = {}
# def stop_connections(reason):
# for ip_port, connection in conn_mgr:
# connection.log_close(reason)
# connection.close()
# sleep(1)
# for ip_port in clients:
# client, thread = clients[ip_port]
# thread.join()
#######################
# Raw ISO 8583 parser #
#######################
class Parser(Log):
def __init__(self, connection, raw):
self.connection = connection
self.raw = raw
self.conf = connection.conf
self.conn_id = id(connection)
self.parser_id = id(self)
self.running = True
# Override
def log_message(self, msg):
return '{ip} {name} {conn_id} -> {parser_id} {msg}'.format(
ip=self.conf['ip'], name=self.conf['name'], conn_id=self.conn_id,
parser_id=self.parser_id, msg=msg)
def run(self):
from_iso = self.connection.job.raw_to_iso(self.raw)
# self.log_decode(from_iso)
# ditambahkan disini
raw = iso['inquiry'].run()
self.connection.send(raw)
#ini di remark
# iso = self.connection.job.process(from_iso)
#
# if iso:
# self.log_encode(iso)
# raw = iso.getRawIso()
# self.connection.send(raw)
# else: # dapat response
# ip_port = join_ip_port(self.conf['ip'], self.conf['port'])
self.running = False
######################
# Connection Manager #
######################
# class ConnectionManager(BaseConnectionManager):
# def close_old_connection(self, old_conn):
# old_conn.log_close('new connection found')
# BaseConnectionManager.close_old_connection(self, old_conn)
# conn_mgr = ConnectionManager()
# MSG_KILL_BY_SIGNAL = 'kill by signal {}'
# MSG_KILL_BY_KEYBOARD = 'kill by keyboard interrupt'
#
#
# def out(sig=None, func=None):
# if running:
# del running[0] # Akhiri loop utama
# if sig:
# reason = MSG_KILL_BY_SIGNAL.format(sig)
# else:
# reason = MSG_KILL_BY_KEYBOARD
# stop_connections(reason)
def usage(argv):
cmd = os.path.basename(argv[0])
print('usage: %s <config_uri>\n'
'(example: "%s test.ini -i invoice_id [-c count]")' % (cmd, cmd))
sys.exit(1)
def check_connection():
log_info("Check Connection")
for ip_port in ip_conf:
if ip_port in conn_mgr:
index = -1
while True:
index += 1
if not conn_mgr[index:]:
break
this_ip_port, conn = conn_mgr[index]
if this_ip_port != ip_port:
continue
if conn.running:
continue
conn_mgr.remove(index)
break
continue
cfg = ip_conf[ip_port]
if cfg['listen']:
continue
start_client(cfg)
sleep(5)
def check_job():
log_info("Check Job")
for ip_port, connection in conn_mgr:
if not connection.running:
continue
if not connection.is_connected():
continue
iso = connection.job.get_iso()
if not iso:
continue
# connection.log_encode(iso)
raw = iso.getRawIso()
connection.send(raw)
def check_parser():
log_info("Check Parser")
i = -1
while True:
i += 1
if not parser_threads[i:]:
break
parser, thread = parser_threads[i]
if not parser.running:
thread.join()
del parser_threads[i]
i -= 1
# logs = []
# running = []
# iso_raw = None
iso = {}
def main(argv=sys.argv):
if len(argv) <= 3:
usage(argv)
config_uri = argv[1]
setup_logging(config_uri)
conf = read_conf(config_uri)
# conf['invoice_id'] = argv[2]
get_db(conf)
log = logging.getLogger(__file__)
logs.append(log)
running.append(True)
iso['inquiry'] = TestInquiry(argv, 'banten')
# Antisipasi kill
signal.signal(signal.SIGTERM, out)
try:
start = True
while running:
check_connection()
check_job()
for c in conn_mgr:
this_ip_port = c[0]
conn = c[1]
if conn.running and start:
for i in range(int(iso['inquiry'].count)):
raw = iso['inquiry'].run()
conn.send(raw)
sleep(0.5)
start = False
check_parser()
# break
sleep(5)
except KeyboardInterrupt:
out()
if __name__ == '__main__':
main(sys.argv)
import logging
import os
import signal
import sys
from pprint import pprint
from threading import Thread
from time import (sleep, )
from iso8583_web.read_conf import (ip_conf)
from iso8583_web.read_conf import (read_conf, name_conf)
from iso8583_web.scripts.forwarder import get_db
from opensipkd.string import (exception_message, dict_to_str, )
from opensipkd.tcp.client import Client as BaseClient
from opensipkd.tcp.connection import (
ConnectionManager as BaseConnectionManager,
join_ip_port,
)
from pyramid.paster import setup_logging
from datetime import datetime
from opensipkd.iso8583.bjb.samsat.banten.doc import Doc
from optparse import OptionParser
from iso8583_web.scripts.forwarder import (
CommonConnection, iso_to_dict, create_thread, Log, parser_threads,
log_info, to_str)
from iso8583_web.scripts.forwarder import (
logs, conn_mgr,)
try:
from configparser import (
ConfigParser,
NoOptionError,
)
except ImportError:
from ConfigParser import (
ConfigParser,
NoOptionError,
)
INQUIRY_CODE = '301099'
def get_option(argv):
# bank = conf.host['streamer'] #'bjb'
pars = OptionParser()
count = 10
pars.add_option('-i', '--invoice-id')
pars.add_option('-c', '--count', default=count, help="Default %s" % count)
option, remain = pars.parse_args(argv)
if not option.invoice_id:
print('--invoice-id harus diisi.')
return
return option
# todo: harus nya diimport saja dari scripts inquiry
def inquiry_request(iso, invoice_id, bank_id=None):
bank_id = bank_id and bank_id or '110'
kini = datetime.now()
iso.setBit(2, kini.strftime('%Y%m%d%H%M%S'))
iso.set_transaction_code(INQUIRY_CODE)
iso.setBit(12, kini.strftime('%H%M%S'))
iso.setBit(13, kini.strftime('%m%d'))
iso.setBit(15, kini.strftime('%m%d'))
iso.setBit(18, '6010')
iso.setBit(22, '021')
iso.setBit(32, bank_id)
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(61, invoice_id)
class TestInquiry(object):
def __init__(self, argv, client):
self.option = get_option(argv)
if not self.option:
return
self.invoice_id = self.option.invoice_id.replace('-', '')
# print(name_conf['banten'])
self.conf = name_conf[client]
self.bank_id = 'bank_id' in self.conf and self.conf['bank_id'] or '110'
self.count = self.option.count
def run(self):
if not self.option:
return
# print('\nBank kirim inquiry request')
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)
return raw
def get_raw(self, iso):
msg = 'MTI {mti}'.format(mti=iso.getMTI())
# print(msg)
# pprint(iso_to_dict(iso)) # getBitsAndValues())
raw = iso.getRawIso()
# sleep(1)
# print([raw])
return raw
def usage(argv):
cmd = os.path.basename(argv[0])
print('usage: %s <config_uri>\n'
'(example: "%s test.ini -i invoice_id [-c count]")' % (cmd, cmd))
sys.exit(1)
def check_connection():
log_info("Check Connection")
for ip_port in ip_conf:
if ip_port in conn_mgr:
index = -1
while True:
index += 1
if not conn_mgr[index:]:
break
this_ip_port, conn = conn_mgr[index]
if this_ip_port != ip_port:
continue
if conn.running:
continue
conn_mgr.remove(index)
break
continue
cfg = ip_conf[ip_port]
if cfg['listen']:
continue
start_client(cfg)
sleep(5)
def check_job():
log_info("Check Job")
for ip_port, connection in conn_mgr:
if not connection.running:
continue
if not connection.is_connected():
continue
iso = connection.job.get_iso()
if not iso:
continue
# connection.log_encode(iso)
raw = iso.getRawIso()
connection.send(raw)
def check_parser():
log_info("Check Parser")
i = -1
while True:
i += 1
if not parser_threads[i:]:
break
parser, thread = parser_threads[i]
if not parser.running:
thread.join()
del parser_threads[i]
i -= 1
iso = {}
import socket, sys, time
BUFFER_SIZE = 1024
import threading
REQUESTS = 100
SLEEP = 1
TIMEOUT = 10
THREADS = 5
threads = []
def receiving(s):
while True:
try:
raw = s.recv(BUFFER_SIZE)
print("Received {} ".format(raw[:30]))
except:
print(sys.exc_info()[0])
break
def sending(s, thrs, test_inquiry ):
i = 0
for i in range(REQUESTS):
raw = test_inquiry.run()
raw = raw + '\x03'
l = str(len(raw)).zfill(4)
raw = l+raw
print("Sending Message Thread {} ke {}: {}".format(thrs, i, raw[:30]))
s.send(raw.encode("ASCII"))
TCP_IP = '127.0.0.1'
TCP_PORT = 8589
def main(argv):
config_uri = argv[1]
setup_logging(config_uri)
conf = read_conf(config_uri)
print(conf)
get_db(conf)
log = logging.getLogger(__file__)
logs.append(log)
# running.append(True)
test_inquiry = TestInquiry(argv, 'banten')
running = True
while running == True:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("Connecting to {} PORT {}...".format(TCP_IP, TCP_PORT))
s.connect((TCP_IP, TCP_PORT))
s.settimeout(TIMEOUT)
print("Connected!")
# Thread For Receiving Message
thread = threading.Thread(target=receiving, args=[s])
thread.daemon = True
thread.start()
threads.append(thread)
# Thread For Receiving Message
for i in range(THREADS):
thread = threading.Thread(target=sending, args=[s, i, test_inquiry])
thread.daemon = True
thread.start()
threads.append(thread)
running = False
except:
running = False
print(sys.exc_info()[0])
time.sleep(1)
for thread in threads:
thread.join()
if __name__ == '__main__':
main(sys.argv)
# import traceback
# # from opensipkd.iso8583.base.modules.network import models
# import re
# from opensipkd.iso8583.bjb.samsat.transaction import TransactionJsonRpc as Transaction
# from opensipkd.iso8583.bjb.samsat.structure import (
# INVOICE_ID,
# INVALID_NIK,
# INVOICE_PROFILE,
# INQUIRY_CODE,
# PAYMENT_CODE,
# RC_OK,
# RC_NOT_AVAILABLE,
# RC_ALREADY_PAID,
# RC_INVALID_NIK,
# RC_INVALID_NUMBER,
# RC_EXPIRE,
# RC_DUPLIKASI_TGL_AKHIR_PAJAK,
# ERR_INVALID_NUMBER,
# ERR_INVALID_NUMBER_2,
# ERR_NOT_AVAILABLE,
# ERR_ALREADY_PAID,
# ERR_INVALID_CHANNEL,
# ERR_INQUIRY_TIMEOUT,
# ERR_PAYMENT_TIMEOUT,
# ERR_PAYMENT_FAILED,
# ERR_OTHER,
# ERR_PAYMENT_NOT_FOUND,
# ERR_REVERSAL_DONE,
# ERR_REVERSAL_TIMEOUT,
# ERR_REVERSAL_FAILED,
# ERR_INVALID_CHANNEL,
# ERR_INVALID_NIK,
# ERR_DB,
# ERR_INVALID_BANK,
# ERR_EXPIRE,
# ERR_DUPLIKASI_TGL_AKHIR_PAJAK,
# )
#
# from opensipkd.tools import FixLength
# import sys
# if sys.version < 3:
# from StringIO import StringIO
# else:
# from io import StringIO
#
#
# def date2str(d):
# return d and d.strftime('%Y%m%d') or None
#
#
# class DbTransaction(Transaction):
# def __init__(self, *args, **kwargs):
# self.invoice_id = FixLength(INVOICE_ID)
# self.invalid_nik = FixLength(INVALID_NIK)
# self.invoice_profile = FixLength(self.get_invoice_profile_definition())
# # self.other_engine = OtherEngine(db_name, db_user, db_pass)
# Transaction.__init__(self, *args, **kwargs)
# self.rpc = self.conf and self.conf['samsat_banten'] or None
# if not self.conf or not self.rpc:
# raise ("Perbaiki konfigurasi")
#
#
# # @staticmethod
# def get_invoice_profile_definition(self):
# return INVOICE_PROFILE
#
# def is_allowed(self):
# 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']
#
# ###########
# # Inquiry #
# ###########
# def inquiry_response_(self):
# if not self.is_allowed():
# return self.ack_not_allowed()
# self.setBit(4, 0)
# tagihan = self.get_invoice()
# if tagihan:
# self.setBit(4, tagihan['jumlah'] or 0)
# return tagihan
#
# def inquiry_response(self):
# self.inquiry_response_()
# try:
# pass
# except:
# self.ack_other('Ada kesalahan yang belum dipahami.')
# f = StringIO()
# traceback.print_exc(file=f)
# self.log_error(f.getvalue())
# f.close()
#
# def get_invoice_id_structure(self):
# invoice_id_raw = self.get_invoice_id_raw()
# invoice_id_raw = invoice_id_raw.strip().replace('.', '').strip()
# if len(invoice_id_raw) in [10,16]:
# 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)
# r = self.invoice_id.set_raw(invoice_id_raw)
# if not r:
# return self.ack_invalid_number_2(invoice_id_raw)
# self.invoice_id['Nomor Bayar'] = self.invoice_id['Nomor Bayar'].strip()
# if self.invoice_id['Nomor Identitas'] is None:
# self.invoice_id['Nomor Identitas'] = ''
# else:
# self.invoice_id['Nomor Identitas'] = \
# self.invoice_id['Nomor Identitas'].strip()
# self.invoice_id_raw = self.invoice_id['Nomor Bayar'].ljust(16) + \
# self.invoice_id['Nomor Identitas']
# return r
#
# def get_data(self):
# return dict(kd_bank=str(self.get_bank_id()).rjust(3, '0'),
# kd_channel=self.from_iso.get_channel(),
# invoice_no=self.invoice_id_raw[:16],
# kd_biller=self.rpc['kd_biller'],
# kd_produk=self.rpc['kd_produk']
# )
#
# def get_invoice(self):
# if not self.get_invoice_id_structure():
# return self.ack_invalid_number()
# if len(self.invoice_id['Nomor Bayar']) != 16:
# return self.ack_invalid_number()
# data = self.get_data()
# rows = self.send_rpc('inquiry', data)
#
# if 'error' in rows:
# code = rows['error']['code'] \
# and rows['error']['code'] or '91'
# code = len(str(code))>2 and '91' or code
# if code in ['01', '02', '03', '04', '06', '09',
# '10', '11', '12', '15' ,'99','24']:
# code = '55'
#
# elif code in ['05','23']:
# code='54'
# else:
# code='91'
#
# message = rows['error']['message'] and rows['error']['message'] or 'Link Down'
# self.log_info('Nomor Bayar {nb} NIK {nik} kode = {code}, {message}'.format(
# nb=self.invoice_id['Nomor Bayar'],
# nik=self.invoice_id['Nomor Identitas'],
# code=code,
# message=message))
#
# self.setBit(62, message)
# self.ack(code, message)
# return self.ack(code, message)
#
# if rows:
# invoice = rows['result']['data']
# self.set_profile(invoice)
# return invoice
# self.ack_inquiry_timeout()
#
# def get_bank_channel_id(self):
# bank_id = self.get_bank_id()
# bank_id = str(bank_id).zfill(3)
# channel_id = self.from_iso.get_channel_id()
# channel_id = self.from_iso.get_channel_name_to_id() + channel_id
# # channel_id = str(channel_id).zfill(7)
# return '{b}{c}'.format(b=bank_id, c=channel_id)
#
# def set_profile_(self, invoice):
# self.invoice_profile.from_dict({
# 'Nomor Bayar': invoice['invoice_no'],
# 'Nomor Rangka': invoice['no_rangka'],
# 'Nomor Mesin': invoice['no_mesin'],
# 'Nomor Identitas': invoice['no_identitas'],
# 'Nama Pemilik': invoice['nm_wp'],
# 'Alamat Pemilik': invoice['jln_wp'],
# 'Nomor Polisi': 'no_polisi' in invoice and invoice['no_polisi'] or '',
# 'Warna Plat': invoice['warna_tnkb'],
# 'Milik Ke': invoice['milik_ke'],
# 'Nama Jenis KB': invoice['jenis_op'],
# 'Nama Merk KB': 'nm_op' in invoice and invoice['nm_op'] or '',
# 'Nama Model KB': invoice['model_op'],
# 'Tahun Buatan': 'tahun_produksi' in invoice and invoice['tahun_produksi'] or invoice['tahun_produksi '],
# 'Tgl Akhir Pajak Lama': re.sub("\D", "", invoice['tgl_lama']),
# 'Tgl Akhir Pajak Baru': re.sub("\D", "", invoice['tgl_baru']),
# 'Pokok BBN': invoice['pokok_bbn'],
# 'Denda BBN': invoice['denda_bbn'],
# 'Pokok PKB': invoice['pokok_pkb'],
# 'Denda PKB': invoice['denda_pkb'],
# 'Pokok SWD': invoice['pokok_swd'],
# 'Denda SWD': invoice['denda_swd'],
# 'Pokok Adm STNK': invoice['pokok_adm_stnk'],
# 'Pokok Adm TNKB': invoice['pokok_adm_tnkb'],
# 'Jumlah': invoice['jumlah'],
# 'Keterangan': invoice['keterangan'],
# 'Kode Wilayah': invoice['reserved_01']})
# self.set_invoice_profile(self.invoice_profile.get_raw())
#
# def set_profile(self, invoice):
# self.set_profile_(invoice)
# # kode = invoice['kd_status']
# self.log_info('Nomor Bayar {nb} NIK {nik}'.format(
# nb=self.invoice_id['Nomor Bayar'],
# nik=self.invoice_id['Nomor Identitas']))
# return self.ack()
#
# # if kode == '1':
# # return self.ack()
# # self.set_error_msg(invoice['ket'])
# # if kode == 'A':
# # nik_samsat = invoice['nik_nasabah'].strip()
# # if self.invoice_id['Nomor Identitas'] == nik_samsat:
# # return self.ack_not_available()
# # self.invalid_nik.from_dict({
# # 'Nomor Identitas Bank': self.invoice_id['Nomor Identitas'],
# # 'Nomor Identitas Pemprov': nik_samsat})
# # self.set_invoice_profile(self.invalid_nik.get_raw())
# # return self.ack_invalid_nik(invoice)
# # if kode == 'B':
# # return self.ack_other('Harus ke kantor SAMSAT')
# # if kode == 'F':
# # return self.ack_already_paid()
# # if kode == 'H':
# # return self.ack_expire()
# # if kode == 'C':
# # return self.ack_duplikasi_tgl_akhir_pajak()
# # if kode == 'G':
# # return self.ack_other('Jam pelayanan usai')
# # self.ack_other()
#
# def set_error_msg(self, msg):
# self.setBit(62, msg)
#
# def tgl_bayar(self):
# t = self.from_iso.get_transaction_date()
# return t.strftime('%m-%d-%Y')
#
# ###########
# # Payment #
# ###########
# def payment_response(self):
# self.payment_response_()
#
# def payment_response_(self):
# if not self.is_allowed():
# return self.ack_not_allowed()
# self.copy([4, self.get_bit_invoice_profile()])
# pay = self.get_payment()
# if not pay:
# return
# no_identitas=self.from_iso.get_invoice_id_raw()[16:]
# self.invoice_id_raw = ''.join([
# pay['invoice_no'].ljust(16),
# no_identitas])
# ntpd = pay['ntp'] # self.ntpd(bank_id)
# self.set_ntp(ntpd)
# return self.save_payment(ntpd)
#
# def get_payment(self):
# self.invoice_id_raw = self.from_iso.get_invoice_id_raw()[:16].strip()
#
# if len(self.invoice_id_raw) == 16:
# data = self.get_data()
# data.update(
# dict(ntb=self.get_ntb(),
# tgl_transaksi=self.get_transaction_date().strftime('%Y%m%d'),
# jam_transaksi=self.get_transaction_time().strftime("%H%M%S"),
# amount=self.get_amount())
# )
# rows = self.send_rpc('payment', data)
# if 'error' in rows:
# if 'error' in rows['error']:
# rows = rows['error']
# code = rows['error']['code']
#
# message = rows['error']['message']
# self.log_info('Nomor Bayar {nb} NIK {nik} kode = {code}, {message}'.format(
# nb=self.invoice_id['Nomor Bayar'],
# nik=self.invoice_id['Nomor Identitas'],
# code=code,
# message=message))
# print('debug',message, code)
# if code in ['01', '02', '03', '04', '06', '09',
# '10', '11', '12', '15' ,'99','24','22']:
# code = '55'
# elif code in ['05','23']:
# code='54'
# else:
# code='91'
#
# self.setBit(62, message)
# self.ack(code[-2:], message)
# return
#
# if rows:
# invoice = 'result' in rows and rows['result']['data'] or None
# # self.set_profile(invoice)
# return invoice
# return
#
# elif self.get_invoice_id_structure():
# pass
# # q = DBSession.query(Payment).filter_by(
# # nomor_bayar=self.invoice_id['Nomor Bayar'],
# # nik=self.invoice_id['Nomor Identitas'])
# else:
# return
#
# 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.rpc['kd_biller']
# # todo: mustbe transaction_date_time
# pay.tgl = self.from_iso.get_transaction_date()
#
# if 'id' in self.conf:
# pay.bank_id = self.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)
# self.ack()
#
# ############
# # Reversal #
# ############
# def execute_reversal(self):
# self.invoice_id_raw = self.from_iso.get_invoice_id_raw()[:16].strip()
#
# if len(self.invoice_id_raw) == 16:
# data = self.get_data()
# data.update(
# dict(ntb=self.get_ntb(),
# tgl_transaksi=self.get_transaction_date().strftime('%Y%m%d'),
# jam_transaksi=self.get_transaction_time().strftime("%H%M%S"))
# )
# # penambahan parameters
# rows = self.send_rpc('reversal', data)
# if 'error' in rows:
# code = rows['error']['code']
# message = rows['error']['message']
# self.log_info('Nomor Bayar {nb} NIK {nik} kode = {code}, {message}'.format(
# nb=self.invoice_id['Nomor Bayar'],
# nik=self.invoice_id['Nomor Identitas'],
# code=code,
# message=message))
#
# self.setBit(62, message)
# self.ack(code, message)
# return
#
# if rows:
# row = 'result' in rows and rows['result']['data'] or None
# # self.set_profile(invoice)
# return row
# return
#
# elif self.get_invoice_id_structure():
# pass
# # q = DBSession.query(Payment).filter_by(
# # nomor_bayar=self.invoice_id['Nomor Bayar'],
# # nik=self.invoice_id['Nomor Identitas'])
# else:
# return
#
# return
#
# def reversal_response_(self):
# self.invoice_id_raw = self.from_iso.get_invoice_id_raw()[:16]
# ntb = self.from_iso.get_ntb()
# q = self.db_profile.query(models.IsoPayment).filter_by(
# invoice_no=self.invoice_id_raw[:16].strip(),
# # nik=self.invoice_id_raw[16:].strip(),
# ntb=ntb)
#
# pay = q.first()
# if not pay:
# return self.ack_payment_not_found()
#
# # self.invoice_id_raw = ''.join([self.invoice_profile['Nomor Bayar'].strip(),
# # self.invoice_profile['Nomor Identitas'].strip()])
# q = self.db_profile.query(models.IsoReversal).filter_by(id=pay.id)
# rev = q.first()
# if rev:
# return self.ack_reversal_done()
#
# result = self.execute_reversal()
#
# if not result:
# return
#
# return self.save_reversal(pay, result['ntp'])
#
# def reversal_response(self):
# self.reversal_response_()
# try:
# pass
# except:
# self.ack_other('Ada kesalahan yang belum dipahami.')
# f = StringIO()
# traceback.print_exc(file=f)
# self.log_error(f.getvalue())
# f.close()
#
# def save_reversal(self, pay, ntpd):
# rev = models.IsoReversal()
# rev.id = pay.id
# #rev.iso_request = self.from_iso.raw.upper()
#
# # todo: seharusnya trnsaction_date_time
# rev.tgl = self.from_iso.get_transaction_date()
# rev.ntp = ntpd
# self.db_profile.commit(rev)
# self.ack()
#
# ###################
# # Acknowledgement #
# ###################
# def ack_not_allowed(self):
# msg = ERR_INVALID_BANK.format(bank_id=self.from_iso.get_value(32))
# self.ack(RC_INVALID_NUMBER, msg)
#
# def ack_invalid_number(self):
# msg = ERR_INVALID_NUMBER.format(nik=self.invoice_id['Nomor Identitas'])
# # self.ack(RC_INVALID_NUMBER, msg)
# self.ack(RC_NOT_AVAILABLE, msg)
# self.set_error_msg(msg)
#
# def ack_invalid_number_2(self, invoice_id_raw):
# msg = ERR_INVALID_NUMBER_2.format(invoice_id=invoice_id_raw)
# # self.ack(RC_INVALID_NUMBER, msg)
# self.ack(RC_NOT_AVAILABLE, msg)
# self.set_error_msg(msg)
#
# def ack_not_available(self):
# msg = ERR_NOT_AVAILABLE.format(invoice_id=self.invoice_id_raw)
# self.ack(RC_NOT_AVAILABLE, msg)
#
# def ack_expire(self):
# msg = ERR_EXPIRE.format(invoice_id=self.invoice_id_raw)
# self.ack(RC_EXPIRE, msg)
#
# def ack_duplikasi_tgl_akhir_pajak(self):
# msg = ERR_DUPLIKASI_TGL_AKHIR_PAJAK.format(invoice_id=self.invoice_id_raw)
# self.ack(RC_DUPLIKASI_TGL_AKHIR_PAJAK, msg)
#
# def ack_invalid_channel(self):
# nomor_bayar = self.invoice_id['Nomor Bayar']
# channel_id = self.from_iso.get_channel_id()
# msg = ERR_INVALID_CHANNEL.format(nomor_bayar=nomor_bayar,
# channel_id=channel_id)
# self.ack_other(msg)
#
# def ack_invalid_nik(self, invoice):
# msg = ERR_INVALID_NIK.format(
# identitas_bank=self.invoice_id['Nomor Identitas'],
# identitas_pemprov=invoice['nik_nasabah'].strip())
# self.ack(RC_NOT_AVAILABLE, msg)
#
# def ack_inquiry_timeout(self):
# msg = ERR_INQUIRY_TIMEOUT.format(
# kd_bayar=self.invoice_id['Nomor Bayar'])
# self.ack_other(msg)
#
# def ack_already_paid(self):
# msg = ERR_ALREADY_PAID.format(invoice_id=self.invoice_id_raw)
# self.ack(RC_ALREADY_PAID)
#
# def ack_db_error(self, db_error):
# self.log_error(db_error)
# self.ack_other(ERR_DB)
#
# def ack_payment_timeout(self):
# kd_bayar = self.invoice_profile['Nomor Bayar']
# ntb = self.from_iso.get_ntb()
# msg = ERR_PAYMENT_TIMEOUT.format(kd_bayar=kd_bayar, ntb=ntb)
# self.ack_other(msg)
#
# def ack_payment_failed(self, result):
# kd_bayar = self.invoice_profile['Nomor Bayar']
# ntb = self.from_iso.get_ntb()
# msg = ERR_PAYMENT_FAILED.format(kd_bayar=kd_bayar, ntb=ntb,
# kd_status=result['kd_status'])
# self.ack_other(msg)
#
# def ack_payment_not_found(self):
# ntb = self.from_iso.get_ntb()
# msg = ERR_PAYMENT_NOT_FOUND.format(invoice_id=self.invoice_id_raw,
# ntb=ntb)
# self.ack(RC_NOT_AVAILABLE, msg)
#
# def ack_reversal_done(self):
# ntb = self.from_iso.get_ntb()
# msg = ERR_REVERSAL_DONE.format(invoice_id=self.invoice_id_raw,
# ntb=ntb)
# self.ack(RC_ALREADY_PAID, msg)
#
# def ack_reversal_timeout(self):
# kd_bayar = self.invoice_profile['Nomor Bayar']
# ntb = self.from_iso.get_ntb()
# msg = ERR_REVERSAL_TIMEOUT.format(kd_bayar=kd_bayar, ntb=ntb)
# self.ack_other(msg)
#
# def ack_reversal_failed(self, result):
# kd_bayar = self.invoice_profile['Nomor Bayar']
# ntb = self.from_iso.get_ntb()
# msg = ERR_REVERSAL_FAILED.format(kd_bayar=kd_bayar, ntb=ntb,
# kd_status=result['kd_status'])
# self.ack_other(msg)
...@@ -158,6 +158,7 @@ class Doc(Transaction): ...@@ -158,6 +158,7 @@ class Doc(Transaction):
invoice_id_raw = invoice_id_raw.ljust(16, ' ') invoice_id_raw = invoice_id_raw.ljust(16, ' ')
invoice_id_raw = invoice_id_raw.ljust(32, '0') invoice_id_raw = invoice_id_raw.ljust(32, '0')
# self.log_info(invoice_id_raw) # self.log_info(invoice_id_raw)
print(">>>DEBUG>>>", invoice_id_raw )
r = self.invoice_id.set_raw(invoice_id_raw) r = self.invoice_id.set_raw(invoice_id_raw)
if not r: if not r:
return self.ack_invalid_number_2(invoice_id_raw) return self.ack_invalid_number_2(invoice_id_raw)
...@@ -172,6 +173,7 @@ class Doc(Transaction): ...@@ -172,6 +173,7 @@ class Doc(Transaction):
return r return r
def get_data(self): def get_data(self):
print(self.mod_conf)
return dict(kd_bank=str(self.get_bank_id()).rjust(3, '0'), return dict(kd_bank=str(self.get_bank_id()).rjust(3, '0'),
kd_channel=self.from_iso.get_channel(), kd_channel=self.from_iso.get_channel(),
invoice_no=self.invoice_id_raw[:16], invoice_no=self.invoice_id_raw[:16],
......
...@@ -29,3 +29,7 @@ class Job(NetworkJob): ...@@ -29,3 +29,7 @@ class Job(NetworkJob):
iso = self.create_iso() iso = self.create_iso()
iso.reversal_request(p['data']) iso.reversal_request(p['data'])
return iso return iso
def on_receive_raw(self, raw):
self.echo_time = None
print('LEWAT', raw)
...@@ -201,6 +201,16 @@ class Transaction(BaseTransaction, Log): ...@@ -201,6 +201,16 @@ class Transaction(BaseTransaction, Log):
def get_bit_invoice_profile(self): def get_bit_invoice_profile(self):
return 61 return 61
def get_value(self, bit):
v = self.getBit(bit)
type_ = self.getBitType(bit)
return v
# if type_.find('LL') < 0:
# return v
# size_length = len(type_)
# return v[size_length:]
def get_invoice_id_raw(self): def get_invoice_id_raw(self):
return self.get_value(self.get_bit_invoice_profile()) return self.get_value(self.get_bit_invoice_profile())
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!