webr.py 3.27 KB
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)