webr0.py 2.32 KB
import sys
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.models import Log
from ..models import (
    Base,
    Webr,
    )
from .common import (
    BaseApp,
    init_db as base_init_db,
    BIT_18_NAMES,
    )


class App(BaseApp):
    report_orm = Webr

    def __init__(self, argv):
        super().__init__(argv)
        if not self.pid:
            return
        self.base_q_pay = self.prod_session.query(Payment, Invoice).filter(
                Payment.ar_invoice_id == Invoice.id)

    def tgl_awal_log_iso(self):
        q = self.prod_session.query(Log).order_by(Log.id)
        row = q.first()
        return row.created.date()

    def run_payment(self):
        tgl = self.tgl_awal_log_iso()
        last = self.get_last_id('webr0 payment last id')
        q_pay = self.base_q_pay.filter(
                    Payment.created < tgl, Payment.id > last.as_int())
        rpt_id = 0
        for pay, inv in q_pay.order_by(Payment.id):
            rpt_id += 1
            if not pay.channel_id:  # Biasanya hasil test
                continue
            nomor_bayar = inv.kode
            tgl_bayar = pay.created.date()
            s_tgl = dmyhms(pay.created)
            stan = pay.created.strftime('%H%M%S')
            channel_id = str(pay.channel_id)
            channel = BIT_18_NAMES[channel_id]
            self.log.info(
                f'Tgl bayar {s_tgl}, Nomor bayar {nomor_bayar}, '
                f'STAN {stan}, NTB {pay.ntb}, Channel {channel}')
            rpt = Webr(
                    id=rpt_id, stan=stan, ntb=pay.ntb, tgl=tgl_bayar,
                    jam=pay.created.time(), payment_id=pay.id,
                    nomor_bayar=nomor_bayar, nama_wp=inv.subjek_nama,
                    pokok=inv.jumlah-inv.bunga, denda=pay.bunga,
                    jml_bayar=pay.bayar, channel_id=channel_id,
                    channel_name=channel)
            last.nilai = str(pay.id)
            with transaction.manager:
                self.rpt_session.add(rpt)
                self.rpt_session.add(last)


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)