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 3cb16c61
authored
Jul 19, 2022
by
Owo Sugiana
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
DB schema BPHTB yang lebih fleksibel
1 parent
9a47ec7e
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
203 additions
and
267 deletions
CHANGES.txt
README.rst
pad.ini
payment_report/scripts/bphtb.py
payment_report/scripts/data/conf.csv
payment_report/scripts/pad.py
payment_report/scripts/pad_json.py
payment_report/scripts/pbb.py
CHANGES.txt
View file @
3cb16c6
2.0 2022-07-1
7
2.0 2022-07-1
8
--------------
- Perbedaan utama dari versi 0.x adalah kini berangkat dari tabel aslinya dan
bukan dari tabel ISO8583 karena sudah memperhatikan channel MANUAL (input
...
...
README.rst
View file @
3cb16c6
...
...
@@ -11,6 +11,7 @@ Pasang paket yang dibutuhkan::
$ ~/env/bin/pip install wheel
$ ~/env/bin/pip install ebcdic
$ ~/env/bin/pip install git+https://git.opensipkd.com/sugiana/opensipkd-iso8583-bjb.git
$ ~/env/bin/pip install git+https://git.opensipkd.com/sugiana/opensipkd-iso8583-multi.git
Lalu pasang paket ini::
...
...
@@ -35,23 +36,28 @@ diperlukan user ``report``::
GRANT SELECT ON pad_payment TO report;
GRANT SELECT ON pad_reversal TO report;
Lalu buat file konfigurasi bernama ``pad.ini``::
Lalu buat file konfigurasi bernama ``pad
-report
.ini``::
[main]
models = opensipkd.pad.models.default
service = opensipkd.pad.services.default
db_url = postgresql://report:password@localhost:5432/simpad
report_db_url = postgresql://report:password@localhost:5432/payment_report
pid_file = /home/sugiana/tmp/pad-report.pid
log_file = /home/sugiana/log/pad-report.log
Jika ada database VA / QRIS maka tambahkan::
va_db_url = postgresql://report:password@localhost:5432/va_bjb
Buat tabel yang dibutuhkan di database ``payment_report``::
$ ~/env/bin/payment_report_init_db pad.ini
$ ~/env/bin/payment_report_init_db pad
-report
.ini
Kemudian buat file ``/etc/cron.d/payment-report`` berikut ini::
MAILTO=""
*/5 * * * * sugiana cd /home/sugiana
/payment-report && ../env/bin/pad_report pad
.ini
*/5 * * * * sugiana cd /home/sugiana
&& env/bin/pad_report pad-report
.ini
Lalu pantau log-nya. Jika sudah ada penampakan lihat hasilnya di tabel ``pad_report``.
...
...
@@ -70,8 +76,9 @@ Berikan hak akses yang diperlukan user ``report``::
GRANT SELECT ON bphtb.bphtb_sspd TO report;
GRANT SELECT ON bphtb.bphtb_perolehan TO report;
GRANT SELECT ON bphtb.bphtb_ppat TO report;
GRANT SELECT ON log_iso TO report;
Lalu buat file konfigurasi bernama ``bphtb.ini``::
Lalu buat file konfigurasi bernama ``bphtb
-report
.ini``::
[main]
models = opensipkd.bphtb.models.default
...
...
@@ -80,30 +87,15 @@ Lalu buat file konfigurasi bernama ``bphtb.ini``::
pid_file = /home/sugiana/tmp/bphtb-report.pid
log_file = /home/sugiana/log/bphtb-report.log
Kemudian di file ``/etc/cron.d/payment-report`` tambahkan::
*/5 * * * * sugiana cd /home/sugiana/payment-report && ../env/bin/bphtb_report bphtb.ini
Lalu pantau log-nya. Jika sudah ada penampakan lihat hasilnya di tabel ``bphtb_report``.
BPHTB Versi 2
-------------
Jika ada database VA / QRIS maka tambahkan::
Yang dimaksud versi 2 di sini adalah tidak lagi mencatat ISO8583 di tabel
``bphtb.bphtb_payment`` dan ``bphtb.bphtb_reversal`` melainkan sepenuhnya di
tabel ``log_iso``. Jika tabel ini sudah ada maka script sebelumnya yaitu
``bin/bphtb_report`` cukup dijalankan sekali saja, tidak perlu ditaruh di cron.
va_db_url = postgresql://report:password@localhost:5432/va_bjb
Lalu beri hak akses ke tabel ``log_iso``::
GRANT SELECT ON log_iso TO report;
Kemudian di file ``/etc/cron.d/payment-report`` menjadi begini::
Kemudian di file ``/etc/cron.d/payment-report`` tambahkan::
*/5 * * * * sugiana cd /home/sugiana
/payment-report && ../env/bin/bphtb2_report bphtb
.ini
*/5 * * * * sugiana cd /home/sugiana
&& env/bin/bphtb_report bphtb-report
.ini
Ya, tidak ada perubahan dengan file konfigurasi. Semoga berhasil
.
Lalu pantau log-nya. Jika sudah ada penampakan lihat hasilnya di tabel ``bphtb_report``
.
PBB
...
...
@@ -119,8 +111,9 @@ Berikan hak akses yang diperlukan user ``report``::
GRANT SELECT ON pbb.inquiry TO report;
GRANT SELECT ON pbb.payment TO report;
GRANT SELECT ON pbb.reversal TO report;
GRANT SELECT ON log_iso TO report;
Lalu buat file konfigurasi bernama ``pbb.ini``::
Lalu buat file konfigurasi bernama ``pbb
-report
.ini``::
[main]
models = sismiop.models.default
...
...
@@ -129,8 +122,12 @@ Lalu buat file konfigurasi bernama ``pbb.ini``::
pid_file = /home/sugiana/tmp/pbb-report.pid
log_file = /home/sugiana/log/pbb-report.log
Jika ada database VA / QRIS maka tambahkan::
va_db_url = postgresql://report:password@localhost:5432/va_bjb
Kemudian di file ``/etc/cron.d/payment-report`` tambahkan::
*/5 * * * * sugiana cd /home/sugiana
/payment-report && ../env/bin/pbb_report pbb
.ini
*/5 * * * * sugiana cd /home/sugiana
&& env/bin/pbb_report pbb-report
.ini
Lalu pantau log-nya. Jika sudah ada penampakan lihat hasilnya di tabel ``pbb_report``.
pad.ini
View file @
3cb16c6
[main]
models
=
opensipkd.pad.models.default
service
=
opensipkd.pad.services.default
db_url
=
postgresql://user:pass@localhost/db
#va_db_url = postgresql://user:pass@localhost/db
report_db_url
=
postgresql://user:pass@localhost/db
...
...
payment_report/scripts/bphtb.py
View file @
3cb16c6
...
...
@@ -6,10 +6,17 @@ from sqlalchemy import (
String
,
Date
,
ForeignKey
,
UniqueConstraint
,
func
,
)
from
sqlalchemy.ext.declarative
import
declared_attr
from
sqlalchemy.exc
import
ProgrammingError
from
opensipkd.string
import
FixLength
from
opensipkd.waktu
import
dmyhms
from
opensipkd.bphtb.models.customer
import
CustomerMixin
from
opensipkd.bphtb.models.perolehan
import
PerolehanMixin
from
opensipkd.bphtb.models.invoice
import
InvoiceMixin
from
opensipkd.bphtb.models.payment
import
PaymentMixin
from
opensipkd.bphtb.models.default
import
(
Payment
,
Invoice
,
...
...
@@ -36,6 +43,34 @@ from .common import (
)
class
AlternativeCustomer
(
CustomerMixin
,
Base
):
@declared_attr
def
__table_args__
(
self
):
return
dict
(
schema
=
'public'
)
class
AlternativePerolehan
(
PerolehanMixin
,
Base
):
@declared_attr
def
__table_args__
(
self
):
return
dict
(
schema
=
'public'
)
class
AlternativeInvoice
(
InvoiceMixin
,
Base
):
@declared_attr
def
__table_args__
(
self
):
return
(
UniqueConstraint
(
'tahun'
,
'kode'
,
'no_sspd'
),
dict
(
schema
=
'public'
))
class
AlternativePayment
(
PaymentMixin
,
Base
):
@declared_attr
def
__table_args__
(
self
):
return
(
UniqueConstraint
(
'tanggal'
,
'jam'
,
'seq'
,
'transno'
),
dict
(
schema
=
'public'
))
class
IsoPayment
(
Base
):
__tablename__
=
'bphtb_payment'
__table_args__
=
dict
(
schema
=
'bphtb'
)
...
...
@@ -63,9 +98,28 @@ class App(BaseApp):
super
()
.
__init__
(
argv
)
if
not
self
.
pid
:
return
self
.
base_q_func
=
self
.
prod_session
.
query
(
func
.
count
())
self
.
base_q_inv
=
self
.
prod_session
.
query
(
Invoice
)
self
.
base_q_cust
=
self
.
prod_session
.
query
(
Customer
)
self
.
base_q_perolehan
=
self
.
prod_session
.
query
(
Perolehan
)
try
:
self
.
base_q_inv
.
first
()
self
.
Customer
=
Customer
self
.
Perolehan
=
Perolehan
self
.
Invoice
=
Invoice
self
.
Payment
=
Payment
self
.
base_q_cust
=
self
.
prod_session
.
query
(
self
.
Customer
)
self
.
base_q_perolehan
=
self
.
prod_session
.
query
(
self
.
Perolehan
)
self
.
base_q_pay
=
self
.
prod_session
.
query
(
self
.
Payment
)
except
ProgrammingError
:
self
.
prod_session
.
rollback
()
self
.
Customer
=
AlternativeCustomer
self
.
Perolehan
=
AlternativePerolehan
self
.
Invoice
=
AlternativeInvoice
self
.
Payment
=
AlternativePayment
self
.
base_q_inv
=
self
.
prod_session
.
query
(
AlternativeInvoice
)
self
.
base_q_cust
=
self
.
prod_session
.
query
(
AlternativeCustomer
)
self
.
base_q_perolehan
=
self
.
prod_session
.
query
(
AlternativePerolehan
)
self
.
base_q_pay
=
self
.
prod_session
.
query
(
AlternativePayment
)
def
get_last_time
(
self
):
# Override
s_tgl
=
self
.
last_pay
.
tanggal
.
strftime
(
'
%
d-
%
m-
%
Y'
)
...
...
@@ -74,19 +128,17 @@ class App(BaseApp):
def
get_filter_query
(
self
,
q
):
return
q
.
filter
(
Payment
.
tanggal
>=
self
.
tgl_awal
.
date
(),
Payment
.
jam
>=
self
.
tgl_awal
.
time
(),
Payment
.
tanggal
<
self
.
tgl_akhir
+
one_day
)
self
.
Payment
.
tanggal
>=
self
.
tgl_awal
.
date
(),
self
.
Payment
.
jam
>=
self
.
tgl_awal
.
time
(),
self
.
Payment
.
tanggal
<
self
.
tgl_akhir
+
one_day
)
def
get_count
(
self
)
->
int
:
# Override
q
=
self
.
prod_session
.
query
(
func
.
count
())
q
=
self
.
get_filter_query
(
q
)
q
=
self
.
get_filter_query
(
self
.
base_q_func
)
return
q
.
scalar
()
def
get_payment_query
(
self
):
# Override
q
=
self
.
prod_session
.
query
(
Payment
)
q
=
self
.
get_filter_query
(
q
)
return
q
.
order_by
(
Payment
.
tanggal
,
Payment
.
jam
)
q
=
self
.
get_filter_query
(
self
.
base_q_pay
)
return
q
.
order_by
(
self
.
Payment
.
tanggal
,
self
.
Payment
.
jam
)
def
get_iso_v1
(
self
,
pay
):
q
=
self
.
prod_session
.
query
(
IsoPayment
)
.
filter_by
(
id
=
pay
.
id
)
...
...
@@ -95,7 +147,8 @@ class App(BaseApp):
return
iso
=
get_iso
(
row
.
iso_request
,
Doc
,
self
.
option
.
debug
)
info
=
get_channel_info_by_iso
(
iso
)
return
info
[
'bit_018'
],
info
[
'channel'
],
iso
.
get_stan
(),
iso
.
get_ntb
()
return
info
.
get
(
'bit_018'
,
'0000'
),
info
[
'channel'
],
iso
.
get_stan
(),
\
iso
.
get_ntb
()
def
get_iso_v2
(
self
):
q
=
self
.
prod_session
.
query
(
Log
)
.
filter_by
(
...
...
@@ -122,6 +175,9 @@ class App(BaseApp):
return
q
.
first
()
def
create_data
(
self
,
pay
):
# Override
if
not
pay
.
sspd_id
:
msg
=
'Field bphtb_bank.sspd_id NULL'
raise
InvalidSource
(
msg
)
inv
=
self
.
get_invoice
(
pay
)
if
not
inv
:
msg
=
f
'Field bphtb_bank.sspd_id {pay.sspd_id} tidak ada di '
\
...
...
payment_report/scripts/data/conf.csv
View file @
3cb16c6
nama,nilai,keterangan
pad payment last date,1-1-2000 00:00:00,pad.pad_sspd.sspdtgl terakhir yang diproses
pad reversal last date,1-1-2000 00:00:00,pad_reversal.tgl terakhir yang diproses
pad json payment last id,0,pad_payment.id terakhir yang diproses
pad json reversal last date,1-1-2000 00:00:00,pad_reversal.tgl terakhir yang diproses
webr payment last date,1-1-2000 00:00:00,webr.ar_payment.created terakhir yang diproses
bphtb payment last date,01-01-2000 00:00:00,bphtb.bphtb_bank.tanggal terakhir yang diproses
pbb payment last date,1-1-2000,pembayaran_sppt.tgl_rekam_byr_sppt terakhir yang diproses
payment_report/scripts/pad.py
View file @
3cb16c6
...
...
@@ -26,6 +26,7 @@ from .common import (
BaseApp
,
init_db
as
base_init_db
,
one_day
,
BANK_NAMES
,
)
...
...
@@ -88,6 +89,11 @@ class App(BaseApp):
row
=
q
.
first
()
if
not
row
:
return
if
row
.
iso_request
[
0
]
==
'{'
:
s
=
row
.
iso_request
.
replace
(
'datetime.datetime'
,
'datetime'
)
d
=
eval
(
s
)
channel
=
BANK_NAMES
[
str
(
row
.
bank_id
)]
return
'0000'
,
channel
,
None
,
None
,
row
.
bank_id
Doc
=
BankHandlers
[
row
.
bank_id
]
iso
=
get_iso
(
row
.
iso_request
,
Doc
,
self
.
option
.
debug
)
info
=
get_channel_info_by_iso
(
iso
)
...
...
@@ -102,8 +108,11 @@ class App(BaseApp):
return
channel_id
=
row
.
bit_018
.
strip
()
channel_nama
=
get_channel_name_by_row
(
row
)
return
channel_id
,
channel_nama
,
row
.
bit_011
,
\
row
.
bit_048
.
strip
(),
int
(
row
.
bit_032
)
bank_id
=
row
.
bit_032
if
bank_id
:
bank_id
=
int
(
bank_id
)
return
channel_id
,
channel_nama
,
row
.
bit_011
,
row
.
bit_048
.
strip
(),
\
bank_id
def
create_data
(
self
,
pay
):
# Override
Invoice
=
self
.
models
.
Invoice
...
...
@@ -112,9 +121,10 @@ class App(BaseApp):
invoice_id
=
FixLength
(
self
.
service
.
INVOICE_ID
)
invoice_id
[
'Tahun'
]
=
inv
.
tahun
invoice_id
[
'SptNo'
]
=
inv
.
sptno
prefix
=
getattr
(
self
.
service
,
'PREFIX'
)
if
prefix
:
invoice_id
[
'Prefix'
]
=
prefix
try
:
invoice_id
[
'Prefix'
]
=
getattr
(
self
.
service
,
'PREFIX'
)
except
AttributeError
:
pass
self
.
invoice_id
=
invoice_id
.
get_raw
()
source
=
self
.
get_iso_v2
()
if
source
:
...
...
@@ -132,7 +142,7 @@ class App(BaseApp):
id
=
pay
.
id
,
stan
=
stan
,
ntb
=
ntb
,
tgl
=
pay
.
sspdtgl
.
date
(),
jam
=
pay
.
sspdtgl
.
time
(),
nomor_bayar
=
invoice_id
.
get_raw
(),
jenis_pajak
=
usaha
.
usahanm
.
strip
(),
masa_pajak
=
pajak
.
masapajak
,
npwpd
=
cust
.
npwpd
,
nama_wp
=
cust
.
customernm
,
npwpd
=
cust
.
npwpd
,
nama_wp
=
cust
.
customernm
.
strip
()
,
pokok
=
pay
.
jml_bayar
-
pay
.
denda
,
denda
=
pay
.
denda
,
jml_bayar
=
pay
.
jml_bayar
,
channel_id
=
channel_id
,
channel_name
=
channel_name
,
bank_id
=
bank_id
)
...
...
payment_report/scripts/pad_json.py
deleted
100644 → 0
View file @
9a47ec7
import
sys
import
datetime
from
datetime
import
timedelta
import
transaction
from
opensipkd.waktu
import
(
dmyhms
,
date_from_str
,
)
from
opensipkd.string
import
FixLength
from
opensipkd.pad.models.default
import
(
IsoPayment
,
IsoReversal
,
)
from
opensipkd.pad.services.default
import
INVOICE_ID
from
iso8583_web.models.meta
import
Base
as
BaseConf
from
opensipkd.iso8583.bjb.pad.doc
import
Doc
as
BjbDoc
from
opensipkd.iso8583.multi.doc
import
Doc
as
MultiDoc
from
..models
import
(
Base
,
Pad
,
)
from
.common
import
(
BaseApp
,
init_db
as
base_init_db
,
BANK_NAMES
,
)
ERR_NOT_FOUND
=
'Tgl {tgl_bayar} pad.pad_sspd.spt_id {invoice_id} tidak ada'
def
get_filter
(
q
):
return
q
.
filter
(
IsoPayment
.
iso_request
.
like
(
'{
%
'
))
class
App
(
BaseApp
):
report_orm
=
Pad
def
__init__
(
self
,
argv
):
super
()
.
__init__
(
argv
)
if
not
self
.
pid
:
return
Usaha
=
self
.
models
.
Usaha
Pajak
=
self
.
models
.
Pajak
Customer
=
self
.
models
.
Customer
CustomerUsaha
=
self
.
models
.
CustomerUsaha
Invoice
=
self
.
models
.
Invoice
Payment
=
self
.
models
.
Payment
self
.
base_q_pay
=
self
.
prod_session
.
query
(
Payment
)
self
.
base_q_inv
=
self
.
prod_session
.
query
(
Invoice
,
Pajak
,
Customer
,
Usaha
)
self
.
base_q_inv
=
self
.
base_q_inv
.
filter
(
Invoice
.
pajak_id
==
Pajak
.
id
,
Invoice
.
customer_usaha_id
==
CustomerUsaha
.
id
,
CustomerUsaha
.
customer_id
==
Customer
.
id
,
Usaha
.
id
==
Pajak
.
usaha_id
,)
self
.
base_q_iso
=
self
.
prod_session
.
query
(
IsoPayment
)
def
get_pay
(
self
,
row
):
tgl_bayar
=
row
.
tgl
.
date
()
Payment
=
self
.
models
.
Payment
q_pay
=
self
.
base_q_pay
.
filter_by
(
spt_id
=
row
.
invoice_id
)
.
filter
(
Payment
.
create_date
>=
tgl_bayar
,
Payment
.
create_date
<
tgl_bayar
+
timedelta
(
1
))
q_pay
=
q_pay
.
order_by
(
Payment
.
id
.
desc
())
return
q_pay
.
first
()
def
__get_query_iso
(
self
,
last_id
):
q_iso
=
self
.
base_q_iso
.
filter
(
IsoPayment
.
id
>
last_id
)
q_iso
=
get_filter
(
q_iso
)
return
q_iso
.
order_by
(
IsoPayment
.
id
)
def
__create_data
(
self
,
row
,
pay
,
iso
,
d
,
tgl_bayar
):
Invoice
=
self
.
models
.
Invoice
q_inv
=
self
.
base_q_inv
.
filter
(
Invoice
.
id
==
pay
.
spt_id
)
inv
,
pajak
,
cust
,
usaha
=
q_inv
.
first
()
return
dict
(
stan
=
d
[
'stan'
],
ntb
=
d
[
'ntb'
],
tgl
=
tgl_bayar
,
jam
=
row
.
tgl
.
time
(),
sspd_id
=
pay
.
id
,
nomor_bayar
=
d
[
'nomor_bayar'
],
jenis_pajak
=
usaha
.
usahanm
.
strip
(),
masa_pajak
=
pajak
.
masapajak
,
npwpd
=
cust
.
npwpd
,
nama_wp
=
cust
.
customernm
,
pokok
=
pay
.
jml_bayar
-
pay
.
denda
,
denda
=
pay
.
denda
,
jml_bayar
=
pay
.
jml_bayar
,
channel_id
=
row
.
channel_id
,
channel_name
=
d
[
'channel'
],
bank_id
=
row
.
bank_id
)
def
__log_progress
(
self
,
s_tgl
,
d
):
self
.
log
.
info
(
f
'Tgl bayar {s_tgl}, {d}'
)
def
get_keys
(
self
,
row
):
Invoice
=
self
.
models
.
Invoice
q
=
self
.
prod_session
.
query
(
Invoice
)
.
filter_by
(
id
=
row
.
invoice_id
)
invoice
=
q
.
first
()
inv_id
=
FixLength
(
INVOICE_ID
)
inv_id
[
'Tahun'
]
=
str
(
invoice
.
tahun
)
inv_id
[
'SptNo'
]
=
str
(
invoice
.
sptno
)
stan
=
row
.
transmission
.
strftime
(
'
%
H
%
M
%
S'
)
return
dict
(
stan
=
stan
,
nomor_bayar
=
inv_id
.
get_raw
(),
ntb
=
row
.
ntb
,
channel
=
BANK_NAMES
[
str
(
row
.
bank_id
)])
def
__run_payment
(
self
):
last
=
self
.
get_last_id
(
'pad json payment last id'
)
q_iso
=
self
.
__get_query_iso
(
last
.
as_int
())
found
=
False
for
row
in
q_iso
.
order_by
(
IsoPayment
.
id
)
.
limit
(
1000
):
iso
=
eval
(
row
.
iso_request
)
d
=
self
.
get_keys
(
row
)
if
self
.
get_report
(
d
[
'stan'
],
d
[
'ntb'
]):
continue
pay
=
self
.
get_pay
(
row
)
tgl_bayar
=
row
.
tgl
.
date
()
if
not
pay
:
msg
=
ERR_NOT_FOUND
.
format
(
tgl_bayar
=
tgl_bayar
,
invoice_id
=
row
.
invoice_id
)
self
.
log
.
error
(
msg
)
continue
s_tgl
=
dmyhms
(
row
.
tgl
)
data
=
self
.
__create_data
(
row
,
pay
,
iso
,
d
,
tgl_bayar
)
self
.
__log_progress
(
s_tgl
,
data
)
rpt
=
Pad
(
**
data
)
last
.
nilai
=
str
(
row
.
id
)
with
transaction
.
manager
:
self
.
rpt_session
.
add
(
rpt
)
self
.
rpt_session
.
add
(
last
)
found
=
True
return
found
def
__update_from_id
(
self
):
q_iso
=
self
.
__get_query_iso
(
self
.
last_id
)
found
=
False
for
row
in
q_iso
.
order_by
(
IsoPayment
.
id
)
.
limit
(
1000
):
iso
=
eval
(
row
.
iso_request
)
d
=
self
.
get_keys
(
row
)
print
(
d
)
tgl_bayar
=
row
.
tgl
.
date
()
pay
=
self
.
get_pay
(
row
)
rpt
=
self
.
get_report
(
d
[
'stan'
],
d
[
'ntb'
])
if
not
rpt
:
if
not
pay
:
msg
=
ERR_NOT_FOUND
.
format
(
tgl_bayar
=
tgl_bayar
,
invoice_id
=
row
.
invoice_id
)
self
.
log
.
error
(
msg
)
continue
rpt
=
Pad
()
s_tgl
=
dmyhms
(
row
.
tgl
)
data
=
self
.
__create_data
(
row
,
pay
,
iso
,
d
,
tgl_bayar
)
self
.
__log_progress
(
s_tgl
,
data
)
rpt
.
from_dict
(
data
)
with
transaction
.
manager
:
self
.
rpt_session
.
add
(
rpt
)
found
=
True
self
.
last_id
=
row
.
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
(
IsoPayment
)
.
filter
(
IsoPayment
.
tgl
>=
tgl
)
.
order_by
(
IsoPayment
.
id
)
q
=
get_filter
(
q
)
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
get_iso_reversal_orm
(
self
):
# Override
return
IsoReversal
def
get_doc_for_reversal
(
self
,
row
):
# Override
q
=
self
.
prod_session
.
query
(
IsoPayment
)
.
filter_by
(
id
=
row
.
id
)
iso_pay
=
q
.
first
()
return
BankHandlers
[
iso_pay
.
bank_id
]
def
run_reversal
(
self
):
# Override
last
=
self
.
get_last_id
(
'pad json reversal last date'
)
q
=
self
.
prod_session
.
query
(
IsoReversal
)
.
filter
(
IsoReversal
.
iso_request
.
like
(
'{
%
'
),
IsoReversal
.
tgl
>
last
.
as_datetime
())
for
row
in
q
.
order_by
(
IsoReversal
.
tgl
):
print
(
f
'DEBUG reversal {row.tgl}'
)
def
main
(
argv
=
sys
.
argv
[
1
:]):
app
=
App
(
argv
)
if
app
.
pid
:
app
.
run
()
def
init_db
(
argv
=
sys
.
argv
[
1
:]):
base_init_db
(
Base
.
metadata
,
BaseConf
.
metadata
,
argv
)
payment_report/scripts/pbb.py
View file @
3cb16c6
...
...
@@ -4,8 +4,14 @@ from datetime import (
date
,
timedelta
,
)
from
sqlalchemy
import
(
Column
,
Integer
,
String
,
UniqueConstraint
,
func
,
)
from
ISO8583.ISO8583
import
BitNotSet
from
sqlalchemy
import
func
import
transaction
from
sismiop.services.base
import
get_id
from
opensipkd.string
import
(
...
...
@@ -29,6 +35,7 @@ from .common import (
get_iso
,
get_channel_info_by_iso
,
get_channel_name_by_row
,
get_channel_name_by_dict
,
BaseApp
,
one_day
,
VaInvoice
,
...
...
@@ -37,6 +44,40 @@ from .common import (
)
def
to_date
(
dt
):
if
isinstance
(
dt
,
datetime
):
return
dt
.
date
()
return
dt
class
JsonLog
(
Base
):
__tablename__
=
'pbb_payment'
id
=
Column
(
Integer
,
primary_key
=
True
)
propinsi
=
Column
(
String
(
2
),
nullable
=
False
)
kabupaten
=
Column
(
String
(
2
),
nullable
=
False
)
kecamatan
=
Column
(
String
(
3
),
nullable
=
False
)
kelurahan
=
Column
(
String
(
3
),
nullable
=
False
)
blok
=
Column
(
String
(
3
),
nullable
=
False
)
urut
=
Column
(
String
(
4
),
nullable
=
False
)
jenis
=
Column
(
String
(
1
),
nullable
=
False
)
tahun
=
Column
(
Integer
,
nullable
=
False
)
ke
=
Column
(
Integer
,
nullable
=
False
)
kd_kanwil_bank
=
Column
(
String
(
2
),
nullable
=
False
)
kd_kppbb_bank
=
Column
(
String
(
2
),
nullable
=
False
)
kd_bank_tunggal
=
Column
(
String
(
2
),
nullable
=
False
)
kd_bank_persepsi
=
Column
(
String
(
2
),
nullable
=
False
)
kd_tp
=
Column
(
String
(
2
),
nullable
=
False
)
channel
=
Column
(
String
(
4
))
ntb
=
Column
(
String
(
64
))
ntp
=
Column
(
String
(
64
))
bank
=
Column
(
Integer
)
iso_request
=
Column
(
String
(
2048
),
nullable
=
False
)
__table_args__
=
(
UniqueConstraint
(
'propinsi'
,
'kabupaten'
,
'kecamatan'
,
'kelurahan'
,
'blok'
,
'urut'
,
'jenis'
,
'tahun'
,
'ke'
),
dict
(
schema
=
'public'
))
class
App
(
BaseApp
):
conf_name
=
'pbb payment last date'
report_orm
=
Pbb
...
...
@@ -49,7 +90,6 @@ class App(BaseApp):
d
=
Doc
()
self
.
iso_inquiry_orm
=
d
.
iso_inquiry_model
self
.
iso_payment_orm
=
d
.
iso_payment_model
self
.
iso_reversal_orm
=
d
.
iso_reversal_model
self
.
base_q_iso
=
self
.
prod_session
.
query
(
self
.
iso_payment_orm
,
self
.
iso_inquiry_orm
)
.
filter
(
self
.
iso_payment_orm
.
inquiry_id
==
self
.
iso_inquiry_orm
.
id
)
...
...
@@ -65,9 +105,12 @@ class App(BaseApp):
self
.
h2h_session
=
self
.
prod_session
self
.
base_q_log
=
self
.
h2h_session
.
query
(
Log
)
.
filter_by
(
mti
=
'0210'
,
bit_003
=
PAYMENT_CODE
,
bit_039
=
'00'
)
def
get_iso_reversal_orm
(
self
):
# Override
return
self
.
iso_reversal_orm
if
'json_db_url'
in
self
.
conf
:
factory
=
self
.
get_factory
(
'json_db_url'
)
self
.
json_session
=
factory
()
self
.
base_q_json
=
self
.
json_session
.
query
(
JsonLog
)
else
:
self
.
json_session
=
None
def
get_sppt
(
self
,
psppt
):
q
=
self
.
base_q_sppt
.
filter_by
(
...
...
@@ -125,7 +168,11 @@ class App(BaseApp):
user_id
=
iso
.
getBit
(
107
)
except
BitNotSet
:
user_id
=
None
return
iso
.
get_channel
()
.
strip
(),
info
[
'channel'
],
iso
.
get_stan
(),
\
try
:
channel_id
=
iso
.
get_channel
()
.
strip
()
except
BitNotSet
:
channel_id
=
'0000'
return
channel_id
,
info
[
'channel'
],
iso
.
get_stan
(),
\
iso
.
get_ntb
(),
str
(
iso
.
get_bank_id
()),
user_id
,
row_inq
.
tgl
def
get_iso_v2
(
self
):
...
...
@@ -139,12 +186,28 @@ class App(BaseApp):
return
channel_id
,
channel_nama
,
row
.
bit_011
,
\
row
.
bit_048
.
strip
(),
row
.
bit_032
,
row
.
bit_107
def
create_data
(
self
,
psppt
):
# Override
self
.
invoice_id
=
get_id
(
psppt
)
sppt
=
self
.
get_sppt
(
psppt
)
if
not
sppt
:
msg
=
f
'Invoice ID {self.invoice_id} tidak ada di tabel sppt'
raise
InvalidSource
(
msg
)
def
get_json
(
self
,
psppt
):
if
not
self
.
json_session
:
return
q
=
self
.
base_q_json
.
filter_by
(
propinsi
=
psppt
.
kd_propinsi
,
kabupaten
=
psppt
.
kd_dati2
,
kecamatan
=
psppt
.
kd_kecamatan
,
kelurahan
=
psppt
.
kd_kelurahan
,
blok
=
psppt
.
kd_blok
,
urut
=
psppt
.
no_urut
,
jenis
=
psppt
.
kd_jns_op
,
tahun
=
psppt
.
thn_pajak_sppt
,
ke
=
psppt
.
pembayaran_sppt_ke
)
row
=
q
.
first
()
if
not
row
:
return
d
=
eval
(
row
.
iso_request
)
kode
=
d
[
'bit_032'
]
nama
=
get_channel_name_by_dict
(
d
)
return
kode
,
nama
,
d
[
'bit_011'
],
row
.
ntb
,
kode
def
get_source
(
self
,
psppt
):
source
=
self
.
get_iso_v2
()
tgl_inquiry
=
user_id
=
stan
=
ntb
=
bank_id
=
None
if
source
:
...
...
@@ -155,27 +218,42 @@ class App(BaseApp):
channel_kode
,
channel_nama
,
stan
,
ntb
,
bank_id
,
user_id
,
\
tgl_inquiry
=
source
else
:
source
=
self
.
get_json
(
psppt
)
if
source
:
channel_kode
,
channel_nama
,
stan
,
ntb
,
bank_id
=
source
else
:
channel_kode
=
'0000'
if
psppt
.
nip_rekam_byr_sppt
.
strip
()
==
self
.
nip_pospbb
:
channel_nama
=
'POSPBB'
else
:
tgl
=
psppt
.
tgl_rekam_byr_sppt
.
date
()
channel_nama
=
self
.
get_va_channel
(
tgl
)
or
'MANUAL'
return
channel_kode
,
channel_nama
,
stan
,
ntb
,
bank_id
,
user_id
,
\
tgl_inquiry
def
create_data
(
self
,
psppt
):
# Override
self
.
invoice_id
=
get_id
(
psppt
)
sppt
=
self
.
get_sppt
(
psppt
)
if
not
sppt
:
msg
=
f
'Invoice ID {self.invoice_id} tidak ada di tabel sppt'
raise
InvalidSource
(
msg
)
channel_kode
,
channel_nama
,
stan
,
ntb
,
bank_id
,
user_id
,
\
tgl_inquiry
=
self
.
get_source
(
psppt
)
discount
=
hasattr
(
psppt
,
'discount'
)
and
psppt
.
discount
or
None
tgl
=
to_date
(
psppt
.
tgl_pembayaran_sppt
)
return
dict
(
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
,
stan
=
stan
,
ntb
=
ntb
,
jml_sppt_yg_dibayar
=
psppt
.
jml_sppt_yg_dibayar
,
pembayaran_sppt_ke
=
psppt
.
pembayaran_sppt_ke
,
stan
=
stan
,
ntb
=
ntb
,
jml_sppt_yg_dibayar
=
psppt
.
jml_sppt_yg_dibayar
,
denda_sppt
=
psppt
.
denda_sppt
,
discount
=
discount
,
tgl_pembayaran_sppt
=
psppt
.
tgl_pembayaran_sppt
.
date
()
,
tgl_pembayaran_sppt
=
tgl
,
tgl_inquiry
=
tgl_inquiry
,
tgl_rekam_byr_sppt
=
psppt
.
tgl_rekam_byr_sppt
,
nm_wp_sppt
=
sppt
.
nm_wp_sppt
,
channel_kode
=
channel_kode
,
channel_nama
=
channel_nama
,
bank_id
=
bank_id
,
user_id
=
user_id
,
pbb_yg_harus_dibayar_sppt
=
sppt
.
pbb_yg_harus_dibayar_sppt
,
tgl_inquiry
=
tgl_inquiry
)
pbb_yg_harus_dibayar_sppt
=
sppt
.
pbb_yg_harus_dibayar_sppt
)
def
get_report
(
self
,
psppt
):
# Override
q
=
self
.
rpt_session
.
query
(
Pbb
)
.
filter_by
(
...
...
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