Skip to content
Toggle navigation
Projects
Groups
Snippets
Help
Owo Sugiana
/
payment-report
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 448b4353
authored
Apr 30, 2021
by
Owo Sugiana
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
Tambah pospbb
1 parent
d5030564
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
281 additions
and
12 deletions
.gitignore
CHANGES.txt
payment_report/models.py
payment_report/scripts/common.py
payment_report/scripts/data/conf.csv
payment_report/scripts/pbb.py
payment_report/scripts/pospbb.py
setup.py
.gitignore
View file @
448b435
test*
*egg-info
*__pycache__
build
CHANGES.txt
View file @
448b435
0.1.3 29-4-2021
---------------
- Tambah pospbb
- Tambah opsi --update-from-id dan --update-from-date
- Perbaikan channel
0.1.2 13-4-2021
---------------
- Penambahan models pada konfigurasi PBB yang berisi nama modul untuk ORM Sppt
...
...
payment_report/models.py
View file @
448b435
...
...
@@ -15,7 +15,14 @@ from sqlalchemy.ext.declarative import declarative_base
Base
=
declarative_base
()
class
Pad
(
Base
):
class
Common
:
def
from_dict
(
self
,
values
):
for
column
in
self
.
__table__
.
columns
:
if
column
.
name
in
values
:
setattr
(
self
,
column
.
name
,
values
[
column
.
name
])
class
Pad
(
Base
,
Common
):
__tablename__
=
'pad_report'
id
=
Column
(
Integer
,
primary_key
=
True
)
# Bit 11
...
...
@@ -53,7 +60,7 @@ class Pad(Base):
)
class
Bphtb
(
Base
):
class
Bphtb
(
Base
,
Common
):
__tablename__
=
'bphtb_report'
id
=
Column
(
Integer
,
primary_key
=
True
)
# Bit 11
...
...
@@ -97,7 +104,7 @@ class Bphtb(Base):
)
class
Pbb
(
Base
):
class
Pbb
(
Base
,
Common
):
__tablename__
=
'pbb_report'
id
=
Column
(
Integer
,
primary_key
=
True
)
# Bit 11
...
...
@@ -128,6 +135,8 @@ class Pbb(Base):
jml_sppt_yg_dibayar
=
Column
(
BigInteger
,
nullable
=
False
)
# Field pembayaran_sppt.denda_sppt
denda_sppt
=
Column
(
BigInteger
,
nullable
=
False
)
# Field pembayaran_sppt.discount
discount
=
Column
(
BigInteger
,
nullable
=
False
)
# Bit 7 / Transmission Date Inquiry
tgl_inquiry
=
Column
(
DateTime
(
timezone
=
True
),
nullable
=
False
)
# Bit 7 / Transmission Date
...
...
payment_report/scripts/common.py
View file @
448b435
...
...
@@ -30,8 +30,9 @@ BIT_18_NAMES = {
'6014'
:
'INTERNETBANKING'
,
'6015'
:
'KIOSK'
,
'6016'
:
'AUTODEBET'
,
'6017'
:
'MOBILBANKING'
,
'7012'
:
'PTPOS'
}
'6017'
:
'MOBILBANKING'
}
BIT_43_NAMES
=
(
'INDOMARET'
,
'ALFAMART'
,
'LINKAJA'
,
'GOPAY'
,
'EMONEY'
,
'PTPOS'
)
my_registry
=
dict
()
...
...
@@ -77,11 +78,15 @@ def get_iso(raw, iso_class, debug=False):
iso
.
setIsoContent
(
raw
)
return
iso
def
get_channel_name
(
bit_018
,
bit_041
,
bit_042
,
bit_043
):
bit_018
=
bit_018
.
strip
()
bit_041
=
bit_041
.
strip
()
bit_042
=
bit_042
.
strip
()
bit_043
=
bit_043
.
strip
()
for
name
in
BIT_43_NAMES
:
if
bit_043
.
find
(
name
)
>
-
1
:
return
name
if
bit_018
in
BIT_18_NAMES
:
return
BIT_18_NAMES
[
bit_018
]
if
bit_018
!=
'6025'
:
...
...
@@ -90,8 +95,6 @@ def get_channel_name(bit_018, bit_041, bit_042, bit_043):
return
bit_042
if
bit_042
==
'NG'
:
return
bit_041
if
bit_043
in
(
'INDOMARET'
,
'ALFAMART'
,
'LINKAJA'
,
'GOPAY'
):
return
bit_043
return
'LAINNYA'
...
...
@@ -130,6 +133,8 @@ def create_log(log_file):
def
get_parser
():
pars
=
ArgumentParser
()
pars
.
add_argument
(
'conf'
)
pars
.
add_argument
(
'--update-from-id'
,
type
=
int
)
pars
.
add_argument
(
'--update-from-date'
)
pars
.
add_argument
(
'--debug'
,
action
=
'store_true'
)
pars
.
add_argument
(
'--debug-sql'
,
action
=
'store_true'
)
return
pars
...
...
payment_report/scripts/data/conf.csv
View file @
448b435
...
...
@@ -9,3 +9,4 @@ pbb payment last id,0,inquiry.id terakhir yang diproses
pbb reversal last date,1-1-2000 00:00:00,reversal.tgl terakhir yang diproses
pbb2 payment last id,0,log_iso.id terakhir yang diproses
pbb2 reversal last id,0,log_iso.id terakhir yang diproses
pospbb last id,0,pembayaran_sppt.id terakhir yang diproses
payment_report/scripts/pbb.py
View file @
448b435
...
...
@@ -8,6 +8,7 @@ from opensipkd.string import (
from
opensipkd.waktu
import
(
dmyhms
,
create_datetime
,
date_from_str
,
)
from
sismiop.services.base
import
get_db_session
from
opensipkd.iso8583.bjb.scripts.common
import
get_module_object
...
...
@@ -106,8 +107,8 @@ class App(BaseApp):
thn_pajak_sppt
=
psppt
.
thn_pajak_sppt
)
return
q
.
first
()
def
__get_query_iso
(
self
,
last
):
q_iso
=
self
.
base_q_iso
.
filter
(
self
.
iso_inquiry_orm
.
id
>
last
.
as_int
()
)
def
__get_query_iso
(
self
,
last
_id
):
q_iso
=
self
.
base_q_iso
.
filter
(
self
.
iso_inquiry_orm
.
id
>
last
_id
)
return
q_iso
.
order_by
(
self
.
iso_inquiry_orm
.
id
)
def
__log_not_found
(
self
,
s_tgl
,
d
):
...
...
@@ -122,7 +123,7 @@ class App(BaseApp):
def
__run_payment
(
self
):
last
=
self
.
get_last_id
(
'pbb payment last id'
)
q_iso
=
self
.
__get_query_iso
(
last
)
q_iso
=
self
.
__get_query_iso
(
last
.
as_int
()
)
found
=
False
for
row_pay
,
row_inq
in
q_iso
.
limit
(
1000
):
iso
=
get_iso
(
row_pay
.
iso_request
,
Doc
,
self
.
option
.
debug
)
...
...
@@ -154,7 +155,7 @@ class App(BaseApp):
channel_kode
=
iso
.
get_channel
()
.
strip
(),
channel_nama
=
d
[
'channel'
],
user_id
=
user_id
,
pbb_yg_harus_dibayar_sppt
=
sppt
.
pbb_yg_harus_dibayar_sppt
,
tgl_inquiry
=
row_inq
.
tgl
)
tgl_inquiry
=
row_inq
.
tgl
,
discount
=
psppt
.
discount
)
last
.
nilai
=
str
(
row_inq
.
id
)
with
transaction
.
manager
:
self
.
rpt_session
.
add
(
rpt
)
...
...
@@ -162,9 +163,64 @@ class App(BaseApp):
found
=
True
return
found
def
__update_from_id
(
self
):
q_iso
=
self
.
__get_query_iso
(
self
.
last_id
)
found
=
False
for
row_pay
,
row_inq
in
q_iso
.
limit
(
1000
):
iso
=
get_iso
(
row_pay
.
iso_request
,
Doc
,
self
.
option
.
debug
)
d
=
get_keys
(
iso
)
tgl_bayar
=
get_tgl_bayar
(
iso
,
row_inq
.
tgl
.
year
)
s_tgl
=
dmyhms
(
tgl_bayar
)
psppt
=
self
.
get_psppt
(
row_pay
)
if
not
psppt
:
self
.
__log_not_found
(
s_tgl
,
d
)
continue
sppt
=
self
.
get_sppt
(
psppt
)
nama_wp
=
get_nama_wp
(
iso
,
sppt
)
user_id
=
get_user_id
(
iso
)
self
.
__log_progress
(
s_tgl
,
d
)
d
=
dict
(
stan
=
d
[
'stan'
],
ntb
=
d
[
'ntb'
],
kd_propinsi
=
psppt
.
kd_propinsi
,
kd_dati2
=
psppt
.
kd_dati2
,
kd_kecamatan
=
psppt
.
kd_kecamatan
,
kd_kelurahan
=
psppt
.
kd_kelurahan
,
kd_blok
=
psppt
.
kd_blok
,
no_urut
=
psppt
.
no_urut
,
kd_jns_op
=
psppt
.
kd_jns_op
,
thn_pajak_sppt
=
psppt
.
thn_pajak_sppt
,
pembayaran_sppt_ke
=
psppt
.
pembayaran_sppt_ke
,
jml_sppt_yg_dibayar
=
iso
.
get_amount
(),
denda_sppt
=
psppt
.
denda_sppt
,
tgl_pembayaran_sppt
=
tgl_bayar
.
date
(),
tgl_rekam_byr_sppt
=
tgl_bayar
,
nm_wp_sppt
=
nama_wp
,
channel_kode
=
iso
.
get_channel
()
.
strip
(),
channel_nama
=
d
[
'channel'
],
user_id
=
user_id
,
pbb_yg_harus_dibayar_sppt
=
sppt
.
pbb_yg_harus_dibayar_sppt
,
tgl_inquiry
=
row_inq
.
tgl
,
discount
=
psppt
.
discount
)
rpt
=
self
.
get_report
(
iso
)
if
not
rpt
:
rpt
=
Pbb
()
rpt
.
from_dict
(
d
)
with
transaction
.
manager
:
self
.
rpt_session
.
add
(
rpt
)
found
=
True
self
.
last_id
=
row_inq
.
id
return
found
def
run_payment
(
self
):
# Override
if
self
.
option
.
update_from_id
:
self
.
last_id
=
self
.
option
.
update_from_id
func
=
self
.
__update_from_id
elif
self
.
option
.
update_from_date
:
tgl
=
date_from_str
(
self
.
option
.
update_from_date
)
q
=
self
.
prod_session
.
query
(
self
.
iso_inquiry_orm
)
.
filter
(
self
.
iso_inquiry_orm
.
tgl
>=
tgl
)
.
order_by
(
self
.
iso_inquiry_orm
.
id
)
row
=
q
.
first
()
self
.
last_id
=
row
.
id
-
1
func
=
self
.
__update_from_id
else
:
func
=
self
.
__run_payment
while
True
:
found
=
self
.
__run_payment
()
found
=
func
()
if
not
found
:
break
...
...
payment_report/scripts/pospbb.py
0 → 100644
View file @
448b435
import
sys
from
sqlalchemy
import
(
Column
,
Integer
,
)
import
transaction
from
opensipkd.waktu
import
(
dmyhms
,
create_datetime
,
date_from_str
,
)
from
sismiop.models.default
import
PembayaranSppt
as
BasePsppt
from
sismiop.services.base
import
(
get_db_session
,
get_id
,
)
from
opensipkd.iso8583.bjb.scripts.common
import
get_module_object
from
..models
import
Pbb
from
.common
import
(
get_iso
,
get_keys
,
BaseApp
,
)
NIP_PENCATAT
=
'888888888'
CHANNEL_KODE
=
'7000'
CHANNEL_NAMA
=
'POSPBB'
ERR_NOT_FOUND
=
'SPPT ID {invoice_id} tidak ada di sppt'
class
PembayaranSppt
(
BasePsppt
):
__table_args__
=
dict
(
extend_existing
=
True
)
id
=
Column
(
Integer
,
nullable
=
False
)
user_id
=
Column
(
Integer
)
def
get_tgl_bayar
(
row
):
t
=
row
.
tgl_rekam_byr_sppt
return
create_datetime
(
t
.
year
,
t
.
month
,
t
.
day
,
t
.
hour
,
t
.
minute
,
t
.
second
)
class
App
(
BaseApp
):
report_orm
=
Pbb
def
__init__
(
self
,
argv
):
super
()
.
__init__
(
argv
)
if
not
self
.
pid
:
return
self
.
models
=
get_module_object
(
self
.
conf
[
'models'
])
self
.
Sppt
=
self
.
models
.
Sppt
self
.
base_q_psppt
=
self
.
prod_session
.
query
(
PembayaranSppt
)
.
filter_by
(
nip_rekam_byr_sppt
=
NIP_PENCATAT
)
self
.
base_q_sppt
=
self
.
prod_session
.
query
(
self
.
Sppt
)
def
get_db_session
(
self
):
# Override
return
get_db_session
()
def
get_sppt
(
self
,
psppt
):
q
=
self
.
base_q_sppt
.
filter_by
(
kd_propinsi
=
psppt
.
kd_propinsi
,
kd_dati2
=
psppt
.
kd_dati2
,
kd_kecamatan
=
psppt
.
kd_kecamatan
,
kd_kelurahan
=
psppt
.
kd_kelurahan
,
kd_blok
=
psppt
.
kd_blok
,
no_urut
=
psppt
.
no_urut
,
kd_jns_op
=
psppt
.
kd_jns_op
,
thn_pajak_sppt
=
psppt
.
thn_pajak_sppt
)
return
q
.
first
()
def
__get_query_psppt
(
self
,
last_id
):
q
=
self
.
base_q_psppt
.
filter
(
PembayaranSppt
.
id
>
last_id
)
return
q
.
order_by
(
PembayaranSppt
.
id
)
def
__log_not_found
(
self
,
sppt_id
):
msg
=
ERR_NOT_FOUND
.
format
(
invoice_id
=
sppt_id
)
self
.
log
.
error
(
msg
)
def
__log_progress
(
self
,
row
,
sppt_id
):
s_tgl
=
dmyhms
(
row
.
tgl_rekam_byr_sppt
)
self
.
log
.
info
(
f
'Tgl bayar {s_tgl}, Nomor bayar {sppt_id}, '
f
'pembayaran ke {row.pembayaran_sppt_ke}, ID {row.id}, '
f
'jml_sppt_yg_dibayar {row.jml_sppt_yg_dibayar}'
)
def
__run_payment
(
self
):
last
=
self
.
get_last_id
(
'pospbb last id'
)
q_psppt
=
self
.
__get_query_psppt
(
last
.
as_int
())
found
=
False
for
psppt
in
q_psppt
.
limit
(
1000
):
stan
=
psppt
.
tgl_pembayaran_sppt
.
strftime
(
'
%
y
%
m
%
d'
)
ntb
=
f
'POSPBB-{psppt.id}'
if
self
.
get_report
(
stan
,
ntb
):
continue
sppt_id
=
get_id
(
psppt
)
sppt
=
self
.
get_sppt
(
psppt
)
if
not
sppt
:
self
.
__log_not_found
(
sppt_id
)
continue
tgl_bayar
=
get_tgl_bayar
(
psppt
)
user_id
=
str
(
psppt
.
user_id
)
disc
=
psppt
.
discount
or
0
self
.
__log_progress
(
psppt
,
sppt_id
)
rpt
=
Pbb
(
stan
=
stan
,
ntb
=
ntb
,
kd_propinsi
=
psppt
.
kd_propinsi
,
kd_dati2
=
psppt
.
kd_dati2
,
kd_kecamatan
=
psppt
.
kd_kecamatan
,
kd_kelurahan
=
psppt
.
kd_kelurahan
,
kd_blok
=
psppt
.
kd_blok
,
no_urut
=
psppt
.
no_urut
,
kd_jns_op
=
psppt
.
kd_jns_op
,
thn_pajak_sppt
=
psppt
.
thn_pajak_sppt
,
pembayaran_sppt_ke
=
psppt
.
pembayaran_sppt_ke
,
jml_sppt_yg_dibayar
=
psppt
.
jml_sppt_yg_dibayar
,
denda_sppt
=
psppt
.
denda_sppt
,
tgl_pembayaran_sppt
=
psppt
.
tgl_pembayaran_sppt
,
tgl_rekam_byr_sppt
=
psppt
.
tgl_rekam_byr_sppt
,
nm_wp_sppt
=
sppt
.
nm_wp_sppt
,
channel_kode
=
CHANNEL_KODE
,
channel_nama
=
CHANNEL_NAMA
,
user_id
=
user_id
,
pbb_yg_harus_dibayar_sppt
=
sppt
.
pbb_yg_harus_dibayar_sppt
,
tgl_inquiry
=
tgl_bayar
,
discount
=
disc
)
last
.
nilai
=
str
(
psppt
.
id
)
with
transaction
.
manager
:
self
.
rpt_session
.
add
(
rpt
)
self
.
rpt_session
.
add
(
last
)
found
=
True
return
found
def
__update_from_id
(
self
):
q_psppt
=
self
.
__get_query_psppt
(
self
.
last_id
)
found
=
False
for
psppt
in
q_psppt
.
limit
(
1000
):
sppt_id
=
get_id
(
psppt
)
sppt
=
self
.
get_sppt
(
psppt
)
if
not
sppt
:
self
.
__log_not_found
(
sppt_id
)
continue
stan
=
psppt
.
tgl_pembayaran_sppt
.
strftime
(
'
%
y
%
m
%
d'
)
ntb
=
f
'POSPBB-{psppt.id}'
tgl_bayar
=
get_tgl_bayar
(
psppt
)
user_id
=
str
(
psppt
.
user_id
)
disc
=
psppt
.
discount
or
0
rpt
=
self
.
get_report
(
stan
,
ntb
)
if
not
rpt
:
rpt
=
Pbb
()
self
.
__log_progress
(
psppt
,
sppt_id
)
d
=
dict
(
stan
=
stan
,
ntb
=
ntb
,
kd_propinsi
=
psppt
.
kd_propinsi
,
kd_dati2
=
psppt
.
kd_dati2
,
kd_kecamatan
=
psppt
.
kd_kecamatan
,
kd_kelurahan
=
psppt
.
kd_kelurahan
,
kd_blok
=
psppt
.
kd_blok
,
no_urut
=
psppt
.
no_urut
,
kd_jns_op
=
psppt
.
kd_jns_op
,
thn_pajak_sppt
=
psppt
.
thn_pajak_sppt
,
pembayaran_sppt_ke
=
psppt
.
pembayaran_sppt_ke
,
jml_sppt_yg_dibayar
=
psppt
.
jml_sppt_yg_dibayar
,
denda_sppt
=
psppt
.
denda_sppt
,
tgl_pembayaran_sppt
=
psppt
.
tgl_pembayaran_sppt
,
tgl_rekam_byr_sppt
=
psppt
.
tgl_rekam_byr_sppt
,
nm_wp_sppt
=
sppt
.
nm_wp_sppt
,
channel_kode
=
CHANNEL_KODE
,
channel_nama
=
CHANNEL_NAMA
,
user_id
=
user_id
,
pbb_yg_harus_dibayar_sppt
=
sppt
.
pbb_yg_harus_dibayar_sppt
,
tgl_inquiry
=
tgl_bayar
,
discount
=
disc
)
rpt
.
from_dict
(
d
)
with
transaction
.
manager
:
self
.
rpt_session
.
add
(
rpt
)
found
=
True
self
.
last_id
=
psppt
.
id
return
found
def
run_payment
(
self
):
# Override
if
self
.
option
.
update_from_id
:
self
.
last_id
=
self
.
option
.
update_from_id
func
=
self
.
__update_from_id
elif
self
.
option
.
update_from_date
:
tgl
=
date_from_str
(
self
.
option
.
update_from_date
)
q
=
self
.
prod_session
.
query
(
PembayaranSppt
)
.
filter
(
PembayaranSppt
.
tgl_rekam_byr_sppt
>=
tgl
)
.
order_by
(
PembayaranSppt
.
tgl_rekam_byr_sppt
)
row
=
q
.
first
()
self
.
last_id
=
row
.
id
-
1
func
=
self
.
__update_from_id
else
:
func
=
self
.
__run_payment
while
True
:
found
=
func
()
if
not
found
:
break
def
main
(
argv
=
sys
.
argv
[
1
:]):
app
=
App
(
argv
)
app
.
run
()
setup.py
View file @
448b435
...
...
@@ -36,6 +36,7 @@ setup(
'console_scripts'
:
[
'payment_report_init_db = payment_report.scripts.common:init_db'
,
'pbb_report = payment_report.scripts.pbb:main'
,
'pospbb_report = payment_report.scripts.pospbb:main'
,
'bphtb_report = payment_report.scripts.bphtb:main'
,
'bphtb2_report = payment_report.scripts.bphtb2:main'
,
'pad_report = payment_report.scripts.pad:main'
,
...
...
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