Skip to content
Toggle navigation
Projects
Groups
Snippets
Help
iso8583
/
bjb-samsat-banten
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit be1b2f74
authored
Apr 21, 2019
by
Solo Group
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
test 5 @ 500
1 parent
4245acc2
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
746 additions
and
549 deletions
README.rst
TODO.txt
contrib/client.py
contrib/client2.py
opensipkd/iso8583/bjb/samsat/banten/DbTransaction.py
opensipkd/iso8583/bjb/samsat/banten/doc.py
opensipkd/iso8583/bjb/samsat/banten/job.py
opensipkd/iso8583/bjb/samsat/transaction.py
README.rst
View file @
be1b2f7
...
...
@@ -46,6 +46,7 @@ Konfigurasi aplikasi terdapat pada section module::
samsat_banten_kd_produk = 5
samsat_banten_persen_denda = 0
samsat_banten_max_bln_denda = 0
samsat_banten_timeout = 0
Running:
...
...
@@ -54,23 +55,46 @@ Untuk menjalankan aplikasi ::
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):
# 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
env/bin/test-info-samsat-banten -c config_file -m module <option>
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
TODO.txt
0 → 100644
View file @
be1b2f7
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
contrib/client.py
0 → 100644
View file @
be1b2f7
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
(
'
\n
Bank 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
)
contrib/client2.py
0 → 100644
View file @
be1b2f7
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
)
opensipkd/iso8583/bjb/samsat/banten/DbTransaction.py
deleted
100644 → 0
View file @
4245acc
# 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)
opensipkd/iso8583/bjb/samsat/banten/doc.py
View file @
be1b2f7
...
...
@@ -158,6 +158,7 @@ class Doc(Transaction):
invoice_id_raw
=
invoice_id_raw
.
ljust
(
16
,
' '
)
invoice_id_raw
=
invoice_id_raw
.
ljust
(
32
,
'0'
)
# self.log_info(invoice_id_raw)
print
(
">>>DEBUG>>>"
,
invoice_id_raw
)
r
=
self
.
invoice_id
.
set_raw
(
invoice_id_raw
)
if
not
r
:
return
self
.
ack_invalid_number_2
(
invoice_id_raw
)
...
...
@@ -172,6 +173,7 @@ class Doc(Transaction):
return
r
def
get_data
(
self
):
print
(
self
.
mod_conf
)
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
],
...
...
opensipkd/iso8583/bjb/samsat/banten/job.py
View file @
be1b2f7
...
...
@@ -29,3 +29,7 @@ class Job(NetworkJob):
iso
=
self
.
create_iso
()
iso
.
reversal_request
(
p
[
'data'
])
return
iso
def
on_receive_raw
(
self
,
raw
):
self
.
echo_time
=
None
print
(
'LEWAT'
,
raw
)
opensipkd/iso8583/bjb/samsat/transaction.py
View file @
be1b2f7
...
...
@@ -201,6 +201,16 @@ class Transaction(BaseTransaction, Log):
def
get_bit_invoice_profile
(
self
):
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
):
return
self
.
get_value
(
self
.
get_bit_invoice_profile
())
...
...
Write
Preview
Markdown
is supported
Attach a file
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to post a comment