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
- Perbedaan utama dari versi 0.x adalah kini berangkat dari tabel aslinya dan
bukan dari tabel ISO8583 karena sudah memperhatikan channel MANUAL (input
bukan dari tabel ISO8583 karena sudah memperhatikan channel MANUAL (input
...
...
README.rst
View file @
3cb16c6
...
@@ -11,6 +11,7 @@ Pasang paket yang dibutuhkan::
...
@@ -11,6 +11,7 @@ Pasang paket yang dibutuhkan::
$ ~/env/bin/pip install wheel
$ ~/env/bin/pip install wheel
$ ~/env/bin/pip install ebcdic
$ ~/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-bjb.git
$ ~/env/bin/pip install git+https://git.opensipkd.com/sugiana/opensipkd-iso8583-multi.git
Lalu pasang paket ini::
Lalu pasang paket ini::
...
@@ -35,23 +36,28 @@ diperlukan user ``report``::
...
@@ -35,23 +36,28 @@ diperlukan user ``report``::
GRANT SELECT ON pad_payment TO report;
GRANT SELECT ON pad_payment TO report;
GRANT SELECT ON pad_reversal 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]
[main]
models = opensipkd.pad.models.default
models = opensipkd.pad.models.default
service = opensipkd.pad.services.default
db_url = postgresql://report:password@localhost:5432/simpad
db_url = postgresql://report:password@localhost:5432/simpad
report_db_url = postgresql://report:password@localhost:5432/payment_report
report_db_url = postgresql://report:password@localhost:5432/payment_report
pid_file = /home/sugiana/tmp/pad-report.pid
pid_file = /home/sugiana/tmp/pad-report.pid
log_file = /home/sugiana/log/pad-report.log
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``::
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::
Kemudian buat file ``/etc/cron.d/payment-report`` berikut ini::
MAILTO=""
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``.
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``::
...
@@ -70,8 +76,9 @@ Berikan hak akses yang diperlukan user ``report``::
GRANT SELECT ON bphtb.bphtb_sspd TO report;
GRANT SELECT ON bphtb.bphtb_sspd TO report;
GRANT SELECT ON bphtb.bphtb_perolehan TO report;
GRANT SELECT ON bphtb.bphtb_perolehan TO report;
GRANT SELECT ON bphtb.bphtb_ppat 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]
[main]
models = opensipkd.bphtb.models.default
models = opensipkd.bphtb.models.default
...
@@ -80,30 +87,15 @@ Lalu buat file konfigurasi bernama ``bphtb.ini``::
...
@@ -80,30 +87,15 @@ Lalu buat file konfigurasi bernama ``bphtb.ini``::
pid_file = /home/sugiana/tmp/bphtb-report.pid
pid_file = /home/sugiana/tmp/bphtb-report.pid
log_file = /home/sugiana/log/bphtb-report.log
log_file = /home/sugiana/log/bphtb-report.log
Kemudian di file ``/etc/cron.d/payment-report`` tambahkan::
Jika ada database VA / QRIS maka 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
-------------
Yang dimaksud versi 2 di sini adalah tidak lagi mencatat ISO8583 di tabel
va_db_url = postgresql://report:password@localhost:5432/va_bjb
``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.
Lalu beri hak akses ke tabel ``log_iso``::
Kemudian di file ``/etc/cron.d/payment-report`` tambahkan::
GRANT SELECT ON log_iso TO report;
Kemudian di file ``/etc/cron.d/payment-report`` menjadi begini::
*/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
PBB
...
@@ -119,8 +111,9 @@ Berikan hak akses yang diperlukan user ``report``::
...
@@ -119,8 +111,9 @@ Berikan hak akses yang diperlukan user ``report``::
GRANT SELECT ON pbb.inquiry TO report;
GRANT SELECT ON pbb.inquiry TO report;
GRANT SELECT ON pbb.payment TO report;
GRANT SELECT ON pbb.payment TO report;
GRANT SELECT ON pbb.reversal 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]
[main]
models = sismiop.models.default
models = sismiop.models.default
...
@@ -129,8 +122,12 @@ Lalu buat file konfigurasi bernama ``pbb.ini``::
...
@@ -129,8 +122,12 @@ Lalu buat file konfigurasi bernama ``pbb.ini``::
pid_file = /home/sugiana/tmp/pbb-report.pid
pid_file = /home/sugiana/tmp/pbb-report.pid
log_file = /home/sugiana/log/pbb-report.log
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::
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``.
Lalu pantau log-nya. Jika sudah ada penampakan lihat hasilnya di tabel ``pbb_report``.
pad.ini
View file @
3cb16c6
[main]
[main]
models
=
opensipkd.pad.models.default
models
=
opensipkd.pad.models.default
service
=
opensipkd.pad.services.default
db_url
=
postgresql://user:pass@localhost/db
db_url
=
postgresql://user:pass@localhost/db
#va_db_url = postgresql://user:pass@localhost/db
#va_db_url = postgresql://user:pass@localhost/db
report_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 (
...
@@ -6,10 +6,17 @@ from sqlalchemy import (
String
,
String
,
Date
,
Date
,
ForeignKey
,
ForeignKey
,
UniqueConstraint
,
func
,
func
,
)
)
from
sqlalchemy.ext.declarative
import
declared_attr
from
sqlalchemy.exc
import
ProgrammingError
from
opensipkd.string
import
FixLength
from
opensipkd.string
import
FixLength
from
opensipkd.waktu
import
dmyhms
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
(
from
opensipkd.bphtb.models.default
import
(
Payment
,
Payment
,
Invoice
,
Invoice
,
...
@@ -36,6 +43,34 @@ from .common import (
...
@@ -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
):
class
IsoPayment
(
Base
):
__tablename__
=
'bphtb_payment'
__tablename__
=
'bphtb_payment'
__table_args__
=
dict
(
schema
=
'bphtb'
)
__table_args__
=
dict
(
schema
=
'bphtb'
)
...
@@ -63,9 +98,28 @@ class App(BaseApp):
...
@@ -63,9 +98,28 @@ class App(BaseApp):
super
()
.
__init__
(
argv
)
super
()
.
__init__
(
argv
)
if
not
self
.
pid
:
if
not
self
.
pid
:
return
return
self
.
base_q_func
=
self
.
prod_session
.
query
(
func
.
count
())
self
.
base_q_inv
=
self
.
prod_session
.
query
(
Invoice
)
self
.
base_q_inv
=
self
.
prod_session
.
query
(
Invoice
)
self
.
base_q_cust
=
self
.
prod_session
.
query
(
Customer
)
try
:
self
.
base_q_perolehan
=
self
.
prod_session
.
query
(
Perolehan
)
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
def
get_last_time
(
self
):
# Override
s_tgl
=
self
.
last_pay
.
tanggal
.
strftime
(
'
%
d-
%
m-
%
Y'
)
s_tgl
=
self
.
last_pay
.
tanggal
.
strftime
(
'
%
d-
%
m-
%
Y'
)
...
@@ -74,19 +128,17 @@ class App(BaseApp):
...
@@ -74,19 +128,17 @@ class App(BaseApp):
def
get_filter_query
(
self
,
q
):
def
get_filter_query
(
self
,
q
):
return
q
.
filter
(
return
q
.
filter
(
Payment
.
tanggal
>=
self
.
tgl_awal
.
date
(),
self
.
Payment
.
tanggal
>=
self
.
tgl_awal
.
date
(),
Payment
.
jam
>=
self
.
tgl_awal
.
time
(),
self
.
Payment
.
jam
>=
self
.
tgl_awal
.
time
(),
Payment
.
tanggal
<
self
.
tgl_akhir
+
one_day
)
self
.
Payment
.
tanggal
<
self
.
tgl_akhir
+
one_day
)
def
get_count
(
self
)
->
int
:
# Override
def
get_count
(
self
)
->
int
:
# Override
q
=
self
.
prod_session
.
query
(
func
.
count
())
q
=
self
.
get_filter_query
(
self
.
base_q_func
)
q
=
self
.
get_filter_query
(
q
)
return
q
.
scalar
()
return
q
.
scalar
()
def
get_payment_query
(
self
):
# Override
def
get_payment_query
(
self
):
# Override
q
=
self
.
prod_session
.
query
(
Payment
)
q
=
self
.
get_filter_query
(
self
.
base_q_pay
)
q
=
self
.
get_filter_query
(
q
)
return
q
.
order_by
(
self
.
Payment
.
tanggal
,
self
.
Payment
.
jam
)
return
q
.
order_by
(
Payment
.
tanggal
,
Payment
.
jam
)
def
get_iso_v1
(
self
,
pay
):
def
get_iso_v1
(
self
,
pay
):
q
=
self
.
prod_session
.
query
(
IsoPayment
)
.
filter_by
(
id
=
pay
.
id
)
q
=
self
.
prod_session
.
query
(
IsoPayment
)
.
filter_by
(
id
=
pay
.
id
)
...
@@ -95,7 +147,8 @@ class App(BaseApp):
...
@@ -95,7 +147,8 @@ class App(BaseApp):
return
return
iso
=
get_iso
(
row
.
iso_request
,
Doc
,
self
.
option
.
debug
)
iso
=
get_iso
(
row
.
iso_request
,
Doc
,
self
.
option
.
debug
)
info
=
get_channel_info_by_iso
(
iso
)
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
):
def
get_iso_v2
(
self
):
q
=
self
.
prod_session
.
query
(
Log
)
.
filter_by
(
q
=
self
.
prod_session
.
query
(
Log
)
.
filter_by
(
...
@@ -122,6 +175,9 @@ class App(BaseApp):
...
@@ -122,6 +175,9 @@ class App(BaseApp):
return
q
.
first
()
return
q
.
first
()
def
create_data
(
self
,
pay
):
# Override
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
)
inv
=
self
.
get_invoice
(
pay
)
if
not
inv
:
if
not
inv
:
msg
=
f
'Field bphtb_bank.sspd_id {pay.sspd_id} tidak ada di '
\
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
nama,nilai,keterangan
pad payment last date,1-1-2000 00:00:00,pad.pad_sspd.sspdtgl terakhir yang diproses
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
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
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
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 (
...
@@ -26,6 +26,7 @@ from .common import (
BaseApp
,
BaseApp
,
init_db
as
base_init_db
,
init_db
as
base_init_db
,
one_day
,
one_day
,
BANK_NAMES
,
)
)
...
@@ -88,6 +89,11 @@ class App(BaseApp):
...
@@ -88,6 +89,11 @@ class App(BaseApp):
row
=
q
.
first
()
row
=
q
.
first
()
if
not
row
:
if
not
row
:
return
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
]
Doc
=
BankHandlers
[
row
.
bank_id
]
iso
=
get_iso
(
row
.
iso_request
,
Doc
,
self
.
option
.
debug
)
iso
=
get_iso
(
row
.
iso_request
,
Doc
,
self
.
option
.
debug
)
info
=
get_channel_info_by_iso
(
iso
)
info
=
get_channel_info_by_iso
(
iso
)
...
@@ -102,8 +108,11 @@ class App(BaseApp):
...
@@ -102,8 +108,11 @@ class App(BaseApp):
return
return
channel_id
=
row
.
bit_018
.
strip
()
channel_id
=
row
.
bit_018
.
strip
()
channel_nama
=
get_channel_name_by_row
(
row
)
channel_nama
=
get_channel_name_by_row
(
row
)
return
channel_id
,
channel_nama
,
row
.
bit_011
,
\
bank_id
=
row
.
bit_032
row
.
bit_048
.
strip
(),
int
(
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
def
create_data
(
self
,
pay
):
# Override
Invoice
=
self
.
models
.
Invoice
Invoice
=
self
.
models
.
Invoice
...
@@ -112,9 +121,10 @@ class App(BaseApp):
...
@@ -112,9 +121,10 @@ class App(BaseApp):
invoice_id
=
FixLength
(
self
.
service
.
INVOICE_ID
)
invoice_id
=
FixLength
(
self
.
service
.
INVOICE_ID
)
invoice_id
[
'Tahun'
]
=
inv
.
tahun
invoice_id
[
'Tahun'
]
=
inv
.
tahun
invoice_id
[
'SptNo'
]
=
inv
.
sptno
invoice_id
[
'SptNo'
]
=
inv
.
sptno
prefix
=
getattr
(
self
.
service
,
'PREFIX'
)
try
:
if
prefix
:
invoice_id
[
'Prefix'
]
=
getattr
(
self
.
service
,
'PREFIX'
)
invoice_id
[
'Prefix'
]
=
prefix
except
AttributeError
:
pass
self
.
invoice_id
=
invoice_id
.
get_raw
()
self
.
invoice_id
=
invoice_id
.
get_raw
()
source
=
self
.
get_iso_v2
()
source
=
self
.
get_iso_v2
()
if
source
:
if
source
:
...
@@ -132,7 +142,7 @@ class App(BaseApp):
...
@@ -132,7 +142,7 @@ class App(BaseApp):
id
=
pay
.
id
,
stan
=
stan
,
ntb
=
ntb
,
tgl
=
pay
.
sspdtgl
.
date
(),
id
=
pay
.
id
,
stan
=
stan
,
ntb
=
ntb
,
tgl
=
pay
.
sspdtgl
.
date
(),
jam
=
pay
.
sspdtgl
.
time
(),
nomor_bayar
=
invoice_id
.
get_raw
(),
jam
=
pay
.
sspdtgl
.
time
(),
nomor_bayar
=
invoice_id
.
get_raw
(),
jenis_pajak
=
usaha
.
usahanm
.
strip
(),
masa_pajak
=
pajak
.
masapajak
,
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
,
pokok
=
pay
.
jml_bayar
-
pay
.
denda
,
denda
=
pay
.
denda
,
jml_bayar
=
pay
.
jml_bayar
,
channel_id
=
channel_id
,
jml_bayar
=
pay
.
jml_bayar
,
channel_id
=
channel_id
,
channel_name
=
channel_name
,
bank_id
=
bank_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 (
...
@@ -4,8 +4,14 @@ from datetime import (
date
,
date
,
timedelta
,
timedelta
,
)
)
from
sqlalchemy
import
(
Column
,
Integer
,
String
,
UniqueConstraint
,
func
,
)
from
ISO8583.ISO8583
import
BitNotSet
from
ISO8583.ISO8583
import
BitNotSet
from
sqlalchemy
import
func
import
transaction
import
transaction
from
sismiop.services.base
import
get_id
from
sismiop.services.base
import
get_id
from
opensipkd.string
import
(
from
opensipkd.string
import
(
...
@@ -29,6 +35,7 @@ from .common import (
...
@@ -29,6 +35,7 @@ from .common import (
get_iso
,
get_iso
,
get_channel_info_by_iso
,
get_channel_info_by_iso
,
get_channel_name_by_row
,
get_channel_name_by_row
,
get_channel_name_by_dict
,
BaseApp
,
BaseApp
,
one_day
,
one_day
,
VaInvoice
,
VaInvoice
,
...
@@ -37,6 +44,40 @@ from .common import (
...
@@ -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
):
class
App
(
BaseApp
):
conf_name
=
'pbb payment last date'
conf_name
=
'pbb payment last date'
report_orm
=
Pbb
report_orm
=
Pbb
...
@@ -49,7 +90,6 @@ class App(BaseApp):
...
@@ -49,7 +90,6 @@ class App(BaseApp):
d
=
Doc
()
d
=
Doc
()
self
.
iso_inquiry_orm
=
d
.
iso_inquiry_model
self
.
iso_inquiry_orm
=
d
.
iso_inquiry_model
self
.
iso_payment_orm
=
d
.
iso_payment_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
.
base_q_iso
=
self
.
prod_session
.
query
(
self
.
iso_payment_orm
,
self
.
iso_inquiry_orm
)
.
filter
(
self
.
iso_payment_orm
,
self
.
iso_inquiry_orm
)
.
filter
(
self
.
iso_payment_orm
.
inquiry_id
==
self
.
iso_inquiry_orm
.
id
)
self
.
iso_payment_orm
.
inquiry_id
==
self
.
iso_inquiry_orm
.
id
)
...
@@ -65,9 +105,12 @@ class App(BaseApp):
...
@@ -65,9 +105,12 @@ class App(BaseApp):
self
.
h2h_session
=
self
.
prod_session
self
.
h2h_session
=
self
.
prod_session
self
.
base_q_log
=
self
.
h2h_session
.
query
(
Log
)
.
filter_by
(
self
.
base_q_log
=
self
.
h2h_session
.
query
(
Log
)
.
filter_by
(
mti
=
'0210'
,
bit_003
=
PAYMENT_CODE
,
bit_039
=
'00'
)
mti
=
'0210'
,
bit_003
=
PAYMENT_CODE
,
bit_039
=
'00'
)
if
'json_db_url'
in
self
.
conf
:
def
get_iso_reversal_orm
(
self
):
# Override
factory
=
self
.
get_factory
(
'json_db_url'
)
return
self
.
iso_reversal_orm
self
.
json_session
=
factory
()
self
.
base_q_json
=
self
.
json_session
.
query
(
JsonLog
)
else
:
self
.
json_session
=
None
def
get_sppt
(
self
,
psppt
):
def
get_sppt
(
self
,
psppt
):
q
=
self
.
base_q_sppt
.
filter_by
(
q
=
self
.
base_q_sppt
.
filter_by
(
...
@@ -125,7 +168,11 @@ class App(BaseApp):
...
@@ -125,7 +168,11 @@ class App(BaseApp):
user_id
=
iso
.
getBit
(
107
)
user_id
=
iso
.
getBit
(
107
)
except
BitNotSet
:
except
BitNotSet
:
user_id
=
None
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
iso
.
get_ntb
(),
str
(
iso
.
get_bank_id
()),
user_id
,
row_inq
.
tgl
def
get_iso_v2
(
self
):
def
get_iso_v2
(
self
):
...
@@ -139,12 +186,28 @@ class App(BaseApp):
...
@@ -139,12 +186,28 @@ class App(BaseApp):
return
channel_id
,
channel_nama
,
row
.
bit_011
,
\
return
channel_id
,
channel_nama
,
row
.
bit_011
,
\
row
.
bit_048
.
strip
(),
row
.
bit_032
,
row
.
bit_107
row
.
bit_048
.
strip
(),
row
.
bit_032
,
row
.
bit_107
def
create_data
(
self
,
psppt
):
# Override
def
get_json
(
self
,
psppt
):
self
.
invoice_id
=
get_id
(
psppt
)
if
not
self
.
json_session
:
sppt
=
self
.
get_sppt
(
psppt
)
return
if
not
sppt
:
q
=
self
.
base_q_json
.
filter_by
(
msg
=
f
'Invoice ID {self.invoice_id} tidak ada di tabel sppt'
propinsi
=
psppt
.
kd_propinsi
,
raise
InvalidSource
(
msg
)
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
()
source
=
self
.
get_iso_v2
()
tgl_inquiry
=
user_id
=
stan
=
ntb
=
bank_id
=
None
tgl_inquiry
=
user_id
=
stan
=
ntb
=
bank_id
=
None
if
source
:
if
source
:
...
@@ -155,27 +218,42 @@ class App(BaseApp):
...
@@ -155,27 +218,42 @@ class App(BaseApp):
channel_kode
,
channel_nama
,
stan
,
ntb
,
bank_id
,
user_id
,
\
channel_kode
,
channel_nama
,
stan
,
ntb
,
bank_id
,
user_id
,
\
tgl_inquiry
=
source
tgl_inquiry
=
source
else
:
else
:
source
=
self
.
get_json
(
psppt
)
if
source
:
channel_kode
,
channel_nama
,
stan
,
ntb
,
bank_id
=
source
else
:
channel_kode
=
'0000'
channel_kode
=
'0000'
if
psppt
.
nip_rekam_byr_sppt
.
strip
()
==
self
.
nip_pospbb
:
if
psppt
.
nip_rekam_byr_sppt
.
strip
()
==
self
.
nip_pospbb
:
channel_nama
=
'POSPBB'
channel_nama
=
'POSPBB'
else
:
else
:
tgl
=
psppt
.
tgl_rekam_byr_sppt
.
date
()
tgl
=
psppt
.
tgl_rekam_byr_sppt
.
date
()
channel_nama
=
self
.
get_va_channel
(
tgl
)
or
'MANUAL'
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
discount
=
hasattr
(
psppt
,
'discount'
)
and
psppt
.
discount
or
None
tgl
=
to_date
(
psppt
.
tgl_pembayaran_sppt
)
return
dict
(
return
dict
(
kd_propinsi
=
psppt
.
kd_propinsi
,
kd_dati2
=
psppt
.
kd_dati2
,
kd_propinsi
=
psppt
.
kd_propinsi
,
kd_dati2
=
psppt
.
kd_dati2
,
kd_kecamatan
=
psppt
.
kd_kecamatan
,
kd_kelurahan
=
psppt
.
kd_kelurahan
,
kd_kecamatan
=
psppt
.
kd_kecamatan
,
kd_kelurahan
=
psppt
.
kd_kelurahan
,
kd_blok
=
psppt
.
kd_blok
,
no_urut
=
psppt
.
no_urut
,
kd_blok
=
psppt
.
kd_blok
,
no_urut
=
psppt
.
no_urut
,
kd_jns_op
=
psppt
.
kd_jns_op
,
thn_pajak_sppt
=
psppt
.
thn_pajak_sppt
,
kd_jns_op
=
psppt
.
kd_jns_op
,
thn_pajak_sppt
=
psppt
.
thn_pajak_sppt
,
pembayaran_sppt_ke
=
psppt
.
pembayaran_sppt_ke
,
pembayaran_sppt_ke
=
psppt
.
pembayaran_sppt_ke
,
stan
=
stan
,
ntb
=
ntb
,
stan
=
stan
,
ntb
=
ntb
,
jml_sppt_yg_dibayar
=
psppt
.
jml_sppt_yg_dibayar
,
jml_sppt_yg_dibayar
=
psppt
.
jml_sppt_yg_dibayar
,
denda_sppt
=
psppt
.
denda_sppt
,
discount
=
discount
,
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
,
tgl_rekam_byr_sppt
=
psppt
.
tgl_rekam_byr_sppt
,
nm_wp_sppt
=
sppt
.
nm_wp_sppt
,
channel_kode
=
channel_kode
,
nm_wp_sppt
=
sppt
.
nm_wp_sppt
,
channel_kode
=
channel_kode
,
channel_nama
=
channel_nama
,
bank_id
=
bank_id
,
user_id
=
user_id
,
channel_nama
=
channel_nama
,
bank_id
=
bank_id
,
user_id
=
user_id
,
pbb_yg_harus_dibayar_sppt
=
sppt
.
pbb_yg_harus_dibayar_sppt
,
pbb_yg_harus_dibayar_sppt
=
sppt
.
pbb_yg_harus_dibayar_sppt
)
tgl_inquiry
=
tgl_inquiry
)
def
get_report
(
self
,
psppt
):
# Override
def
get_report
(
self
,
psppt
):
# Override
q
=
self
.
rpt_session
.
query
(
Pbb
)
.
filter_by
(
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