Commit 52f3dfea by Owo Sugiana

Kali pertama

0 parents
*egg-info
build
dist
__pycache__
*.pyc
test*
0.1 7-12-2020
-------------
- Kali pertama
Transaksi Melalui Webservice Kabupaten Bogor
============================================
Ini adalah struktur data serta berbagai fungsi untuk transaksi ke Kabupaten
Bogor.
File mode changed
from pprint import pprint
import requests
from .structure import (
INQUIRY_PATH,
PAYMENT_PATH,
REVERSAL_PATH,
KODE_IZIN,
)
class WebClient:
def __init__(
self, base_url, username, password, debug=False, ssl_verify=True):
self.inquiry_url_tpl = '/'.join([base_url, INQUIRY_PATH])
self.payment_url_tpl = '/'.join([base_url, PAYMENT_PATH])
self.reversal_url_tpl = '/'.join([base_url, REVERSAL_PATH])
self.username = username
self.password = password
self.debug = debug
self.ssl_verify = ssl_verify
def send(self, url):
self.debug_info(f'Request to {url}')
r = requests.get(url, timeout=15, verify=self.ssl_verify)
self.debug_info(f'Response:')
self.debug_info(r.text)
return r.json()
def inquiry(self, invoice_id):
url = self.inquiry_url_tpl.format(
username=self.username, password=self.password,
invoice_id=invoice_id)
return self.send(url)
def payment(self, invoice_id, ntb, nominal):
url = self.payment_url_tpl.format(
username=self.username, password=self.password,
invoice_id=invoice_id, ntb=ntb, nominal=nominal)
return self.send(url)
def reversal(self, invoice_id, ntb):
url = self.reversal_url_tpl.format(
username=self.username, password=self.password,
invoice_id=invoice_id, ntb=ntb)
return self.send(url)
def debug_info(self, msg):
if not self.debug:
return
if isinstance(msg, dict):
pprint(msg)
else:
print(msg)
class Inquiry(WebClient):
def __init__(
self, base_url, username, password, invoice_id, debug=False,
do_inquiry=True):
super().__init__(base_url, username, password, debug, False)
self.invoice_id = invoice_id
self.invoice = None
if do_inquiry:
self.do_inquiry()
def do_inquiry(self):
self.resp = self.inquiry(self.invoice_id)
if self.resp['code'] in ('01', '02'):
self.invoice = self.resp['data'][0]
self.tagihan = self.invoice['tagihan_skrd']
self.denda = self.invoice['tagihan_denda']
self.total = self.invoice['total']
def kode_izin(self):
return KODE_IZIN[self.invoice['kode_izin']]
def nama_izin(self):
return self.invoice['jenis_izin']
def jenis_layanan(self):
return self.invoice['tipe_permohonan']
def nomor_resi(self):
return self.invoice['nomor_resi']
def nama_wp(self):
return self.invoice['perusahaan']
def lokasi(self):
return self.invoice['lokasi']
def tagihan(self):
return self.invoice['tagihan_skrd']
def denda(self):
return self.invoice['tagihan_denda']
def ntp(self):
return self.payment['ntp']
def do_payment(self, ntb): # Digunakan opensipkd-iso8583-bjb
resp = self.payment(self.invoice_id, ntb, self.total)
if resp['code'] in ('01', '02'):
self.payment = resp['data'][0]
return resp
def do_reversal(self, ntb): # Digunakan opensipkd-iso8583-bjb
return self.reversal(self.invoice_id, ntb)
# https://docs.google.com/document/d/1EGnx1FnOur8qsT5ZI5h9VIstIXDCfpBQBWGa9u3ilag/edit
INQUIRY_PATH = 'ext_bjb_inq/{username}/{password}/{invoice_id}'
PAYMENT_PATH = 'ext_bjb_pay/{username}/{password}/{invoice_id}/{ntb}/{nominal}'
REVERSAL_PATH = 'ext_bjb_rev/{username}/{password}/{invoice_id}/{ntb}'
KODE_IZIN = {
'IMBG': 1, # Izin Mendirikan Bangunan dan Gedung
'DAMIJA': 3, # Daerah Milik Jalan
'RUMIJA': 3, # Ruang Milik Jalan
'IPPOHON': 4, # Izin Penebangan Pohon
'IPRTH': 5, # Izin Pemakaian Ruang Terbuka Hijau
}
RC_INVALID_USER = '00'
RC_OK = '01'
RC_INVOICE_NOT_FOUND = '03'
RC_ALREADY_PAID = '05'
RC_INVALID_AMOUNT = '07'
RC_PAYMENT_NOT_FOUND = '08'
RC_OK_BERDENDA = '02'
RC_INVALID_SKRD = '04'
RC_IZIN_DITOLAK = '06'
ERR_INVALID_USER = 'User tidak ditemukan'
ERR_INVOICE_NOT_FOUND = 'Tagihan tidak ditemukan'
ERR_ALREADY_PAID = 'Tagihan sudah lunas'
ERR_INVALID_AMOUNT = 'Nilai pembayaran berbeda dengan tagihan'
ERR_PAYMENT_NOT_FOUND = 'Pembayaran tidak ditemukan'
ERR_INVALID_SKRD = 'SKRD belum diterbitkan'
ERR_IZIN_DITOLAK = 'Izin ditolak'
import sys
from argparse import ArgumentParser
from configparser import ConfigParser
from pprint import pprint
from datetime import datetime
from opensipkd.string.money import thousand
from ..perizinan import Inquiry
default_base_url = 'https://dtoptimis.bogorkab.go.id/api/v2/intg'
help_base_url = 'default ' + default_base_url
def get_option(argv):
parser = ArgumentParser()
parser.add_argument('conf')
parser.add_argument('--invoice-id', required=True)
parser.add_argument('--payment', action='store_true')
parser.add_argument('--reversal', action='store_true')
parser.add_argument('--ntb')
parser.add_argument('--debug', action='store_true')
return parser.parse_args(argv)
def show(label, value):
print(f'{label}: {value}')
def show_money(label, value):
v = thousand(value)
s = f'Rp {v}'
show(label, s)
def error(s):
print(s)
sys.exit()
def main(argv=sys.argv[1:]):
option = get_option(argv)
conf = ConfigParser()
conf.read(option.conf)
do_inquiry = not option.reversal
inq = Inquiry(
conf.get('main', 'base_url'), conf.get('main', 'username'),
conf.get('main', 'password'), option.invoice_id, option.debug,
do_inquiry=do_inquiry)
if do_inquiry:
if not inq.invoice:
error(inq.resp)
if option.debug:
pprint(inq.resp)
show('Nama Izin', inq.nama_izin())
show('Kode Izin', inq.kode_izin())
show('Jenis Layanan', inq.jenis_layanan())
show('No Resi', inq.nomor_resi())
show('Pemohon', inq.nama_wp())
show('Lokasi', inq.lokasi())
show_money('Tagihan', inq.tagihan)
show_money('Denda', inq.denda)
show_money('Total', inq.total)
if option.payment:
if option.ntb:
ntb = option.ntb
else:
ntb = datetime.now().strftime('%Y%m%d%H%M%S')
r = inq.do_payment(ntb)
print('Payment Response:')
pprint(r)
show('NTP', inq.ntp())
elif option.reversal:
if not option.ntb:
error('--ntb harus diisi')
r = inq.do_reversal(option.ntb)
print('Reversal Response:')
pprint(r)
INQ_RESP = \
{'code': '01',
'data': [{'jenis_izin': 'Izin Mendirikan Bangunan Gedung',
'kecamatan': 'LEUWISADENG',
'kelurahan': 'SIBANTENG',
'kode_izin': 'IMBG',
'lokasi': 'Jl bangka RT03/07 No.20',
'no_denda': '',
'no_skrd': '225566',
'nomor_resi': '661066254600',
'pemohon': 'drgdfg',
'perusahaan': 'MUHAMAD FAUZI ALI',
'tagihan_denda': 0,
'tagihan_skrd': 221000000,
'tgl_denda': '2020-07-07',
'tgl_skrd': '2020-08-10',
'tipe_permohonan': 'Usaha/Perumahan Induk',
'total': 221000000}],
'msg': 'sukses'}
PAY_RESP = \
{'code': '01',
'data': [{'jam': '12:45:30',
'jenis_izin': 'Izin Mendirikan Bangunan Gedung',
'kecamatan': 'LEUWISADENG',
'kelurahan': 'SIBANTENG',
'kode_izin': 'IMBG',
'lokasi': 'Jl bangka RT03/07 No.20',
'no_denda': '',
'no_skrd': '225566',
'nomor_resi': '661066254600',
'ntb': '20201202120441',
'ntp': '98c36f1fbe03d240abbb7a2becb31b83',
'pemohon': 'drgdfg',
'perusahaan': 'MUHAMAD FAUZI ALI',
'tagihan_denda': 0,
'tagihan_skrd': 221000000,
'tgl': '02-12-2020',
'tgl_denda': '2020-07-07',
'tgl_skrd': '2020-08-10',
'tipe_permohonan': 'Usaha/Perumahan Induk',
'total': 221000000}],
'msg': 'sukses'}
REV_RESP = \
{'code': '01',
'data': [{'jam': '12:45:30',
'jenis_izin': 'Izin Mendirikan Bangunan Gedung',
'kecamatan': 'LEUWISADENG',
'kelurahan': 'SIBANTENG',
'kode_izin': 'IMBG',
'lokasi': 'Jl bangka RT03/07 No.20',
'no_denda': '',
'no_skrd': '225566',
'nomor_resi': '661066254600',
'ntb': '20201202120441',
'ntp': '98c36f1fbe03d240abbb7a2becb31b83',
'pemohon': 'drgdfg',
'perusahaan': 'MUHAMAD FAUZI ALI',
'tagihan_denda': 0,
'tagihan_skrd': 221000000,
'tgl': '02-12-2020',
'tgl_denda': '2020-07-07',
'tgl_skrd': '2020-08-10',
'tipe_permohonan': 'Usaha/Perumahan Induk',
'total': 221000000}],
'msg': 'sukses'}
from pprint import pprint
from datetime import datetime
from hashlib import md5
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.view import view_config
from resp_test import (
INQ_RESP,
PAY_RESP,
REV_RESP,
)
BASE_PATH = '/api/v2/intg'
INQUIRY_PATH = '/'.join([
BASE_PATH,
'ext_bjb_inq/{username}/{password}/{invoice_id}'])
PAYMENT_PATH = '/'.join([
BASE_PATH,
'ext_bjb_pay/{username}/{password}/{invoice_id}/{ntb}/{nominal}'])
REVERSAL_PATH = '/'.join([
BASE_PATH,
'ext_bjb_rev/{username}/{password}/{invoice_id}/{ntb}'])
def send(r):
print('Response:')
pprint(r)
return r
def create_ntp():
ntp = datetime.now().strftime('%Y%m%d%H%M%S')
return md5(ntp.encode('utf-8')).hexdigest()
@view_config(renderer='json', route_name='inquiry')
def view_inquiry(request):
resp = dict(INQ_RESP)
resp['data'][0]['nomor_resi'] = request.matchdict['invoice_id']
return send(resp)
@view_config(renderer='json', route_name='payment')
def view_payment(request):
ntp = create_ntp()
waktu = datetime.now()
resp = dict(PAY_RESP)
resp['data'][0]['tgl'] = waktu.strftime('%d-%m-%Y')
resp['data'][0]['jam'] = waktu.strftime('%H:%M:%S')
resp['data'][0]['nomor_resi'] = request.matchdict['invoice_id']
resp['data'][0]['ntb'] = request.matchdict['ntb']
resp['data'][0]['ntp'] = ntp
return send(resp)
@view_config(renderer='json', route_name='reversal')
def view_reversal(request):
waktu = datetime.now()
resp = dict(REV_RESP)
resp['data'][0]['tgl'] = waktu.strftime('%d-%m-%Y')
resp['data'][0]['jam'] = waktu.strftime('%H:%M:%S')
resp['data'][0]['ntb'] = request.matchdict['ntb']
return send(resp)
with Configurator() as config:
config.add_route('inquiry', INQUIRY_PATH)
config.add_route('payment', PAYMENT_PATH)
config.add_route('reversal', REVERSAL_PATH)
config.scan()
app = config.make_wsgi_app()
server = make_server('0.0.0.0', 8080, app)
server.serve_forever()
[main]
base_url = http://localhost:8080/api/v2/intg
username = test
password = 1234
import os
from setuptools import (
setup,
find_packages,
)
here = os.path.abspath(os.path.dirname(__file__))
with open(os.path.join(here, 'README.rst')) as f:
README = f.read()
with open(os.path.join(here, 'CHANGES.txt')) as f:
CHANGES = f.read()
line = CHANGES.splitlines()[0]
version = line.split()[0]
requires = [
'requests',
]
setup(
name='bogor-kab-web-service',
version=version,
description='Struktur dan fungsi untuk transaksi melalui web service '
'Kabupaten Bogor',
long_description=README + '\n\n' + CHANGES,
author='Owo Sugiana',
author_email='sugiana@gmail.com',
license='PostgreSQL License',
packages=find_packages(),
install_requires=requires,
zip_safe=False,
entry_points={
'console_scripts': [
'bogor_kab_perizinan = bogor_kab.scripts.perizinan:main',
]
}
)
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!