webr.py
3.27 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
import sys
from datetime import (
date,
datetime,
)
from sqlalchemy import func
from sqlalchemy.exc import ProgrammingError
import transaction
from opensipkd.waktu import dmyhms
from opensipkd.webr.models.default import (
Payment,
Invoice,
)
from iso8583_web.models.meta import Base as BaseConf
from opensipkd.iso8583.bjb.webr.structure import PAYMENT_CODE
from opensipkd.iso8583.bjb.webr.models import (
LogMixin,
Log,
)
from ..models import (
Base,
Webr,
)
from .common import (
BaseApp,
init_db as base_init_db,
BIT_18_NAMES,
get_channel_name_by_row,
one_day,
)
class AlternativeLog(Base, LogMixin):
__table_args__ = dict(schema='webr')
class App(BaseApp):
conf_name = 'webr payment last date'
report_orm = Webr
product_code = '30'
def __init__(self, argv):
super().__init__(argv)
if not self.pid:
return
self.base_q_pay = self.prod_session.query(Payment)
self.base_q_inv = self.prod_session.query(Invoice)
self.base_q_iso = self.prod_session.query(Log)
try:
self.base_q_iso.first()
self.IsoLog = Log
except ProgrammingError:
self.prod_session.rollback()
self.base_q_iso = self.prod_session.query(AlternativeLog)
self.IsoLog = AlternativeLog
self.base_q_iso = self.base_q_iso.filter_by(
mti='0210', bit_003=PAYMENT_CODE, bit_039='00')
def get_iso(self, inv):
q = self.base_q_iso.filter(func.trim(self.IsoLog.bit_061) == inv.kode)
return q.first()
def create_data(self, pay): # Override
q = self.base_q_inv.filter_by(id=pay.ar_invoice_id)
inv = q.first()
self.invoice_id = inv.kode
iso = self.get_iso(pay)
if iso:
channel_id = iso.bit_018.strip()
channel_name = get_channel_name_by_row(iso)
elif pay.bank_id:
channel_id = str(pay.channel_id)
channel_name = BIT_18_NAMES[channel_id]
else:
channel_id = '0000'
channel_name = self.get_va_channel(pay.created.date()) or 'MANUAL'
stan = iso and iso.bit_011 or None
ntb = pay.ntb and pay.ntb.strip() or None
return dict(
id=pay.id, stan=stan, ntb=ntb, tgl=pay.created.date(),
jam=pay.created.time(), nomor_bayar=self.invoice_id,
nama_wp=inv.subjek_nama, pokok=inv.jumlah-inv.bunga,
denda=pay.bunga, jml_bayar=pay.bayar, channel_id=channel_id,
channel_name=channel_name)
def get_last_time(self): # Override
return dmyhms(self.last_pay.created)
def get_filter_query(self, q):
return q.filter(
Payment.created >= self.tgl_awal,
Payment.created < self.tgl_akhir + one_day)
def get_count(self): # Override
q = self.prod_session.query(func.count())
q = self.get_filter_query(q)
return q.scalar()
def get_payment_query(self): # Override
q = self.get_filter_query(self.base_q_pay)
return q.order_by(Payment.created)
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)