cartenz_api.py
4.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
from datetime import (
date,
datetime,
timedelta,
)
from time import time
import requests
from logging import getLogger
from opensipkd.string import FixLength
from sismiop.services.base import NOP
import transaction
from ..models import Pbb
from ..common import BaseApp
from ..tools import (
plain_values,
update,
)
one_day = timedelta(1)
def create_data(d):
nop = FixLength(NOP)
nop.set_raw(d['nop'])
tgl = ' '.join([d['tanggal_tx'], d['jam_tx']])
tgl = datetime.strptime(tgl, '%Y-%m-%d %H:%M:%S')
if d['channel_pembayaran'].find('BANK JABAR') > -1:
bank_id = '110'
else:
bank_id = None
return dict(
kd_propinsi=nop['Propinsi'], kd_dati2=nop['Kabupaten'],
kd_kecamatan=nop['Kecamatan'], kd_kelurahan=nop['Kelurahan'],
kd_blok=nop['Blok'], no_urut=nop['Urut'],
kd_jns_op=nop['Jenis'], thn_pajak_sppt=d['tahun'],
pembayaran_sppt_ke=1,
jml_sppt_yg_dibayar=int(d['total']), denda_sppt=int(d['denda']),
discount=int(d['potongan']), tgl_pembayaran_sppt=tgl.date(),
tgl_rekam_byr_sppt=tgl, nm_wp_sppt=d['nama_wp'], channel_kode='0000',
channel_nama='LAINNYA', bank_id=bank_id,
pbb_yg_harus_dibayar_sppt=int(d['pokok_pajak']))
class App(BaseApp):
report_orm = Pbb
conf_name = 'pbb api last date'
def get_report(self, d):
session = self.get_session_for_save()
q = session.query(self.report_orm).filter_by(
kd_propinsi=d['kd_propinsi'], kd_dati2=d['kd_dati2'],
kd_kecamatan=d['kd_kecamatan'], kd_kelurahan=d['kd_kelurahan'],
kd_blok=d['kd_blok'], no_urut=d['no_urut'],
kd_jns_op=d['kd_jns_op'], thn_pajak_sppt=d['thn_pajak_sppt'],
pembayaran_sppt_ke=d['pembayaran_sppt_ke'])
return q.first()
def do_sync(self, tgl):
d = dict(tanggal=tgl.strftime('%Y-%m-%d'))
r = requests.post(self.conf['url'], json=d)
if r.status_code != 200:
print('HTTP Error', r.status_code)
print(r.text)
return
log = getLogger('do_sync()')
d = r.json()
no = 0
self.count = len(d['transaksi'])
self.last_pay = None
for trx in d['transaksi']:
self.invoice_id = ''.join([trx['nop'], trx['tahun']])
data = create_data(trx)
no += 1
source = create_data(trx)
d = plain_values(source)
rpt = self.get_report(data)
if rpt:
target = rpt.to_dict()
target_update, log_msg = update(source, target)
if target_update:
s = ', '.join(log_msg)
msg = f'UPDATE {d} change {s}'
rpt.from_dict(target_update)
else:
msg = f'ALREADY SAME {d}'
rpt = None
if self.count == 1 and self.last: # Hemat log
print(msg)
print('Log yang sama, abaikan.')
return
else:
msg = f'INSERT {d}'
rpt = self.report_orm(**source)
e = self.get_estimate(no)
prefix = self.get_prefix_log()
log.info(f'#{no}/{self.count} {prefix} {msg}, estimate {e}')
if rpt:
session = self.get_session_for_save()
with transaction.manager:
session.add(rpt)
self.last_pay = source
return self.count
def get_last_time(self): # Override
return self.last_pay['tgl_pembayaran_sppt'].strftime('%d-%m-%Y')
def prepare_query_filter(self):
if 'tgl_awal' in self.conf:
self.last = None
self.tgl_awal = self.conf['tgl_awal']
else:
self.last = self.get_last_id(self.conf_name)
self.tgl_awal = self.last.as_date()
if 'tgl_akhir' in self.conf:
self.tgl_akhir = self.conf['tgl_akhir']
else:
self.tgl_akhir = date.today()
def run(self): # dipanggil sync.py
self.prepare_query_filter()
tgl = self.tgl_awal
while True:
tgl += one_day
self.start_time = time()
self.do_sync(tgl)
if self.last_pay and self.last:
self.update_last()
if tgl > self.tgl_akhir:
break