webr.py 3.4 KB
import sys
import transaction
from opensipkd.waktu import dmyhms
from opensipkd.webr.models.default import (
    Payment,
    Invoice,
    )
from opensipkd.webr.services.base import get_db_session
from opensipkd.iso8583.bjb.webr.structure import PAYMENT_CODE
from opensipkd.iso8583.bjb.webr.models import LogMixin
from iso8583_web.models.meta import Base as BaseConf
from ..models import (
    Base,
    Webr,
    )
from .common import (
    App2 as BaseApp,
    init_db as base_init_db,
    )


ERR_NOT_FOUND = 'Tgl {tgl_bayar} nomor bayar {invoice_id} tidak ada'


class Log(Base, LogMixin):
    __table_args__ = dict(schema='webr')


class App(BaseApp):
    field_invoice_id = 'bit_061'
    field_ntb = 'bit_048'
    report_orm = Webr
    log_orm = Log

    def __init__(self, argv):
        super().__init__(argv)
        if not self.pid:
            return
        self.base_q_iso_resp = self.prod_session.query(Log).filter_by(
                mti='0210', bit_003=PAYMENT_CODE)
        self.base_q_pay = self.prod_session.query(Payment, Invoice).filter(
                Payment.ar_invoice_id == Invoice.id)

    def get_db_session(self):  # Override
        return get_db_session()

    def get_pay(self, d):
        q_pay = self.base_q_pay.filter(Invoice.kode == d['nomor_bayar'])
        return q_pay.order_by(Payment.id.desc()).first()

    def is_iso_resp_ok(self, iso_req):
        q = self.base_q_iso_resp.filter_by(
                bit_011=iso_req.bit_011, bit_048=iso_req.bit_048)
        iso_resp = q.order_by(Log.id.desc()).first()
        return iso_resp and iso_resp.bit_039 == '00'

    def run_payment(self):
        last = self.get_last_id('webr payment last id')
        q_iso_req = self.prod_session.query(Log).filter_by(
                    mti='0200', bit_003=PAYMENT_CODE).filter(
                    Log.id > last.as_int())
        for iso_req in q_iso_req.order_by(Log.id):
            if self.get_report(iso_req):
                continue
            if not self.is_iso_resp_ok(iso_req):
                continue
            d = self.get_keys(iso_req)
            tgl_bayar = iso_req.created.date()
            pay = self.get_pay(d)
            if not pay:
                msg = ERR_NOT_FOUND.format(
                        tgl_bayar=tgl_bayar, invoice_id=d['nomor_bayar'])
                self.log.error(msg)
                continue
            pay, inv = pay
            s_tgl = dmyhms(iso_req.created)
            self.log.info(
                f'Tgl bayar {s_tgl}, Nomor bayar {d["nomor_bayar"]}, '
                f'STAN {d["stan"]}, NTB {d["ntb"]}, Channel {d["channel"]}')
            rpt = Webr(
                    stan=d['stan'], ntb=d['ntb'], tgl=tgl_bayar,
                    jam=iso_req.created.time(), payment_id=pay.id,
                    nomor_bayar=d['nomor_bayar'],
                    nama_wp=inv.subjek_nama, pokok=inv.jumlah-inv.bunga,
                    denda=pay.bunga, jml_bayar=pay.bayar,
                    channel_id=iso_req.bit_018.strip(),
                    channel_name=d['channel'])
            last.nilai = str(iso_req.id)
            with transaction.manager:
                self.rpt_session.add(rpt)
                self.rpt_session.add(last)

    def run_reversal(self):  # Override
        super().run_reversal('webr reversal last id')


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)